利用導(dǎo)數(shù)信息的方法皆為間接方法。在無約束優(yōu)化法最開始介紹時(shí)示弓,提到迭代形式的優(yōu)化方法關(guān)鍵步驟是確定搜索方向和步長(zhǎng)讳侨。間接方法更為關(guān)注搜索方向的確定,其原則使得并滿足奏属。換句話說跨跨,在每次迭代中,只要能保證囱皿,任何方向都是允許的勇婴。
那對(duì)于某個(gè)充分下的,利用泰勒公式
顯然,只要滿足铆帽,就能保證咆耿,這說明搜索方向與目標(biāo)函數(shù)在點(diǎn)處梯度的方向之間的夾角必大于90°德谅。
確定方向后爹橱,利用一維搜索技術(shù)進(jìn)行步長(zhǎng)因子的確定,可以是精確的窄做,也可是非精確的愧驱。如果有直接的關(guān)于步長(zhǎng)因子的表達(dá)式,直接求得即可椭盏。在后續(xù)的相關(guān)間接方法中组砚,我們主要關(guān)心方向的確定,步長(zhǎng)因子的確定就方法的不同給出一些經(jīng)驗(yàn)建議掏颊。
最速下降法
最速下降法顧名思義就是尋找使得目標(biāo)函數(shù)在處下降最快的方向糟红,也就是使得最小艾帐,和之間的夾角等于180°,搜索方向取負(fù)梯度方向盆偿,令,則柒爸。如果使用一維精確搜索確定步長(zhǎng)因子,可以證明前后兩次的搜索方向是正交的事扭。
Algorithm 1 Steepest Descent Method
function [x_min,f_min] = SteepestDescentMethod(func,gfunc,x0,options)
if nargin<3
options.tol = 1e-12;
options.iterNum = 1000;
options.bracketMethod = '';
options.linearSrcMethod = '';
options.plot2.Flag = 0;
options.plot2.x = [];
options.plot2.y = [];
options.plot2.z = [];
end
tol = options.tol;
iterNum = options.iterNum;
plot2 = options.plot2;
if length(x0)~=2
plot2.Flag = 0;
end
x_min = x0;
f_min = func(x0);
xk = x0;
if plot2.Flag == 1
figure,subplot(1,2,1),axis equal, hold on;
contourf(plot2.x,plot2.y,plot2.z,30,'linestyle','-')
colormap('jet');
tempf =func(xk);
end
while(iterNum)
d = -gfunc(xk);
lamdaFuncH = @(lamda)(func(xk+lamda.*d));
[a,b,c] = bracketAdvanceBack(lamdaFuncH,0,0.01);
lamda = GoldSection(lamdaFuncH,a,c,1e-12);
xk1 = xk + lamda.*d;
f =func(xk1);
if plot2.Flag == 1
tempf = [tempf,f];
subplot(1,2,1),plot([xk(1),xk1(1)],[xk(2),xk1(2)],'-o','LineWidth',2);
subplot(1,2,2),plot(tempf,'-b.','LineWidth',2); grid on;
axis([0,options.iterNum,0,func(x0)]);
xlabel('Step');
ylabel('Objective Function Value');
pause(0.1)
end
xk = xk1;
iterNum = iterNum - 1;
if sqrt(sum(abs(gfunc(xk))))<tol||iterNum == 0
x_min = xk;
f_min = f;
break;
end
end
最速下降法的收斂速度是線性的捎稚。梯度是函數(shù)的局部性質(zhì),從局部上看求橄,在該點(diǎn)附近函數(shù)的下降最快今野,但是總體看則走了許多彎路,因此函數(shù)值下降的并不快罐农。梯度法向極小點(diǎn)逼近路勁是鋸齒路線条霜,越接近極小點(diǎn),鋸齒越細(xì)啃匿,前進(jìn)速度越慢蛔外。