运筹与优化实验报告Word下载.docx
《运筹与优化实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《运筹与优化实验报告Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
=k+1,返回STEP2
(四)程序源代码
建立goldencut.m函数
functiong=goldencut()
t1=cputime
f=@(x)x^2-x+2
a=-1;
b=3;
e=0.000001;
h=b-a;
n=0;
whileh>
e
u=a+0.382*(b-a);
v=a+0.618*(b-a);
iff(u)<
f(v)
b=v;
elsea=u;
end
h=b-a;
n=n+1;
end
a,b,n
t2=cputime-t1
保存并运行
>
goldencut
t1=
227.0625
f=
@(x)x^2-x+2
a=
0.5000
b=
n=
32
t2=
0.0313
(五)实验结果及分析
由MATLAB编程结果可知,利用黄金分割法求解的迭代步数为32步,执行时间为0.0313s,极小区间为
,代表区间端点a无限接近于b。
编程结果与手算结果一致。
(六)实验小结
通过这次实验,我更加深刻地理解了一维搜索算法中黄金分割法的算法思想,并学会使用MATLAB编程解决相关问题。
在编程实现时查阅的相关资料,也让我受益匪浅。
二、共轭梯度法
熟练掌握共轭梯度法的算法思想,并能够运用MATLAB编程解决相关问题。
共轭梯度法求解:
1、
2、
(三)算法框架
1、CG算法
n元正定二次函数
,给定任意初始点
,计算
,置k:
=0
判断
,若成立,则终止,输出。
否则转STEP3
计算下一次的搜索方向
,其中
STEP4:
=k+1,转STEP1进行下一次迭代
2、应用于非二次函数的共轭梯度法(二次函数CG法的推广应用)
关键:
将公式中含有的二次函数的Hesse阵Q的信息消去
对
:
改用直接的e.1.s,求得步长因子
1、二次函数的共轭梯度法
建立conjugategradient.m函数
functions=conjugategradient()
symsfx1x2
f=x1^2-x1*x2+x2^2+2*x1-4*x2;
x=[-2;
4];
a=[2-1;
-12];
g1=diff(f,x1);
g2=diff(f,x2);
g=[g1;
g2];
g11=subs(g1,{x1,x2},{x
(1)x
(2)});
g22=subs(g2,{x1,x2},{x
(1)x
(2)});
g=[g11;
g22]
d=-g;
d11=subs(d
(1),{x1,x2},{x
(1)x
(2)});
d22=subs(d
(2),{x1,x2},{x
(1)x
(2)});
d=[d11;
d22]
af=(-g'
*d)/(d'
*a*d)
x=x+af*d
e=0.1;
%共轭梯度
fori=1:
2
ifg==0
break
else
b=(g'
*a*d)/(d'
d=-g+b*d;
d11=subs(d
(1),{x1,x2},{x
(1)x
(2)});
d22=subs(d
(2),{x1,x2},{x
(1)x
(2)});
d=[d11;
af=(-g'
x=x+af*d
g11=subs(g1,{x1,x2},{x
(1)x
(2)});
g22=subs(g2,{x1,x2},{x
(1)x
(2)});
g=[g11;
conjugategradient
g=
-6
6
d=
af=
0.3333
x=
0
2
2、非二次函数的共轭梯度法
建立promotecg.m函数
functionx=promotecg(A,B,e,x0)
p=-(A*x0+B);
while(sqrt((A*x0+B)'
*(A*x0+B))>
=e)
l=(-1)*((A*x0+B)'
*p)/(p'
*A*p);
x=x0+l*p;
p1=-(A*x+B)+((A*x+B)'
*(A*x+B))/((A*x0+B)'
*(A*x0+B))*p;
x0=x;
p=p1;
保存
命令行输入:
A=[20;
04]
A=
20
04
B=[0;
0]
B=
0
e=0.0001;
x0=[1;
x0=
1
[x]=promotecg(A,B,e,x0)
由MATLAB编程结果可知,第一题最优解x为
其中g为梯度方向,d为搜索方向,af为步长,x为所求极小点,而最后的g为此x对应的梯度(即终止条件)。
第二题最优解x为
编程结果均与手算结果一致。
通过这次实验,我更加深刻地理解了共轭梯度法的算法思想,并学会使用MATLAB编程解决相关问题。
三、内点法与外点法
熟练掌握内点法和外点法的算法思想,并能够运用MATLAB编程解决相关问题。
分别用内点法与外点法(外惩罚函数法)求解下列非线性规划:
1、内点法:
已知
,
取
取一初始容许点
,初始惩罚因子
,惩罚因子的缩小系数
置
STEP1:
以
为初始点,求解
得极小点
;
STEP2:
stop;
STEP3:
置
,转STEP2
2、外点法:
给定初始点
,放大系数
,置
为初始点求解
,stop
,转STEP1
1、内点法
建立inpoint.m函数
functiont=inpoint(a,b)
symsx1x2;
u=0.01;
x0=[ab];
f=x1+x2+u*(1/(-x1^2+x2)+1/(x1));
i=0;
while(i<
10)
f=x1+x2+u*(1/(-x1^2+x2)+1/(x1));
df=[diff(f,x1);
diff(f,x2)];
[c1,c2]=solve(df
(1),df
(2));
x0=real(double([c1c2]));
i=i+1;
u=0.1*u;
x0
min=vpa(subs(f,[x1x2],[x0
(1),x0
(2)]))
inpoint(2,2)
-0.0000-0.0000
0.0000-0.0000
0.00000.0000
-0.00000.0000
-0.50000.2500
min=
0.000000000010000158114683031141172930750089
2、外点法
functions=expoint(a,b)
symsx1x2;
M=5;
a1=x1^2-x2;
a2=-x1;
f=x1+x2;
df=[diff(f,x1);
k=0;
while(k<
100)
ifsubs(a1,[x1x2],x0)>
0&
&
subs(a2,x1,x0
(1))>
f=x1+x2+M*((x1^2-x2)^2+(-x1)^2);
ifsubs(a1,[x1x2],x0)<
=0&
subs(a2,x1,x0
(1))>
f=x1+x2+M*((-x1)^2);
if(subs(a1,[x1x2],x0)<
=0)&
(subs(a2,x1,x0
(1))<
=0)
f=x1+x2;
if(subs(a1,[x1x2],x0)>
0)&
f=x1+x2+M*((x1^2-x2)^2);
x0=[c1c2];
M=2*M;
k=k+1;
min=subs(f,[x1x2],x0)
expoint(2,2)
[-1/6338253001141147007483516026882,-10043362776618689222137263077137019955514624571398067857653761/63657374260452690195888927762833240983964862058949056884687924445640471833595849372629729280]
-633825*********7007483516026881/40173451106474756888549052308541741569057357138584787914588160
由MATLAB编程结果可知,使用内点法和外点法求解非线性规划问题,所得的结果是一致的,可行解均为
,且与手算结果一致。
通过这次实验,我更加深刻地理解了内点法和外点法的算法思想,并学会使用MATLAB编程解决相关问题。