运筹学实验报告(F-R共轭梯度法、Wolfe简约梯度法)
- 格式:doc
- 大小:250.00 KB
- 文档页数:11
一、实验目的:
1、掌握求解无约束最优化问题的 F-R 共轭梯度法,以及约束最优化问题 Wolfe 简约梯度法。
2、学会用MATLAB 编程求解问题,并对以上方法的计算过程和结果进行分析。
二、实验原理与步骤: 1、F-R 共轭梯度法
基本步骤是在点)
(k X 处选取搜索方向)
(k d , 使其与前一次
的搜索方向)
1(-k d
关于A 共轭,即
(1)()(1),0k k k d d Ad --<>=
然后从点)(k X 出发,沿方向)(k d 求得)(X f 的极小值点)
1(+k X ,
即
)
(m in )()
()(0
)1(k d X f X f k k λλ+=>+
如此下去, 得到序列{)
(k X }。不难求得0,)1()
(>=<-k k Ad d
的解为
)()1()1()()()
()
1(,,k k k k k k k d Ad d d AX b X
X
><>-<+=--+
注意到)
(k d 的选取不唯一,我们可取
)
1(1)()()(--+-∇=k k k k d X f d β
由共轭的定义
0,)
1()(>=<-k k Ad d 可得: >
<>
<-
=----)1()1()1()(1,,k k k k k Ad d Ad r β
共轭梯度法的计算过程如下:
第一步:取初始向量)
0(X , 计算
⎪⎪
⎩
⎪
⎪
⎨⎧+=><><-
=-=-∇==(0)
0(0)(1))0()0()0()0(0(0)(0)(0)(0)d X X ,,X )X (r d λλAd d Ad r A b f
第1+k 步:计算
⎪⎪⎪⎪⎪⎩⎪
⎪⎪⎪⎪⎨⎧+=><><-
=+=><><-=-=-∇=+------(k )0(k )1)(k )()()
()()1(1(k ))()1()1()
1()(1(k )
(k )(k )d X X ,,r ,,X )X (r λλββk k k k k k k k k k k k k Ad d Ad r d d Ad d Ad
r A b f
2、Wolfe 简约梯度法
Wolfe 基本计算步骤: 第一步:取初始可行点 ,给定终止误差 ,
令k:=0;
第二步:设是的 m 个最大分量的下标集,
对矩阵A进行相应分解
第三步:计算,然后计算简约梯度;
第四步:构造可行下降方向. 若^_D_Dd。否则进行第五步。
第五步:进行有效一维搜索,求解,得到最优解. 令, k:=k+1, 转入第二步。
三、实验容:
1、(运筹学P153页第20题)用F-R法求解
选取初始点, .
2、(运筹学P154页第25题)用Wolfe法求解以下问题:选取初始可行点, .
四、问题求解:
问题1求解:(F-R法)
程序代码如下:
(1)主函数
syms x1 x2 r;
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)
if k==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)子函数
进退法确定一维搜索区间:function result=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];
黄金分割法进行一维搜索:function result=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});
while abs(b-a)>=e
if f1 b=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);