优化方法上机作业

  • 格式:doc
  • 大小:44.50 KB
  • 文档页数:5

1. Wolfe-Powell方法

建立m文件

function [x,minf] = minWP(f,XMAX,sigma1,sigma2,alpha,eps)

format long;

if nargin == 5

eps = 1.0e-6;

end

if sigma1<=0||sigma1>1

disp('sigma1参数不对¡');

x = NaN;

minf = NaN;

return;

else

if sigma2 <= sigma1

disp('sigma2参数不对¡');

x = NaN;

minf = NaN;

return;

else

if alpha <= 1

disp('alpha参数不对¡');

x = NaN;

minf = NaN;

return;

end

end

end

df = diff(f);

f0 = subs(f, findsym(f),0);

df0 = subs(df, findsym(df),0);

a = 0;

b = XMAX;

k = 0;

t = (a+b)/2;

while 1

ft = subs(f,findsym(f),t);

f1 = f0 + sigma1*t*df0;

if ft <= f1

f2 = sigma2*t*df0;

if ft >= f2

x = t; break;

else

a = t;

if b < XMAX

t = (a+b)/2;

else

t = alpha*t;

end

end

else

b = t;

t = (a+b)/2;

end

k = k+1;

end

minf = subs(f,findsym(f),x);

format short;

在命令窗口输入:

syms t;

>> f=t^2-2*t+7;

>> x1=minWP(f,8,0.1,0.65,2)

>> x2=minWP(f,9,0.1,0.65,2)

>> x3=minWP(f,10,0.1,0.65,2)

输出结果:

x1 = 1

x2 =1.1250

x3 = 1.2500

2.BFGS

f=inline('(x1+10*x2)^2+5*(x3-10*x4)^2+(x2-2*x3)^4+10*(x1-x4)^4','x1','x2','x3','x4');

g1=inline('2*(x1+10*x2)+30*(x1-x4)^3','x1','x2','x3','x4');

g2=inline('20*(x1+10*x2)+4*(x2-2*x3)^3','x1','x2','x3','x4');

g3=inline('10*(x3-10*x4)-8*(x2-2*x3)^3','x1','x2','x3','x4');

g4=inline('-100*(x3-10*x4)-40*(x1-x4)^3','x1','x2','x3','x4');

x1=3;x2=-1;x3=0;x4=1;

maxk=500;

rho=0.6;

sigma=0.4;

k=0; eps=1e-4;

Bk=eye(4);

while k

g=[g1(x1,x2,x3,x4);g2(x1,x2,x3,x4);g3(x1,x2,x3,x4);g4(x1,x2,x3,x4)];

d=norm(g);

if d

break;

end

dk=-Bk\g;

m=0; mk=0;

while(m<20)

new=f(x1+rho^m*dk(1),x2+rho^m*dk(2),x3+rho^m*dk(3),x4+rho^m*dk(4));

old=f(x1,x2,x3,x4);

if new

mk=m;

break;

end

m=m+1;

end

x1=x1+rho^mk*dk(1);

x2=x2+rho^mk*dk(2);

x3=x3+rho^mk*dk(3);

x4=x4+rho^mk*dk(4);

sk=rho^mk*dk;

yk=[g1(x1,x2,x3,x4);g2(x1,x2,x3,x4);g3(x1,x2,x3,x4);g4(x1,x2,x3,x4)]-g;

if yk'*sk>0

Bk=Bk-(Bk*sk*sk'*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk);

end

k=k+1 ;

x=[x1;x2;x3;x4];

end

f(x1,x2,x3,x4)

运行结果:1.0644e-009

DFP

建立fun.m

function y=fun(x) y=(x(1)+10*x(2))^2+5*(x(3)-10*x(4))^2+(x(2)-2*x(3))^4+10*(x(1)-x(4))^4;

建立dfun.m

function g=dfun(x)

g(1)=2*(x(1)+10*x(2))+30*(x(1)-x(4))^3;

g(2)=20*(x(1)+10*x(2))+4*(x(2)-2*x(3))^3;

g(3)=10*(x(3)-10*x(4))-8*(x(2)-2*x(3))^3;

g(4)=-100*(x(3)-10*x(4))-40*(x(1)-x(4))^3;

g=[g(1) g(2) g(3) g(4)]';

建立f_search.m

function y=f_search(t)

global x p

y=(x(1)+t*p(1)+10*(x(2)+t*p(2)))^2+5*(x(3)+t*p(3)-10*(x(4)+t*p(4)))^2+(x(2)+t*p(2)-2*(x(3)+t*p(3)))^4+10*(x(1)+t*p(1)-x(4)-t*p(4))^4;

建立print.m

function print()

global k ;

disp('The optimum solution is:');

solution=DFP();

disp(solution);

disp('The optimum value is:');

value=fun(solution);

disp(value);

disp('The iterative times are: ');

建立主程序:

function opt=DFP()

global x p k H

x=[3 -1 0 1]';

H=eye(4);

eps=1e-4;

g=dfun(x);

k=0;

while 1

p=-1*H*g;

t_min=fminbnd(@f_search,0,20);

temp_x=x;

x=x+t_min*p;

temp_g=g;

g=dfun(x);

if norm(g)

opt=x;

break; end

s=x-temp_x;

y=g-temp_g;

H=H-(1/(y'*H*y))*(H*y*y'*H)+(1/(y'*s))*(s*s');

k=k+1;

end

运行结果: 9.0029e-008

3.