⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfgs.asv

📁 一个用拟牛顿算法求解优化问题的程序
💻 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 + -