1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| function ZN_Newton(fun,x0,epsilon)
clc disp('==================阻尼Newton法==================') syms x1 x2 n = length(x0); k = 0;
grad_f = [diff(fun,x1);diff(fun,x2)]; Hesse = hessian(fun,[x1,x2]); x = zeros(n,10); y = zeros(n,10); index = 1; x(:,index) = x0;
while(true) syms lamuda real gk = subs(grad_f,[x1;x2],x(:,index)); gk = double(gk); gk_Hesse = subs(Hesse,[x1;x2],x(:,index)); y(:,index) = gk; if(norm(gk) > epsilon) dk = - gk_Hesse^-1 * gk; f1 = subs(fun,[x1;x2],x(:,index)+lamuda * dk); f1 = diff(f1); lamuda = solve(f1); lamuda = max(lamuda); if(lamuda ~= 0) x(:,index+1) = x(:,index) + lamuda*dk; else break; end else val = x(:,index); fprintf('阻尼Newton所求的函数为:%s\n迭代次数为;%d次\n',fun,k) str = ['最优解为:[',num2str(val'),']']; disp(str) break; end index = index + 1; k = k + 1; end end
|