【優化方法】牛頓法實例


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


免責聲明!

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



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