优化方法编程大作业

发布 2023-05-16 23:34:28 阅读 2465

matlab**:

将下面**输入command中即可:

clcclear

syms x2 x1 f

a=0;b=+inf;

c1=0.1;

c2=0.5;

rk为搜索步长,xk为变量,sk为搜索方向,gk为梯度值。

rk=1;sk=[-1;1];

xk0=[0;1]; xk0初始值。

f=(x2-x1^2)^2+(1-x1)^2; %所求函数。

j=0; %循环的标志变量。

循环求解最佳的步长。

while j>=0;

fk0=subs(f,,)求f在xk0处的函数值。

gk0=subs(jacobian(f,[x1,x2]),求f在xk0处的梯度值。

xk=xk0+rk*sk;

fk=subs(f,,)求f在xk处的函数值。

gk=subs(jacobian(f,[x1,x2]),求f在xk处的梯度值。

%搜索步长满足wolfe-powell第一个准则。

if fk0-fk>=-c1*rk*gk0'*sk

%搜索步长满足wolfe-powell第二个准则。

if gk'*sk>=c2*gk0'*sk

输出最佳的步长。

rk=rk;

return;

%搜索步长不满足wolfe-powell准则,继续迭代。

elsej=j+1;

a=rk;rk=min(2*rk,0.5*(rk+b));

endelse

j=j+1;

b=rk;rk=0.5*(a+rk);

endendxkgk

rk运行结果:j=53,迭代54次。xk =

gk =

rk =1.1102e-16

首先定义三个函数f(求函数值),g(求梯度值)和wolfe(第一题的算法求步长)并存为m文件放在一个文件夹下:

function [f] =f(x)

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

endfunction [g] =g(yk0)

syms y1 y2 y3 y4;

y=y1^2-2*y1*y2+2*y2^2+y3^2+y4^2-y2*y3+2*y1+3*y2-y3;

g=subs(jacobian(y,[y1,y2,y3,y4]),求gf在yk0处的梯度值。

endfunction [tk]=wolfe(yk0,dk)

a=0;b=+inf;

c1=0.1;

c2=0.5;

rk为搜索步长,xk为变量,sk为搜索方向,gk为梯度值。

tk=1;sk=[-1;1];

xk0=[0;1];%xk0初始值。

f=(x2-x1^2)^2+(1-x1)^2;

所求函数。j=0; %循环的标志变量。

循环求解最佳的步长。

while j>=0;

fk0=f(yk0);%求f在xk0处的函数值。

gk0=g(yk0); 求f在xk0处的梯度值。

yk=yk0+tk*dk;

fk=f(yk);%求f在xk处的函数值。

gk=g(yk); 求f在xk处的梯度值。

%搜索步长满足wolfe-powell第一个准则。

if fk0-fk>=-c1*tk*gk0'*dk

%搜索步长满足wolfe-powell第二个准则。

if gk'*dk>=c2*gk0'*dk

输出最佳的步长。

tk=tk;

return;

%搜索步长不满足wolfe-powell准则,继续迭代。

elsej=j+1;

a=tk;tk=min(2*tk,0.5*(tk+b));

endelse

j=j+1;

b=tk;tk=0.5*(a+tk);

endend

end将下面的**输入matlab的command中可得结果:

xk0=[0;0;0;0];

k=0;n=4;

gk0=g(xk0); 求f在xk0处的梯度值。

sk=-gk0;%sk为sk

while k<=n-1

gk0=g(xk0); 求f在xk0处的梯度值。

rk=wolfe(xk0,sk);

xk=xk0+rk*sk;

fk=f(xk);%求f在xk处的函数值。

gk=g(xk); 求f在xk处的梯度值。

xk0=xk;

if (gk(1)^2+gk(2)^2+gk(3)^2+gk(4)^2)^(1/2)<0

xk=xk;

fk=f(xk);%求f在xk处的函数值。

return;

elseuk=((gk(1)^2+gk(2)^2+gk(3)^2+gk(4)^2))/gk0(1)^2+gk0(2)^2+gk0(3)^2+gk0(4)^2));

sk=-gk+uk*sk;

k=k+1;

endendxkfk

运行结果:xk =

fk =

首先建立四个m文件,自定义函数f,g,hess,wolfe。

function f=f(x)

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

endfunction g = x)

