最优化方法matlab作业

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

实用最优化方法

——matlab编程作业

初值为[-1;1]

其中g0、g1分别为不同x值下得导数,f0、f1为函数值

MATLAB程序:

x0=[-1;1];

s0=[1;1];

c1=0.1;c2=0.5;a=0;b=inf;d=1;n=0;

x1=x0+d*s0;

g0=[-400*(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));200*(x0(2)-x0(1) ^2)];

g1=[-400*(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));200*(x1(2)-x1(1) ^2)];

f1=100*(x1(2)-x1(1)^2)^2+(1-x1(1))^2;

f0=100*(x0(2)-x0(1)^2)^2+(1-x0(1))^2;

while((f0-f1<-c1*d*g0'*s0)||(g1'*s0

if ((f0-f1)<(-c1*d*g0'*s0))

b=d;d=(d+a)/2;

x1=x0+d*s0;

g0=[-400*(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));200*(x0 (2)-x0(1)^2)];

g1=[-400*(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));200*(x1 (2)-x1(1)^2)];

f1=100*(x1(2)-x1(1)^2)^2+(1-x1(1))^2;

f0=100*(x0(2)-x0(1)^2)^2+(1-x0(1))^2;

elseif (((g1')*s0)<(c2*(g0')*s0))

a=d;

if(2*d<=(d+b)/2)

d=2*d;

else

d=(d+b)/2;

end

x1=x0+d*s0;

g0=[-400*(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));200*(x0(2) -x0(1)^2)];

g1=[-400*(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));200*(x1(2 )-x1(1)^2)];

f1=100*(x1(2)-x1(1)^2)^2+(1-x1(1))^2;

f0=100*(x0(2)-x0(1)^2)^2+(1-x0(1))^2;

end

x1

d

f1=100*(x1(2)-x1(1)^2)^2+(1-x1(1))^2 计算结果:

最优点:x1 = -0.9961

1.0039

步长: d = 0.0039

最优解:f1 = 3.9981

目标函数:

function f = fun2( x )

f=x(1)^2-2*x(1)*x(2)+2*x(2)^2+x(3)^2-x(2)*x(3)+2*x(1)+3*x(2 )-x(3);

end

目标函数梯度:

function g = gfun2( x )

g=[2 -2 0;-2 4 -1;0 -1 2]*x+[2;3;-1];

end

源代码:(以初值为为(0;0;0))

x0=[0;0;0]; %初始值

eps=1.0e-5; %精度

g0=gfun2(x0);

s0=-g0;

n=0;

syms d1;

while norm(g0)>eps

if n<3

g=gfun2(x0+d1*s0);

d= double(solve(s0'*g));

x1=x0+d*s0;

g1=gfun2(x1);

if norm(g1)

n=n+1;

x0=x1;

break

else

s0=-g1+(norm(g1)^2/norm(g0)^2)*s0;

x0=x1;

g0=g1;

end

elseif n==3

x0=x1;

g0=gfun2(x0);

s0=-g0;

n=0;

end

n=n+1;

x0

n

fun2(x0)

计算结果:

最优点:x0 = -4 -3 -1 迭代次数: n = 3 最优值: ans = -8

(1)最速下降法:

目标函数:

function f= fun3_1(x )

f=x(1)+2*x(2)^2+exp(x(1)^2+x(2)^2);

end

目标函数的梯度:

function g= gfun3_1(x)

g=[1+2*x(1)*exp(x(1)^2+x(2)^2);4*x(2)+2*x(2)*exp(x(1)^2+x(2 )^2)];

end

源代码(初值为(1;0)):

x0=[1;0];%初始值

eps=1.0e-5;%精度

n=0;

g0=gfun3(x0);

syms d1;

while norm(g0)>=eps

s0=-g0;

g=gfun3(x0+d1*s0);

d= double(solve(s0'*g));

x1=x0+d*s0;

g1=gfun3(x1);

if( norm(g1)

n=n+1;

x0=x1;

break;

else

x0=x1;

g0=gfun3(x0);

end

n=n+1;

end

相关文档
最新文档