📄 bfgs.asv
字号:
function [Ntotle1,MMM,number1]=BFGS(x)
%for i=1:30
x=1;
if x==1
number1=0;
MMM=0;
Ntotle1=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*a*gk'*dk
if gk11'*dk>=max(0.25,1-a*norm(dk)^0.5)*gk'*dk
NG=NG+1;
j=-1;
else
a1=a;
a=(a1+a2)/2;
end
else
a2=a;
a=(a1+a2)/2;
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=(sqrt(yk1'*Hk*yk1))*(sk/(sk'*yk1)-((Hk*yk1)/(yk'*Hk*yk1)));
%yk1=max(yk,yk1);
Hk=Hk-(Hk*sk*sk'*Hk)/(sk'*Hk*sk)+(yk*yk')/(yk'*sk);%MBFGS
% if ((sk'*yk1)/(sk'*sk))>=ee*(norm(gk11))^2
% 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)
Totle1=NF+NG*5;
MMM=max(Totle1,MMM);
else
Totle1=1;
number1=number1+1;
end
Ntotle1=Totle1*Ntotle1;
diary 000001.m
sprintf('%d %d %d %d/%d/%d %d',nprob,n,m,NI,NF,NG,Ntotle1)
diary off
end
else
Ntotle1=0;
MMM=0;
number1=0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -