当前位置:文档之家› 用MATLAB实现最速下降法,牛顿法和共轭梯度法求解实例

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

实验的题目和要求
一、所属课程名称:
最优化方法
二、实验日期:
2010年5月10日~2010年5月15日
三、实验目的
掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。

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

四、实验原理
最速下降法是以负梯度方向最为下降方向的极小化算法,相邻两次的搜索方向是互相直交的。

牛顿法是利用目标函数)(x f 在迭代点k x 处的Taylor 展开式作为模型函数,并利用这个二次模型函数的极小
点序列去逼近目标函数的极小点。

共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次接待的搜索方向1-k d 的组合。

五.运行及结果如下:
最速下降法:
题目: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)
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
题目:f=(x-2)^2+(y-4)^2
M文件:
syms x1x2;
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);
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
count = 10
ans = 0.12499999986176
六、结论如下:
最速下降法越接近极小值,步长越小,前进越慢。

牛顿法要求二阶导数,计算量很大。

共轭梯度法是介于最速下降和牛顿法之间的算法,克服了最速下降法的收敛速度慢的缺点,又避免了牛顿法的大计算量。

数值分析最速下降法matlab源程序
Matlab源程序
clc;
clear;
syms x1 x2;
X=[x1,x2];
fx=X(1)^2+X(2)^2-4*X(1)-6*X(2)+17;
fxd1=[diff(fx,x1) diff(fx,x2)];
x=[2 3];
g=0;
e=0.0005;
a=1;
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);
g=0;
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
step=0;
while g>e
step=step+1;
dk=-fan;
%点x(k)处的搜索步长
ak=((2*x(1)-4)*dk(1)+(2*x(2)-6)*dk(2))/(dk(1)*dk(2)-2*dk(1)^2-2*dk(2)^2);
xu=x+ak*dk;
x=xu;
%输出结果
optim_fx=subs(fx,[x1 x2],[x(1) x(2)]);
fprintf(' x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx);
%计算目标函数点x(k+1)处一阶导数值
fan=subs(fxd1,[x1 x2],[x(1) x(2)]);
g=0;
for i=1:length(fan)
g=g+fan(i)^2;
end
g=sqrt(g);
end
%输出结果
optim_fx=subs(fx,[x1 x2],[x(1) x(2)]);
fprintf('\n最速下降法\n结果:\n x=[ %d %d ] optim_fx=%d\n',x(1),x(2),optim_fx);。

相关主题