1.簡述
? ? ??
matlab實現(xiàn)最速下降法
定義:沿負梯度方向進行搜索的算法(負梯度方向為最速下降方向)
算法步驟:
步0:選取初始點x0,容許誤差是e=[0~1],令k=1
步1:計算目標函數(shù)的梯度gk=▽f(xk))
?
若 ||gk||<=e,即達到誤差要求,立即停止計算,并輸出xk作為近似最優(yōu)解。
步2:取搜索方向為dk=-gk(即負梯度方向)。
步3:利用線搜索技術(shù)確定步長σ
?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-606534.html
(這里采用Armijo準則來求步長)?
步長為α
k=β是給定的,所以要求出mk
Amrijo準則就是
(1)給定βε(0~1),αε(0,0.5),令m=0
(2)若不等式
f(xk+β^m*dk)<=f(xk)*β^m*gk'*dk
成立,則令mk=m,Xk+1=xk+β^m*dk.停止運算,輸出mk得到步長
(3)若不滿足上述不等式,則令m=m+1,然后回到第二步。
步4:確定步長后,令Xk+1=Xk+σk*dk,k=k+1,轉(zhuǎn)步驟1.
matlab 具體代碼如下:
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-606534.html
2.代碼
?
主程序:
%% ? 用最速下降法求最優(yōu)化解
f1204 = inline('x(1)*(x(1)-5-x(2))+x(2)*(x(2)-4)','x');%目標函數(shù)
grad=inline('[2*x(1)-5-x(2),-x(1)+2*x(2)-4]','x'); %目標函數(shù)的梯度函數(shù)
x0 = [1 4];
TolX = 1e-4;?
TolFun = 1e-9;
MaxIter = 100;
dist0=1;
[xo,fo] = Opt_Steepest(f1204,grad,x0,TolX,TolFun,dist0,MaxIter)
?
子程序:
function [xo,fo] = Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter)
% 用最速下降法求最優(yōu)化解
%輸入:f為函數(shù)名 grad為梯度函數(shù)
%x0為解的初值 TolX,TolFun分別為變量和函數(shù)的誤差閾值
%dist0為初始步長 MaxIter為最大迭代次數(shù)
%輸出: xo為取最小值的點 fo為最小的函數(shù)值
% f0 = f(x(0))
%%%%%%判斷輸入的變量數(shù),設(shè)定一些變量為默認值
if nargin < 7
? ? MaxIter = 100; %最大迭代次數(shù)默認為100
end
if nargin < 6
? ? dist0 = 10; %初始步長默認為10
end
if nargin < 5
? ? TolFun = 1e-8; %函數(shù)值誤差為1e-8
end
if nargin < 4
? ? TolX = 1e-6; %自變量距離誤差
end
%%%%%第一步,求解的初值的函數(shù)值
x = x0;
fx0 = feval(f,x0);
fx = fx0;
dist = dist0;
kmax1 = 25; %線性搜索法確定步長的最大搜索次數(shù)
warning = 0;?
%%%%%迭代計算求最優(yōu)解
for k = 1: MaxIter
? ? g = feval(grad,x);
? ? g = g/norm(g); %求在x處的梯度方向
? ? %%線性搜索方法確定步長
? ? dist = dist*2; %令步長為原步長的二倍
? ? fx1 = feval(f,x-dist*2*g);
? ? for k1 = 1:kmax1
? ? ? ? fx2 = fx1;
? ? ? ? fx1 = feval(f,x-dist*g);
? ? ? ? if fx0 > fx1+TolFun & fx1 < fx2 - TolFun %fx0 > fx1 < fx2,
? ? ? ? ? ? den = 4*fx1 - 2*fx0 - 2*fx2;num = den - fx0 + fx2; ?%二次逼近法
? ? ? ? ? ? dist = dist*num/den;
? ? ? ? ? ? x = x - dist*g; fx = feval(f,x); %確定下一點
? ? ? ? ? ? break;
? ? ? ? else
? ? ? ? ? ? dist = dist/2;
? ? ? ? end
? ? end
? ? if k1 >= kmax1
? ? ? ? warning = warning + 1; %無法確定最優(yōu)步長
? ? else
? ? ? ? warning = 0;
? ? end
? ? if warning >= 2|(norm(x - x0) < TolX&abs(fx - fx0) < TolFun)
? ? ? ? break;
? ? end
? ? x0 = x;
? ? fx0 = fx;
end
xo = x; fo = fx;
if k == MaxIter
? ? fprintf('Just best in %d iterations',MaxIter);
end
?
?
3.運行結(jié)果
?
?
?
到了這里,關(guān)于25.4 matlab里面的10中優(yōu)化方法介紹——最速下降法(matlab程序)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!