实验的题目和要求
一、所属课程名称: 最优化方法
二、实验日期: 三、实验目的
掌握最速下降法,牛顿法和共轭梯度法的算法思想,并能上机编程实现相应的算法。
二、实验要求
用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;
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 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);