非線性優化Ceres擬合圓

2021-09-08 16:55:10 字數 2043 閱讀 8619

已知圓方程

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,bmin​2

1​i=

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,bmin​2

1​i=

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都作為內參...