运筹学实验报告(F-R共轭梯度法、Wolfe简约梯度法)

  • 格式:doc
  • 大小:250.00 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的:

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);