我在做毕业论文时,调试程序时,也遇到了与楼主相类似的问题,我把代码贴出来:各位高手大侠看看点评一下:
function [xmin,funval]=TR(fun,x0,delta0,x)
delta=delta0;
eps=1.0e-4;
n=length(x0);
H=eye(n);
mu=0.25;
yita=0.75;
normg=1;
while normg>eps
fx=subs(fun,x,x0);
gradfun=jacobian(fun,x);
g=subs(gradfun,x,x0);%g为行向量
normg=norm(g);
[s,fs]=trustP(fun,g,H,delta,x,s0);%s应该为行向量
x1=x0+s;%x1为列向量
fx1=subs(fun,x,x1);
rho=(fx-fx1)/(-fs);
if rho>yita
x0=x0+s;%x0为列向量
else
x0=x0;
end
if rho<=mu
delta=0.5*delta;
else
if rho>=yita
delta=2*delta;
else
delta=delta;
end
end
g1=subs(gradfun,x,x1);%g为行向量1
y=g1-g;%y为行向量
y=y'; %ye为列向量
dyT=y';%dyT为行向量
dsT=s';%dsT为行向量
A=s*dsT;
B=H*y*dyT*H;
a=dsT*y;
b=dyT*H*y;
H=H+A/a+B/b;
end
xmin=x0;
funval=subs(fun,x,xmin)
end
function [s,fs]=trustP(fun,g,H,delta,x,s0)
epsi=1.0e-4;
r0=8;
beta=0.5;
dxT=x';
B1=x*H*dxT;
c=g*dxT;
x0=s0;
fx=subs(fun,x,x0);
sfun=fx+c+B1;%信赖域子问题函数
N=length(x);
qfun=0;
for k=1:N
qfun=qfun+x(k)^2;
end
sqfun=sqrt(qfun);
cfun=delta-sqfun;%罚函数
tol=1;
while tol>epsi
pfun=r0*cfun;
gfun=sfun+pfun;%障碍函数
[s1,sf]=NT(gfun,x,s0)
cf=subs(cfun,x,s1);
tol=r0*cf;
r0=r0*beta;
end
s=s1;
fs=subs(fun,x,s);
end
unction [s1,sf]=NT(gfun,x,s0)
eps=1.0e-4;
tol=1;
s0=s0';%s0为列向量
while tol>eps
gradf=jacobian(gfun,x)
jacf=jacobian(gradf,x)
v=subs(gradf,x)
tol=norm(v);
pv=subs(jacf,x,s0);%运行到此处时程序就报错了
p=-inv(pv)*v';
ss1=s0+p;
s0=ss1;
end
s1=ss1;
sf=subs(fun,x,s1);
end