最优化牛顿法最速下降法共轭梯度法matlab代码

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

牛顿法

迭代公式:(1)2()1()[()]()k k k k x x f x f x +-=-∇∇

Matlab 代码:

function [x1,k] =newton(x1,eps)

hs=inline('(x-1)^4+y^2'); 写入函数

ezcontour(hs,[-10 10 -10 10]); 建立坐标系

hold on; 显示图像

syms x y 定义变量

f=(x-1)^4+y^2; 定义函数

grad1=jacobian(f,[x,y]); 求f 的一阶梯度

grad2=jacobian(grad1,[x,y]); 求f 的二阶梯度

k=0; 迭代初始值

while 1 循环

grad1z=subs(subs(grad1,x,x1(1)),y,x1(2)); 给f 一阶梯度赋初值 grad2z=subs(subs(grad2,x,x1(1)),y,x1(2)); 给f 二阶梯度赋初值 x2=x1-inv(grad2z)*(grad1z)'; 核心迭代公式

if norm(x1-x2)

break;

else

plot([x1(1),x2(1)],[x1(2),x2(2)],'-r*'); 画图

k=k+1; 迭代继续

x1=x2; 赋值

end

end

end

优点:在极小点附近收敛快

缺点:但是要计算目标函数的hesse 矩阵

最速下降法

1. :选取初始点xo ,给定误差

2. 计算一阶梯度。若一阶梯度小于误差,停止迭代,输出

3. 取()()()k k p f x =∇

4. 10

t ()(), 1.min k k k k k k k k k k t f x t p f x tp x x t p k k +≥+=+=+=+进行一维搜索,求,使得令转第二步

例题:

求min (x-2)^4+(x-2*y)^2.初始值(0,3)误差为0.1

(1)编写一个目标函数,存为f.m

function z = f( x,y )

z=(x-2.0)^4+(x-2.0*y)^2;

end

(2)分别关于x 和y 求出一阶梯度,分别存为fx.m 和fy.m

function z = fx( x,y )

z=2.0*x-4.0*y+4.0*(x-2.0)^3;

end

function z = fy( x,y )

z=8.0*y-4.0*x;

end

(3)下面是脚本文件,一维搜索用的是黄金分割法Tic 计算时间

eps=10^(-4);误差

err=10;

dt=0.01;

x0=1.0;初始值

y0=1.0;

mm=0;

while err>eps 黄金分割法

dfx=-fx(x0,y0);

dfy=-fy(x0,y0);

tl=0;tr=1;确定一维搜索的区间

h=3;

nn=0;

gerr=10;

geps=10^(-4);

while gerr>geps

tll=tl+0.382*abs(tr-tl);

trr=tl+0.618*abs(tr-tl);

if

f(x0+tll*h*dfx,y0+tll*h*dfy)>f(x0+trr*h*dfx,y0+trr*h*dfy) tl=tll;

else

tr=trr;

end

gerr=abs(tl-tr); 区间的长度之差

tt=0.5*(tl+tr);

nn=nn+1;步数增加

if nn>200 迭代终止条件

break

end

end

x0=x0+tt*h*dfx; 重新迭代

y0=y0+tt*h*dfy;

err=sqrt(fx(x0,y0)^2+fy(x0,y0)^2);

mm=mm+1;步数增加

if mm>700 迭代步数超过700,终止

break

end

end

res=[x0,y0];输出最后的x,y。

toc 计算运行时间

拟牛顿法(DFP 算法)

220'412010min ()4,(1,1),,1001f x x x x H ε-⎛⎫=+=== ⎪⎝⎭

取 这是一个脚本文件可以直接运行

syms x1 x2;定义变量

eps=0.00001;

x0=[1,1]';初始值

h0=[1,0;0,1];

f=x1^2+4*x2^2;待求函数

fx=diff(f,x1);对x求导

fy=diff(f,x2);对y求导

df=[fx,fy];f的一阶梯度

dfx0=[subs(fx,[x1,x2],x0),subs(fy,[x1,x2],x0)]';赋初值

d0=-dfx0;搜索方向

n=1;

while 1

syms t;

s0=x0+t*d0;引入变量t

ff=subs(f,[x1,x2],s0)给f赋值;

t=solve(diff(ff));求ff的极小点

xx1=x0+t*d0;更新初始值

dfx1=[subs(fx,[x1,x2],xx1'),subs(fy,[x1,x2],xx1')]';赋值

pp=sqrt(dfx1*dfx1');判断此时一阶梯度的值

if(pp<0.001)迭代终止条件

break

end

a1=xx1-x0;

r1=dfx1-dfx0;

h1=h0+(a1*a1')/(a1'*r1)-(h0*r1*r1'*h0)/(r1'*h0*r1);h0的更新d1=-h1*dfx1;搜索方向的更新

d0=d1;循环赋值

相关文档
最新文档