最优化方法matlab作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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