wolfe.asv

来自「这次上传的绝对是好东西」· ASV 代码 · 共 60 行

ASV
60
字号

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Wolfe-Powell Line Search
function [alphak,fk,gk,wfnum,wgnum]=wolfe(n,m,xk,dk,fk,gk,nprob)
         rho1=0.9;rho2=0.5;sigma1=0.01;sigma2=0.001;
         %fk1=objfcn(n,m,xk,nprob);
         %gk1=grdfcn(n,m,xk,nprob);
         fk1=fk;gk1=gk;
         wfnum=0;wgnum=0;
         %step 0
         %fk1=fk
         %gk1=gk
         alphak1=1;
         fk2=objfcn(n,m,xk+alphak1*dk,nprob);wfnum=wfnum+1;
         gk2=grdfcn(n,m,xk+alphak1*dk,nprob);wgnum=wgnum+1;
             if fk2-fk1<=sigma1*alphak1*gk1'*dk
                 if gk2'*dk>=sigma2*gk1'*dk
                     alphak=alphak1
                 end
                 %step 0
             else
                 %step 1%%%%%%%%%%%%%%%%%%%%%
                 i=0;
                 while 1
                     if i~=0
                         alphak1=rho1^i;
                         fk2=objfcn(n,m,xk+alphak1*dk,nprob);wfnum=wfnum+1;
                     end
                     if fk2-fk1<=sigma1*alphak1*gk1'*dk
                         i=i-1;
                         fk2=objfcn(n,m,xk+rho1^i*dk,nprob);
                         if fk2-fk1>sigma1*rho1^i*gk1'*dk
                             break;
                         end
                     else
                         i=i+1;
                     end
                 end  
                 %alphak1=rho1^i
                 %step 1%%%%%%%%%%%%%%%%%%%%%%%
                 while 1
                     gk2=grdfcn(n,m,xk+alphak1*dk,nprob);wgnum=wgnum+1;
                     if gk2'*dk>=sigma2*gk1'*dk
                         alphak=alphak1;
                         break;
                     else
                         betak1=rho1^(-1)*alphak1;
                         j=0;
                         while 1 
                             alphak=alphak1+rho2^j*(betak1-alphak1);
                             fk2=objfcn(n,m,xk+alphak*dk,nprob);wfnum=wfnum+1;
                             if fk2-fk1>sigma1*alphak*gk1'*dk;
                                 j=j+1;
                             else
                                 break;
                             end
                         end
                     end
                 end
             end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?