优化方法上机作业
- 格式: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.