clear;clc;
rho = 0.5;
xold=rho*ones(2,1);
xold=[1.23;3.45]
beta=0.6;eta=1e-3;sigmabar=1;sigma=1;nmax=500;epsilon=1e-6;
nit=0;nf=0;nc=0;ngf=0;ngc=0;
fxold=funf(xold);nf=nf+1;
gfxold=gradf(xold);ngf=ngf+1;
hxold=funh(xold);nc=nc+1;
ghxold=gradh(xold);ngc=ngc+1;
vxold=funv(xold);n=length(xold);m=length(hxold);Bk=eye(n); flag = 2;
OPTIONS = optimoptions('quadprog','Display','off');
while nit<=nmax
[dk,~,~,~,Lambda] = quadprog(Bk,gfxold,[],[],ghxold',-hxold,[],[],[],OPTIONS);
lambda = Lambda.eqlin;
if norm(dk)<=epsilon
flag=0;break;
end
sigma1=norm(lambda,1)+sigmabar;
if sigma<sigma1
sigma=max(sigma1,1.5*sigma);
end
barP_sigma=fxold+gfxold'*dk+0.5*dk'*Bk*dk;
P_sigmaxold=fxold+sigma*vxold;
alpha=1;
while alpha>1e-10
xnew=xold+alpha*dk;fxnew=funf(xnew);nf=nf+1;
hxnew=funh(xnew);nc=nc+1;
vxnew=funv(xnew);
P_sigmaxnew=fxnew+sigma*vxnew;
if P_sigmaxnew-P_sigmaxold<=eta*alpha*(barP_sigma-P_sigmaxold)
break;
end
alpha=beta*alpha;
end
if alpha<=1e-10
flag=1;fprintf('步长太小',alpha);break;
end
s=xnew-xold;
gfxnew=gradf(xnew);ghxnew=gradh(xnew);ngf=ngf+1;ngc=ngc+1;
q=gfxnew+ghxnew*lambda-(gfxold+ghxold*lambda);
bfail=1;[Bk,bfail]=bfgs(Bk,s,q,n,bfail);
fprintf('dk=%4d, alpha=%.4f, sigma=%d, fxold=%.4f, vxold=%4d\n',norm(dk),alpha,sigma,fxold,vxold)
xold=xnew;fxold=fxnew;gfxold=gfxnew;hxold=hxnew;ghxold=ghxnew;
vxold=vxnew;nit=nit+1;
end
nit,fxold,xold,vxold,flag
- 1
- 2
- 3
- 4
- 5
- 6
前往页