用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

发布时间:2024-11-10

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

实验的题目和要求

一、所属课程名称:

最优化方法

二、实验日期:

2010年5月10日~2010年5月15日

三、实验目的

掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。

二、实验要求

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例。

四、实验原理

最速下降法是以负梯度方向最为下降方向的极小化算法,相邻两次的搜索方向是互相直交的。牛顿法是利用目标函数f(x)在迭代点xk处的Taylor展开式作为模型函数,并利用这个二次模型函数的极

小点序列去逼近目标函数的极小点。共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向dk仅仅是负梯度方向 gk与上一次接待的搜索方向dk 1的组合。

五.运行及结果如下:

最速下降法:

题目:f=(x-2)^2+(y-4)^2

M文件:

function [R,n]=steel(x0,y0,eps)

syms x;

syms y;

f=(x-2)^2+(y-4)^2;

v=[x,y];

j=jacobian(f,v);

T=[subs(j(1),x,x0),subs(j(2),y,y0)];

temp=sqrt((T(1))^2+(T(2))^2);

x1=x0;y1=y0;

n=0;

syms kk;

while (temp>eps)

d=-T;

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

f1=x1+kk*d(1);f2=y1+kk*d(2);

fT=[subs(j(1),x,f1),subs(j(2),y,f2)];

fun=sqrt((fT(1))^2+(fT(2))^2);

Mini=Gold(fun,0,1,0.00001);

x0=x1+Mini*d(1);y0=y1+Mini*d(2);

T=[subs(j(1),x,x0),subs(j(2),y,y0)];

temp=sqrt((T(1))^2+(T(2))^2);

x1=x0;y1=y0;

n=n+1;

end

R=[x0,y0] 调用黄金分割法:

M文件:

function Mini=Gold(f,a0,b0,eps)

syms x;format long;

syms kk;

u=a0+0.382*(b0-a0);

v=a0+0.618*(b0-a0);

k=0;

a=a0;b=b0;

array(k+1,1)=a;array(k+1,2)=b;

while((b-a)/(b0-a0)>=eps)

Fu=subs(f,kk,u);

Fv=subs(f,kk,v);

if(Fu<=Fv)

b=v;

v=u;

u=a+0.382*(b-a);

k=k+1;

elseif(Fu>Fv)

a=u;

u=v;

v=a+0.618*(b-a);

k=k+1;

end

array(k+1,1)=a;array(k+1,2)=b;

end

Mini=(a+b)/2; 输入:

[R,n]=steel(0,1,0.0001)

R = 1.99999413667642 3.99999120501463

R = 1.99999413667642 3.99999120501463 n = 1

牛顿法:

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

题目:f=(x-2)^2+(y-4)^2

M文件:

syms x1 x2;

f=(x1-2)^2+(x2-4)^2;

v=[x1,x2];

df=jacobian(f,v);

df=df.';

G=jacobian(df,v);

epson=1e-12;x0=[0,0]';g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});k=0;mul_count=0;sum_count=0;

mul_count=mul_count+12;sum_count=sum_count+6;

while(norm(g1)>epson)

p=-G1\g1;

x0=x0+p;

g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});

G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});

k=k+1;

mul_count=mul_count+16;sum_count=sum_count+11;

end;

k

x0

mul_count

sum_count

结果::k = 1

x0 =

2

4

mul_count = 28

sum_count = 17

共轭梯度法:

题目:f=(x-2)^2+(y-4)^2

M文件:

function f=conjugate_grad_2d(x0,t)

x=x0;

syms xi yi a

f=(xi-2)^2+(yi-4)^2;

fx=diff(f,xi);

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

fy=diff(f,yi);

fx=subs(fx,{xi,yi},x0);

fy=subs(fy,{xi,yi},x0);

fi=[fx,fy];

count=0;

while double(sqrt(fx^2+fy^2))>t

s=-fi;

if count<=0

s=-fi;

else

s=s1;

end

x=x+a*s;

f=subs(f,{xi,yi},x);

f1=diff(f);

f1=solve(f1);

if f1~=0

ai=double(f1);

else

break

x,f=subs(f,{xi,yi},x),count

end

x=subs(x,a,ai);

f=xi-xi^2+2*xi*yi+yi^2;

fxi=diff(f,xi);

fyi=diff(f,yi);

fxi=subs(fxi,{xi,yi},x);

fyi=subs(fyi,{xi,yi},x);

fii=[fxi,fyi];

d=(fxi^2+fyi^2)/(fx^2+fy^2);

s1=-fii+d*s;

count=count+1;

fx=fxi;

fy=fyi;

end

x,f=subs(f,{xi,yi},x),count

输入:conjugate_grad_2d([0,0],0.0001)

结果:

x = 0.24998825499785 -0.24999998741273

f = 0.12499999986176

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

count = 10

ans = 0.12499999986176

diff函数用于对符号表达式求导数。该函数的一般调用格式为:

diff(s):没有指定变量和导数阶数,则系统按findsym函数指示的默认变量对符号表达式s求一阶导数。

diff(s,'v'):以v为自变量,对符号表达式s求一阶导数。

diff(s,n):按findsym函数指示的默认变量对符号表达式s求n阶导数,n为正整数。 diff(s,'v',n):以v为自变量,对符号表达式s求n阶导数。

六、结论如下:

最速下降法越接近极小值,步长越小,前进越慢。牛顿法要求二阶导数,计算量很大。共轭梯度法是介于最速下降和牛顿法之间的算法,克服了最速下降法的收敛速度慢的缺点,又避免了牛顿法的大计算量。

用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219