Get清风运筹学实验报告FR共轭梯度法Wolfe简约梯度法.docx
《Get清风运筹学实验报告FR共轭梯度法Wolfe简约梯度法.docx》由会员分享,可在线阅读,更多相关《Get清风运筹学实验报告FR共轭梯度法Wolfe简约梯度法.docx(10页珍藏版)》请在冰豆网上搜索。
![Get清风运筹学实验报告FR共轭梯度法Wolfe简约梯度法.docx](https://file1.bdocx.com/fileroot1/2023-1/24/9a8d4ef3-57d6-40c4-9e3b-59a37885c29e/9a8d4ef3-57d6-40c4-9e3b-59a37885c29e1.gif)
Get清风运筹学实验报告FR共轭梯度法Wolfe简约梯度法
运筹学实验报告(F-R共轭梯度法、Wolfe简约梯度法)
运筹学课程实验报告
姓名:
********
学号:
********
班级:
********
日期:
2021/12/17
一、实验目的:
1、掌握求解无约束最优化问题的F-R共轭梯度法,以及约束最优化问题Wolfe简约梯度法。
2、学会用MATLAB编程求解问题,并对以上方法的计算过程和结果进行分析。
二、实验原理与步骤:
1、F-R共轭梯度法
根本步骤是在点
处选取搜索方向
使其与前一次的搜索方向
关于
共轭,即
然后从点
出发,沿方向
求得
的极小值点
即
如此下去,得到序列{
}。
不难求得
的解为
注意到
的选取不唯一,我们可取
由共轭的定义
可得:
共轭梯度法的计算过程如下:
第一步:
取初始向量
计算
第
步:
计算
2、Wolfe简约梯度法
Wolfe根本计算步骤:
第一步:
取初始可行点
给定终止误差
,令k:
=0;
第二步:
设
是
的m个最大分量的下标集,对矩阵A进行相应分解
;
第三步:
计算
然后计算简约梯度
;
第四步:
构造可行下降方向
.假设
,停止迭代,输出
。
否那么进行第五步。
第五步:
进行有效一维搜索,求解
得到最优解
.令
k:
=k+1,转入第二步。
三、实验内容:
1、〔运筹学P153页第20题〕用F-R法求解
选取初始点
.
2、〔运筹学P154页第25题〕用Wolfe法求解以下问题:
选取初始可行点
.
四、问题求解:
问题1求解:
〔F-R法〕
程序代码如下:
〔1〕主函数
symsx1x2r;
f=(1-x1)^2+2*(x2-x1^2)^2;
x=[x1,x2];
df=jacobian(f,x);
df=df.';
error=0.000001;
x0=[0,0]';
g1=subs(df,x,x0);
k=0;
while(norm(g1)>error)
ifk==0
d=-g1;
else
bta=g1'*g1/(g0'*g0);
d=-g1+bta*d0;
end
y=subs(f,x,x0+r*d);
result=jintuifa(y,r);
result2=golden(y,r,result);
step=result2;
x0=x0+step*d;
g0=g1;g1=subs(df,x,x0);
d0=d;k=k+1;
end;
k
x0
〔2〕子函数
进退法确定一维搜索区间:
functionresult=jintuifa(y,r)
t0=0;step=0.0125;
t1=t0+step;
ft0=subs(y,{r},{t0});
ft1=subs(y,{r},{t1});
if(ft1<=ft0)
step=2*step;
t2=t1+step;
ft2=subs(y,{r},{t2});
while(ft1>ft2)
t1=t2;step=2*step;
t2=t1+step;
ft1=subs(y,{r},{t1});
ft2=subs(y,{r},{t2});
end
else
step=step/2;t2=t1;t1=t2-step;
ft1=subs(y,{r},{t1});
while(ft1>ft0)
step=step/2;t2=t1;t1=t2-step;
ft1=subs(y,{r},{t1});
end
end
result=[t2];
黄金分割法进行一维搜索:
functionresult=golden(y,r,m)
a=0;
b=m;
e=1e-5;
a1=a+0.382*(b-a);
f1=subs(y,{r},{a1});
a2=a+0.618*(b-a);
f2=subs(y,{r},{a2});
whileabs(b-a)>=e
iff1b=a2;a2=a1;
f2=f1;a1=a+0.382*(b-a);
f1=subs(y,{r},{a1});
else
a=a1;a1=a2;
f1=f2;a2=a+0.618*(b-a);
f2=subs(y,{r},{a2});
end
end;
answer=0.5*(a+b);
result=[answer];
运行结果如下:
由上图知极值点为
极小值=
(
对应的理论极小值)。
问题2求解:
〔Wolfe法〕
程序代码如下:
error=10^-6;
x0=[0,0];
symsx1x2
f=2*x1^2+2*x2^2-2*x1*x2-4*x1-6*x2;
AB=[1,1,1,0;1,5,0,1];
B=[1,0;0,1];
N=[1,1;1,5];
[a,b]=size(x0);
initial_gradient=gradient_my(f,x0,b);
norm=0;
norm0=0;
symst;
A=[];
rN=[initial_gradient
(1),initial_gradient
(2)]
pN=-rN;
pB=-[pN
(1)+pN
(2),-pN
(1)-5*pN
(2)];
search_direction=[pNpB]
fori=1:
4
norm0=norm0+(search_direction(i))^2
end
tmax=5/34;
x00=[0,0,2,-5];
x=x00+t*search_direction;
xx=[x
(1),x
(2)];
f_step=subs(f,findsym(f),xx);
F=diff(f_step,t);
solve(F,t)
x_1=x00+tmax*search_direction
norm=norm0;
k=1;
HSZ=[];
while(norm>error&&k<3)
x_11=[x_1
(1),x_1
(2)]
gradient=gradient_my(f,x_11,b)
rN=-[1.25*gradient
(1),0.25*gradient
(2)]
pN=-[rN
(1)*x_1(3),rN
(2)*x_1(4)]
pB=-[1.25*pN
(1),0.25*pN
(2)];
new_direction=[pBpN];
norm=0;
TT=[];
tmax=1;
fori=1:
4
norm=norm+(new_direction(i))^2
end
forj=1:
4
if(new_direction(j)<0)
T(j)=new_direction(j)
else
T(j)=0;
end
if(T(j)<0)
TT=abs([TT,(x_1(j)/T(j))])
end
j=j+1;
end
n=size(TT);
foruk=1:
n
if(tmax>TT(uk))
tmax=TT(uk)
n=n+1;
end
end
x=x_1+t*new_direction;
xx=[x
(1),x
(2)];
f_step=subs(f,findsym(f),xx);
F=diff(f_step,t);
solve(F,t);
t0=tmax;
x_2=x_1+0.18*new_direction
A=[A;x_2];
norm0=norm;
search_direction=new_direction
x_1=x_2;
xx2=[x_2
(1),x_2
(1)];
Y=subs(f,findsym(f),xx2);
HSZ=[HSZ;Y]
k=k+1;
end
k
x_2
norm
程序运行结果如下
初始点(0,0,2,5)earch_direction=46-1034
tmax=
如果不交还B矩阵与A矩阵那么运行结果如下
x_1=(0.62517080770.0246)search_direction=
很显然X4已经无法再取有效值,,故须交还B与A
x_1=(0.58820.88240.52940)search_direction=1.82220-2.2578
tmax=
x_2=1.09620.88240.12300
由以上结果显示:
而理论计算值为
有一定的计算误差。
五、实验体会:
通过这次运筹学课内实验,我对无约束优化问题及约束优化问题的思想和局部算法的求解过程有了进一步了解与掌握。
这次实验使我对用进退法确定一维搜索区间,如何进行一维搜索,对求解无约束优化问题的F-R共轭梯度法和约束最优化问题的Wolfe简约梯度法的根本思想和算法有了更深理解,对课内的所学知识进一步消化。
在本次实验过程中,发现真正用Matlab求解实际问题的能力还很欠缺,对Matlab的熟练程度还不够!
求解过程出现了许多错误,通过网上查找资料和利用图书馆图书资源得到解决;但是仍有局部问题还没太明白。
希望自己以后加强用Matlab解决实际问题的能力,合理将运筹学所学理论知识应用到实际生活中!