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...