一、算法原理
1、首先了解一個概念,什麼式無約束最優化。
無約束優化問題就是在x∈R^n的範圍內,找到一點x*,使得f(x*)<f(x)對於任意x∈R^n都成立。點x*就是全局最優解。
其一般形式爲 ,x∈R^n。
2、假設函數爲f(x),最速下降法通過給定一個初始點xk,選擇xk處的負梯度方向爲最速下降方向,然後進行線搜索來確定步長。
其迭代公式爲:,
其中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)帶入迭代公式;
(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