gf=[1+2*x(1)*exp(x(1)^2+x(2)^2),4*x(2)+2*x(2)*exp(x(1)^2+x(2)^2)]'

endfunction he=hess(x)

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

endfunction [tk]=wolfe(yk0,dk)

a=0;b=+inf;

c1=0.1;

c2=0.5;

rk为搜索步长,xk为变量,sk为搜索方向,gk为梯度值。

tk=1;sk=[-1;1];

xk0=[0;1];%xk0初始值。

f=(x2-x1^2)^2+(1-x1)^2;

所求函数。j=0; %循环的标志变量。

循环求解最佳的步长。

while j>=0;

fk0=f(yk0);%求f在xk0处的函数值。

gk0=g(yk0); 求f在xk0处的梯度值。

yk=yk0+tk*dk;

fk=f(yk);%求f在xk处的函数值。

gk=g(yk); 求f在xk处的梯度值。

%搜索步长满足wolfe-powell第一个准则。

if fk0-fk>=-c1*tk*gk0'*dk

%搜索步长满足wolfe-powell第二个准则。

if gk'*dk>=c2*gk0'*dk

输出最佳的步长。

tk=tk;

return;

%搜索步长不满足wolfe-powell准则,继续迭代。

elsej=j+1;

a=tk;tk=min(2*tk,0.5*(tk+b));

endelse

j=j+1;

b=tk;tk=0.5*(a+tk);

endend

end1)编写最速下降法函数minfd。

function [x,minf,k] =minfd(x0)

功能:用变尺度求解无约束优化问题。

输入:初始点xk

输出:最优解val,及最小点x,迭代次数k

eps = 1.0e-4;tol = 1;k=0;

while tol>eps

v = gfun(x0);

tol = norm(v);

step = buchang(x0,v);%一维搜索。

xk = x0 + step*v;

x0 = xk;

k=k+1;

endx = xk;

minf = fun(x);

在command中输入》 xk=[1,0]';x,fv,k] =minfd(xk)

运行结果为:x =

fv =

k =2)编写牛顿法求解极值minnt。

function [x,minf,k] =minnt(x0)

功能:用变尺度求解无约束优化问题。

输入:初始点xk

输出:最优解val,及最小点,迭代次数。

eps = 1.0e-4;tol = 1;k=0;

while tol>eps

v = gfun(x0);

北航最优化方法大作业参考

定义一个有向网络g n,e 其中n是节点集,e是弧集。令a是网络g的点弧关联矩阵,即n e阶矩阵,且第l列与弧里 i,j 对应,仅第i行元素为1,第j行元素为 1,其余元素为0。再令bm bm1,bmn t,fm fm1,fme t,则可将等式约束表示成 afm bm 本算例为一经典te算例。算例网...

北航最优化方法大作业参考

定义一个有向网络g n,e 其中n是节点集,e是弧集。令a是网络g的点弧关联矩阵,即n e阶矩阵,且第l列与弧里 i,j 对应,仅第i行元素为1,第j行元素为 1,其余元素为0。再令bm bm1,bmn t,fm fm1,fme t,则可将等式约束表示成 afm bm 本算例为一经典te算例。算例网...

北航最优化方法大作业参考

定义一个有向网络g n,e 其中n是节点集,e是弧集。令a是网络g的点弧关联矩阵,即n e阶矩阵,且第l列与弧里 i,j 对应,仅第i行元素为1,第j行元素为 1,其余元素为0。再令bm bm1,bmn t,fm fm1,fme t,则可将等式约束表示成 afm bm 本算例为一经典te算例。算例网...