已知圓方程
r 2=
(x−x
0)2+
(y−y
0)
2r^2=(x-x_0)^2+(y-y_0)^2
r2=(x−
x0)
2+(y
−y0
)2其中x0,y0,r為曲線待擬合引數。
假設我們有n個關於x,y的觀測資料點,想根據這些資料點求出曲線的引數。那麼可以求解下面的最小二乘問題。
為了擬合圓方程,直接用y為x的函式
min a
,b12
∑i=1
n∥yi
−f(x
i)))
∥2
\min_\frac\sum_^\left \| y_-f(x_i))) \right \|^
a,bmin2
1i=
1∑n
∥yi
−f(x
i))
)∥2會牽涉到正負號的問題。
定義殘差函式如下(這個如何表示歡迎指正)
min a
,b12
∑i=1
n∥r2
−(x−
x0)2
+(y−
y0)2
))∥2
\min_\frac\sum_^\left \|r^2-(x-x_0)^2+(y-y_0)^2)) \right \|^
a,bmin2
1i=
1∑n
∥∥r
2−(x
−x0
)2+(
y−y0
)2)
)∥∥
2實現**如下
**#include #include #include #include using namespace std;
struct cicle_fitting_cost
// 殘差的計算
template bool operator() (
const t* const x0y0r, // 模型引數,有3維
t* residual ) const // 殘差
const double _x, _y; // x,y資料
};int main ( int argc, char** ar** )
; // abc引數的估計值
vectorx_data, y_data; // 資料
cout<<"generating data: "<(
new cicle_fitting_cost ( x_data[i], y_data[i] )
),nullptr, // 核函式,這裡不使用,為空
x0y0r // 待估計引數);}
// 配置求解器
ceres::solver::options options; // 這裡有很多配置項可以填
options.linear_solver_type = ceres::dense_qr; // 增量方程如何求解
options.minimizer_progress_to_stdout = true; // 輸出到cout
ceres::solver::summary summary; // 優化資訊
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
ceres::solve ( options, &problem, &summary ); // 開始優化
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::durationtime_used = chrono::duration_cast>(t2-t1 );
cout<<"solve time cost = "《曲線擬合相關係數參考
tensorflow實現非線性擬合
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x data np.linspace 0.5,0.5,200 np.newaxis 使得維度為 200,1 noise np.random.norma...
非線性優化
問題的一般表達 x 是 n 維實向量 x x x t in r n,s是 r n 的子集,f 0 x f m x 是x相關的實值函式。我們所要解決的主要是以下最小問題的變體 min f 0 x s.t.f j x 0,j 1.m,x in s,其中 可以是 geq,leq or f 0 是問題的目標...
非線性優化
目的 因為雜訊!為了減少雜訊帶來的影響。現實世界點p,在相機座標系下座標p x,y,z 落在投影平面上的座標為 u,v 一般把 u,v 寫成齊次座標 所謂齊次座標,是為了方便進行矩陣的運算,在向量上面加乙個維度,一般把增加的維度預設成1 焦距fx,fy,相機座標系和成像平面的平移cx,cy都作為內參...