最優化——阻尼牛頓法


使用阻尼牛頓法求解:

 

利用Amijio非精確線搜索

初始點x0=[0,0]',經條件1e-6或n=2000

 

代碼:

%建立NTtest.m文件

clear all

clc

x0=[0,0]';

fun=@(x)100*(x(1)^2-x(2))^2+(x(1)-1)^2;

gfun=@(x)[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1), -200*(x(1)^2-x(2))]';

Hesse=@(x)[1200*x(1)^2-400*x(2)+2,-400*x(1);-400*x(1),200]';

[x,val,k]=minNT(fun,gfun,Hesse,x0)

 

%建立minNT.m文件

function [x,val,k]=minNT(fun,gfun,Hesse,x0)

%注意傳過來的是變量,而不是函數

%功能:用阻尼牛頓法求解無約束問題:min f(x)

%輸入:x0是初始點,梯度函數,Hesse陣的函數

%輸出:x,val是近似最優點和最優值,k是迭代次數

maxk=2000;%給出最大迭代次數

rho=0.5;sigma=0.4;gama=0.5;

epsilon=1e-6;

k=0;

while (k<maxk)

    gk=feval(gfun,x0);%計算梯度

    Gk=feval(Hesse,x0);%計算Hesse陣

    dk=-Gk\gk;%計算搜索方向

    if(norm(gk)<epsilon)

        break;

    end

   

   %Armijio線搜索尋找最佳步長alpha

   mk=0;

    while(mk<20)

        if(feval(fun,x0+rho*gama^mk*dk)<=feval(fun,x0)+sigma*rho*gama^mk*gk'*dk)

            alpha=rho*gama^mk;break;

        end

        mk=mk+1;    

    end

    x0=x0+alpha*dk;

    k=k+1;

end

   

x=x0;

val=feval(fun,x);

format short

end

  

結果:

 


x =

1.0000
1.0000


val =

2.1283e-15


k =

36

每天進步一點點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM