0. 前言
上一節中已經介紹了牛頓法的一些原理,在本節中舉個具體例子,利用牛頓法求解函數最小值。
1. 例子
求解下列函數最小值:
由於這個函數較為簡單,所以利用f對x、y分別求偏導數,再令偏導數等於0,就可以求得極值點,又該函數是凸函數(如果分析不出,可視化函數,如下圖),所以極值點就是最小值點,故最小值點(-1,1.5).在這里的話,利用牛頓迭代法求解函數最小值。
步驟:
2. 實施細節
%% 部分參考【1】 % objective function: f(a,b) = 2*a^2 + b^2 + 2*a*b + a - b clear;clc;close A=[4,2;2,2]; x=[2;-2]; tmp=[0;0]; b=[0;0]; delta = 1.0e-8; %前后兩次迭代差值 error=1; k=1; max_iters = 10000; history = zeros(max_iters,2); while(k<=max_iters && error > delta) b=[4*x(1,1)+2*x(2,1)+1;2*x(2,1)+2*x(1,1)-1]; tmp=x - inv(A)*b; error=norm(x-tmp,2); x=tmp; history(k,1) = x(1); history(k,2) = x(2); k = k + 1; end x1=x(1,1); x2=x(2,1); f=2*x1*x1+x2*x2+2*x1*x2+x1-x2; fprintf('a=%f,b=%f,f=%f,k=%f',x1,x2,f,k-1); %% 繪圖 [X,Y] = meshgrid(-4:.2:4); % 產生網格數據X和Y len = size(X); Z = 2.* power(X,2) + power(Y,2) + 2* X.*Y + X - Y; [DX,DY] = gradient(Z,0.2,0.2); % 計算曲面上各點處的梯度 subplot(2,2,1); surfc(X,Y,Z) xlabel('x');ylabel('y');zlabel('z'); hold on; subplot(2,2,2); contour(X,Y,Z,50) ; % 繪制等高線 title('等高線') subplot(2,2,3); quiver(X,Y,DX,DY); % 繪制梯度場 title('梯度場') subplot(2,2,4); contour(X,Y,Z,50) ; % 繪制等高線 hold on; quiver(X,Y,DX,DY) ; % 繪制梯度場 title('梯度場 + 等高線') xlabel('x'); ylabel('y'); h = get(gca,'Children'); % 獲取當前axes對象的所有子對象的句柄 set(h, 'Color','k'); % 設置當前axes對象的所有子對象的顏色為黑色 %% 繪制牛頓法迭代軌跡 x0 = [2,-2]; track = [x0; history]; hold on; subplot(2,2,4); plot(track(1:3,1),track(1:3,2),'rx','markersize',5,'linewidth',1); plot(track(1:3,1),track(1:3,2),'b--','markersize',1,'linewidth',1);
結果:
a=-1.000000,b=1.500000,f=-1.250000,k=2.000000>>
參考文獻
【1】 https://zhidao.baidu.com/question/198040354.html