DoglegMethod 「狗腿」演算法(上)

2021-06-19 07:59:57 字數 2100 閱讀 2944

參考文獻:「numerical optimization」  ---page71 dogleg method

author:jorge nocedal & stephen j. wright

非線性優化的問題本質在於如何尋找合適的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;

endx = [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

enditer = 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);

endif f(x) > f(x + d)

x = x + d;

else

a = a * 0.995;

endend

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 這樣的原理?

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

DoglegMethod 「狗腿」演算法

問題 對於最速下降法,本質的等式在於x k 1 x k a k d k x k 為定義域上的點,a k 為前進的步長,是乙個標量,d k 是前進的方向,對於高維變數d k 就是向量,是乙個列向量。一般常用的是取d k 為x k 點負梯度方向,當然也可以用到海森陣,就是跟牛頓法很像的一系列演算法。非線...

Dogleg「狗腿」最優化演算法

近期剛學習了dogleg狗腿最優化演算法,老師給出了乙個大體的框架並給出了乙個練習,讓我們用程式去實現它,鑑於本人剛剛開始接觸最優化,對matlab語言的使用也很生疏,在網上查閱了大量的資料,乙個通宵把演算法寫出來,並在matlab中得到了驗證。老師給出的練習為 主程式 demo dogleg pr...

狗腿子的一天

早上我睡過了,打的衝到公司,還好,沒過9 30。過了的話,就要扣50元了。諷刺的是,這條規矩還是我提出來的,作法自縛。呸,還敢拿商鞅來做比喻!什麼東西。今天主要的功德是完成了歌德 邱哥的設想 多條記錄更新時,他那邊呼叫我這邊的資料介面,傳給我的不是sql語句集合,而是xml,由我自己根據這堆資料來更...