DoglegMethod——“狗腿”算法(上)

參考文獻:“Numerical Optimization”  ---Page71 Dogleg Method

Author:Jorge Nocedal & Stephen J. Wright


問題來源:對於最速下降法,本質的等式在於x(k+1) = x(k) + a(k)*d(k),x(k)爲定義域上的點,a(k)爲前進的步長,是一個標量,d(k)是前進的方向, 對於高維變量d(k)就是矢量,是一個列向量。一般常用的是取d(k)爲x(k)點負梯度方向,當然也可以用到海森陣,就是跟牛頓法很像的一系列算法。


非線性優化的問題本質在於如何尋找合適的a(k)和d(k)(這個本質僅僅是一個初學者看來的)。


參考文獻中首先講解的如何選取步長a(k),然後講解如何選取方向d(k),由於老師的作業僅僅是佈置了選取方向d(k)的一種方法——Dogleg算法的編程,所以這裏僅僅貼出如何選取d(k)的一種方法Dogleg算法的代碼,其中步長的選取非常粗糙,用了指數衰減的方法,但是由於優化的函數是一個嚴格凸的,所以步長的選取方法並不需要太過關心。


所優化的函數爲[x1,x2] = argmin(100*(x2-x1^2) )^2 + (1-x1)^2)


dogleg.m文件的代碼

clear;clc


x1 = 0:0.005:1;
x2 = 0:0.008:2;
ff = zeros(length(x1), length(x2));
for i = 1 : length(x1)
    ff(i, :) = 100 * (x2 - x1(i)^2).^2 + (1 - x1(i))^2;
end


x = [min(x1) + (max(x1) - min(x1)) * rand(1), min(x2) + (max(x2) - min(x2)) * rand(1)]';
a = 2;
d = -B(x)^-1 * g(x);
maxiter = 1000;
iter = 1;
rey = [];
rex1 = [];
rex2 = [];
while iter < maxiter
    rey = [rey, f(x)];
    rex1 = [rex1, x(1)];
    rex2 = [rex2, x(2)];
    if sum(abs(g(x))) < 0.00001
        break
    end
    iter = iter + 1;
    du = -g(x)' * g(x) * g(x) / (g(x)' * B(x) * g(x));
    dB = -B(x)^-1 * g(x);
    if a < 1
        d = a * du;
    else
        d = du + (a - 1) * (dB - du);
    end
    if f(x) > f(x + d)
        x = x + d;
    else
        a = a * 0.995;
    end
end
hold on
mesh(x2, x1, ff);
plot3(rex2, rex1, rey,'r','linewidth', 4)


f.m 文件

function y = f(x)
y = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
end


g.m 文件

function y = g(x)
y = [400 * (x(1)^2 - x(2)) * x(1) + 2 * (x(1) - 1), 200 * (x(2) - x(1)^2)]';
end


B.m文件

function y = B(x)
y = [400 * (3*x(1)^2- x(2)) + 2, -400 * x(1);...
    -400 * x(1), 200];
end


運行結果



紅色線是xk的移動方向,藍色區域是代表着目標函數的低窪地帶,最終xk收斂於函數的局部極小值點(這個函數的局部極小值就是全局極小值)

仍然存在的問題

1. 上課沒有認真聽= =,初始步長a是怎麼選的我沒記到筆記了,而且文獻裏也沒有……

2. 對於不知道函數關係式的梯度和海森陣該如何求解?是不是用f'(x) = ( f(x+t)-f(x) ) / t ; t->0 這樣的原理?

等下週上課再問問老師吧~ 


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