实用最优化方法Matlab程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实用最优化方法Matlab程序设计
程序如下:
function lambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
sk=s0;
d=-c1*lambdak*g0'*sk;
xk=x0+lambdak*sk;
f1=f(xk);
e=f0-f1;
while d>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*sk;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*sk;
end
lambdak
function g=grad(x)
g=zeros(2,1);
g(1)=-4*x(1)*(x(2)-x(1)^2)-2*(1-x(1));
g(2)=2*(x(2)-x(1)^2);
function fa=f(x)
fa=(x(2)-x(1)^2)^2+(1-x(1))^2;
在命令窗口中输入x0=[0;1];s0=[-1;1];nonexact(x0,s0)输出结果为:
程序如下:
function x_star=cong(x0,eps)
g0=grad(x0);
res0=norm(g0);
resk=res0;
k=0;
xk=x0;
while resk>eps
k=k+1;
if k==1
sk=-grad(xk);
else
sk=-grad(xk)+resk^2/res0^2*s0;
end
lambdak=step(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
res0=resk;
resk=norm(grad(xk));
s0=sk;
fprintf('------the%d-th iteration,the residual is%f,the lambdak is%f\n\n', k,resk,lambdak);
end
x_star=xk;
disp('the optimal solution is');
x_star
%sub functions
function g=grad(x)
g=zeros(4,1);
g(1)=2*x(1)-2*x(2)+2;
g(2)=4*x(2)-2*x(1)-x(3)+3;
g(3)=2*x(3)-x(2)-1;
g(4)=2*x(4);
function lambda=step(x,s)
a=2*x(1)*s(1)-2*x(2)*s(1)-2*x(1)*s(2)+4*x(2)*s(2)+2*s(3)*x(3)+2*x(4)*s(4)-s(2)*x (3)-s(3)*x(2)+2*s(1)+3*s(2)-s(3);
b=2*s(1)^2+4*s(2)^2-4*s(1)*s(2)+2*s(3)^2+2*s(4)^2-2*s(2)*s(3);
lambda=-a/b;
在命令窗口中输入x0=[0;0;0;0];eps=1e-6;cong(x0,eps)
输出结果为
-
H=2I时
当
k
程序如下:
function x_star=dfph(x0,eps)
g0=grad(x0);
res0=norm(g0);
res=res0;
k=0;
xk=x0;
while res>eps
k=k+1;
H=eye(length(x0));
sk=-H*grad(xk);
lambdak=nonexact(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
res=norm(grad(xk));
fprintf('------the%d-th iteration,the residual is%f,the lambdak is%f\n\n', k,res,lambdak);
end
x_star=xk;
disp('the optimal solution is');
x_star
function lambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
d=-c1*lambdak*g0'*s0;
xk=x0+lambdak*s0;
f1=f(xk);
e=f0-f1;
while d>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*s0;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*s0;
end
lambda=lambdak;
function g=grad(x)
g=zeros(2,1);
g(1)=2*x(1)*exp(x(1)^2+x(2)^2)+1;
g(2)=4*x(2)+2*x(2)*exp(x(1)^2+x(2)^2);
function fa=f(x)
fa=x(1)+2*x(2)^2+exp(x(1)^2+x(2)^2);
在命令窗口中输入x0=[0;1];eps=1e-3;dfph(x0,eps)输出结果为: