1 function[x,val,k]=dampnm(fun,gfun,Hess,x0) 2 %功能:用阻尼牛頓法求解無約束優化問題:minf(x); 3 %輸入:x0是初始點,fun,gfun,Hess分別是目標函數和梯度Hess陣函數; 4 %輸出:x,va1分別是近似最優解和近似最優值,k是迭代次數; 5 maxk = 5000; 6 rho = 0.55; 7 sigma =0.4; 8 k = 0; 9 epsion = 1e-8; 10 while (k<maxk) 11 gk=feval(gfun,x0); 12 Gk=feval(Hess,x0); 13 dk=-inv(Gk)*transpose(gk); 14 if(norm(dk)<epsion) 15 break; 16 end 17 m=0; 18 mk=0; 19 while(m<20) 20 if(feval(fun,x0+rho^m*dk)<=feval(fun,x0)+sigma*rho^m*gk*dk) 21 mk=m; 22 break; 23 end 24 m=m+1; 25 end 26 x0=x0+rho^mk*dk; 27 k=k+1; 28 end 29 x=x0; 30 val=feval(fun,x);
1 function y = fun(x) 2 %原函數 3 y = (1 - x(1))^2 + 100*(x(2)-x(1)^2)^2;
1 function g = gfun(x) 2 %求一階偏導函數 3 g = [-2+2*x(1)-400*x(1)*(x(2)-x(1)^2),200*(x(2)-x(1)^2)];
1 function He = Hess(x) 2 n = length(x); 3 He = zeros(n,n); 4 %求二階偏導函數 5 He = [2-400*(x(2)-3*x(1)^2),-400*x(1);-400*x(1),200];
注意修改原函數,一階偏導函數,二階偏導函數。