主题:[讨论]求助--大家帮忙看看小弟的程序哪里出问题了
这个是最优化方法的DFP算法
function DFP
syms x1 x2 t;
%f=4*(x1-5)^2+(x2-6)^2;
f=x1^2+4*x2^2;
%X0=[8;9];
X0=[1;1];
e=0.01;
g=jacobian(f).';
f0=subs(f,[x1,x2],[X0(1),X0(2)])
g0=subs(g,[x1,x2],[X0(1),X0(2)])
H0=[1 0;0 1];
P0=-g0
k=0;
while 1
fp=subs(f,[x1,x2],[X0+t*P0])
tk=solve(diff(fp,t))
X1=X0+tk*P0
f1=subs(f,[x1,x2],[X1(1),X1(2)])
g1=subs(g,[x1,x2],[X1(1),X1(2)])
if norm(g1)<=e
X1,f1
else
if k==2
X0=X1;
f0=f1;
g0=g1;
H0=[1 0;0 1];
P0=-g0;
k=0;
else
s0=X1-X0;
y0=g1-g0;
H1=H0+(s0*s0')/(s0'*y0)-(H0*y0*y0'*H0)/(y0'*H0*y0);
P1=-H1*g1;
k=k+1;
X0=X1;
end
end
end
function DFP
syms x1 x2 t;
%f=4*(x1-5)^2+(x2-6)^2;
f=x1^2+4*x2^2;
%X0=[8;9];
X0=[1;1];
e=0.01;
g=jacobian(f).';
f0=subs(f,[x1,x2],[X0(1),X0(2)])
g0=subs(g,[x1,x2],[X0(1),X0(2)])
H0=[1 0;0 1];
P0=-g0
k=0;
while 1
fp=subs(f,[x1,x2],[X0+t*P0])
tk=solve(diff(fp,t))
X1=X0+tk*P0
f1=subs(f,[x1,x2],[X1(1),X1(2)])
g1=subs(g,[x1,x2],[X1(1),X1(2)])
if norm(g1)<=e
X1,f1
else
if k==2
X0=X1;
f0=f1;
g0=g1;
H0=[1 0;0 1];
P0=-g0;
k=0;
else
s0=X1-X0;
y0=g1-g0;
H1=H0+(s0*s0')/(s0'*y0)-(H0*y0*y0'*H0)/(y0'*H0*y0);
P1=-H1*g1;
k=k+1;
X0=X1;
end
end
end