MATLAB無約束多維極值——最速下降法

一、算法原理

1、首先了解一個概念,什麼式無約束最優化。

無約束優化問題就是在x∈R^n的範圍內,找到一點x*,使得f(x*)<f(x)對於任意x∈R^n都成立。點x*就是全局最優解。

其一般形式爲        min[f(x)] ,x∈R^n。

2、假設函數爲f(x),最速下降法通過給定一個初始點xk,選擇xk處的負梯度方向爲最速下降方向,然後進行線搜索來確定步長。

其迭代公式爲:x(k+1)=xk-a*gradient(f)/norm(gradient(f)),

其中a爲步長,∇f(xk)=gradient(f)/norm(gradient(f))爲梯度。

步長a要滿足,f(x(k+1))=min(f(x(k+1))

3、算法步驟,整個步驟分爲兩大部分:按照迭代公式的循環迭代,步長a的確定。

我們以二維極值問題f=x1.^2+25*x2.^2,爲例。

(1)給定初始點[2 2],和迭代精度tol(可設置爲默認值);

(2)求其梯度∇f(xk)=gradient(f)/norm(gradient(f));

(3)帶入迭代公式x(k+1)=xk-a*gradient(f)/norm(gradient(f))

(4)步長的確定,將上一步的迭代公式代入f=x1.^2+25*x2.^2,對其求導,導數爲零點的a就式最佳步長。

(5)將求得的步長a帶入迭代公式,判斷||梯度值||是否滿足精度要求,不滿足要求更新當前梯度值,,繼續求步長。不斷循環,直至滿足要求。

二、MATLAB程序

clc
clear
f=@(x1,x2) x1.^2+25*x2.^2;
[x,result]=Min_TD(f,[2;2]);
function [x,result]=Min_TD(f,x0,tol)%f爲匿名函數句柄,x0爲初始點,tol爲精度
if nargin == 2
    tol=1e-6;
end
x01=x0(1);
x02=x0(2);
f_sym=sym(f); %將匿名函數轉化爲符號函數
%% F_td爲計算梯度值  f_td爲了計算當前梯度值
F_td=matlabFunction(gradient(f_sym));%計算該函數梯度,並取得梯度函數句柄
f_td=F_td(x01,x02); %計算當前的梯度值
d_k=-f_td/norm(f_td);%下降方向
%% 尋找最佳迭代步長 alfa
while norm(f_td) > tol %當前梯度值不滿足要求
    syms alfa
    x1=x0(:)+alfa*d_k;%將這個點帶入迭代表達式,求alfa 
    x11=x1(1);
    x12=x1(2);
    fx1=f(x11,x12);%計算x1帶入後的原函數表達式
    d_x1=diff(fx1);%對原函數表達是式求導
    d_alfa=double(solve(d_x1));%求解表達式爲0時的alfa(導數爲零時的點爲極小值點)
    
    x0=x0(:)+d_alfa*d_k;%進行迭代
    x01=x0(1);
    x02=x0(2);
    f_td=F_td(x01,x02);%當前梯度值
    if norm(f_td) < tol %滿足要求,退出
        break;
    end
    d_k=-f_td/norm(f_td);%否則,繼續迭代
end
x=x0;
result=f(x(1),x(2));
end

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章