手寫高斯牛頓法

2021-10-25 07:04:02 字數 2103 閱讀 1268

cmake_minimum_required

(version 3.15

)project

(guassnewton)

set(cmake_cxx_standard 14

)#opencv

find_package

(opencv required)

include_directories($)

#eigen

include_directories

("/usr/include/eigen3"

)add_executable

(guassnewton main.cpp)

target_link_libraries

(guassnewton $

)

#include

#include

#include

#include

#include

using

namespace std;

using

namespace eigen;

intmain()

//開始高斯牛頓迭代

//設定迭代次數

int iterations =

100;

//本次迭代和上次迭代的cost

double cost =

0, lastcost =0;

//開始及時,當前時間點儲存到t1中

chrono::steady_clock::time_point t1 = chrono::steady_clock::

now();

//牛頓高斯演算法迭代iterations次

for(

int iter =

0; iter < iterations;

++iter)

//求解線性方程hx=b

vector3d dx = h.

ldlt()

.solve

(b);

//如果方程無解,那麼dx[0]是非法字元nan,退出迭代if(

isnan

(dx[0]

))//如果本次迭代誤差大於上次誤差,演算法結束,退出迭代

if(iter >

0&& cost >= lastcost)

//進行估計引數的增量更新,儲存本次代價

ae +

= dx[0]

; be +

= dx[1]

; ce +

= dx[2]

; lastcost = cost;

//輸出本次迭代資訊

cout <<

"total cost:"

<< cost <<

",\t\tupdate:"

<< dx.

transpose()

<<

"\t\testimatec:"

<< ae <<

","<< be <<

","<< ce << endl;

}//及時結束,獲取當前時間賦給t2

chrono::steady_clock::time_point t2 = chrono::steady_clock::

now();

//計算演算法耗時並輸出

chrono::duration<

double

> time_used = chrono::duration_castdouble

>>

(t2 - t1)

; cout <<

"solve time cost = "

<< time_used.

count()

<<

" seconds. "

<< endl;

//輸出最終演算法迭代結果

cout <<

"estimated abc = "

<< ae <<

", "

<< be <<

", "

<< ce << endl;

return0;

}

手寫系列之手寫高斯牛頓法 基於Eigen

重複造輪子雖然很多人不推薦,但是個人認為,不重複造一下輪子,也就不能真正的懂輪子的寫作邏輯優點和考慮,更別說優化輪子.會導致像高中一聽就會,一做就錯的感覺,所以筆者挑選一下極具代表性的演算法進行手寫,收貨頗豐.本 基於高翔博士 include include include opencv2 open...

梯度下降,牛頓法 ,高斯牛頓法

出處 線性最小二乘問題,我們可以通過理論推導可以得到其解析解,但是對於非線性最小二乘問題,則需要依賴迭代優化的方法,梯度下降主要是從一階目標函式的一階導推導而來的,形象點說,就是每次朝著當前梯度最大的方向收斂 二牛頓法是二階收斂,每次考慮收斂方向的時候,還會考慮下一次的收斂的方向是否是最大 也就是梯...

手寫高斯牛頓曲線擬合(c

擬合曲線 取100個帶有高斯雜訊的數,利用高斯牛頓法進行擬合求取估計值 a b c 主要步驟 1.構造誤差項 2,求雅克比,以及cost 3,判斷cost是否小於上次cost,小 執行4,大 輸出結果 4,求h g 5求dx 6,更新估計量,到步驟2 高斯牛頓法練習 created by fangu...