📄 mbfgs.m
字号:
function [Ntotle2,NNN,number2]=MBFGS(y)
%for i=1:30
y=1;
if y==1
number2=0;
NNN=0;
Ntotle2=1;
for NO=1:50
[nprob,n,m,x0]=init(NO);
ee=1e-6;
ee1=1e-12;
e=1e-14;
gk=grdfcn(n,m,x0,nprob);
dk=(-1)*gk;
Hk=eye(n,n);
p=0.1;
b=0.9;
NI=0;
Sd=0;
NF=1;
NG=1;
t=0.5;
while (norm(gk)>ee)&(NI<1000)
a=1;
a1=0;
a2=100000;
if (gk'*dk>-e)
dk=-gk;
Sd=Sd+1;
end
sk=a*dk;
x1=x0+sk;
f0=objfcn(n,m,x0,nprob);
f1=objfcn(n,m,x1,nprob);
gk11=grdfcn(n,m,x1,nprob);
j=0;
while (j==0)&(NG+NF<5000) %&(norm(x1-x0)>ee1)
if f1<=f0+p*gk'*dk
% if gk11'*dk>=b*gk'*dk
NG=NG+1;
% j=-1;
% else
% a1=a;
a=1;
% a=(a1+a2)/2;
% end
else
%a2=a;
% a=(a1+a2)/2;
a=0.1*(gk11'*dk)/(dk'*Hk*dk);
end
sk=a*dk;
x1=x0+sk;
f1=objfcn(n,m,x1,nprob);
gk11=grdfcn(n,m,x1,nprob);
NF=NF+1;
end
yk=gk11-gk;
sk=x1-x0;
Qk=5;
%yk1=2*(f0-f1+gk11'*sk)/(norm(sk)^2)*sk;
yk1=(yk+(2*(f0-f1)+(gk11+gk)'*sk)/(norm(sk)^2)*sk);
vk=((yk1'*Hk*yk1)^0.5)*(sk/(sk'*yk1)-((Hk*yk1)/(yk1'*Hk*yk1)));
%yk1=max(yk,yk1);
Hk=Hk-(Hk*sk*sk'*Hk)/(sk'*Hk*sk)+(yk1*yk1')/(yk1'*sk);%MBFGS
%if norm(gk11)<1
% tt=3;
% else
% tt=0.01;
% end
% if ((sk'*yk1)/(sk'*sk))>=ee*(norm(gk11))^tt
%Hk=Hk+(sk'*sk)/(yk1'*sk)-(Hk*yk1*yk1'*Hk)/(yk1'*Hk*yk1)+Qk*vk*vk';
%else
% Hk=Hk;
%end
x0=x1;
W=inv(Hk);
gk=gk11;
dk=(-1)*W*gk;
NI=NI+1;
end
n;
m;
NI;
NF;
NG;
Sd;
q=norm(gk11);
if (q<=ee)
Totle2=NF+NG*5;
NNN=max(Totle2,NNN);
else
Totle2=1;
number2=number2+1;
end
Ntotle2=Totle2*Ntotle2;
diary 000001.m
sprintf('%d %d %d %d/%d/%d %d',nprob,n,m,NI,NF,NG,Ntotle2)
diary off
end
else
Ntotle2=0;
NNN=0;
number2=0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -