最小二乘法拟合圆心和半径
时间: 2024-12-28 16:14:23 浏览: 13
### 使用最小二乘法拟合圆的圆心位置与半径大小
为了使用最小二乘法来计算给定一系列二维平面上点集所构成的理想圆的中心坐标 \((xc, yc)\) 和其半径 \(R\) 的值,可以通过构建一个优化问题并利用 Python 中 `scipy.optimize` 库下的 `leastsq()` 函数解决此非线性方程组。
#### 构建残差函数
对于每一个采样点 \((xi, yi)\),定义该点到假设圆的距离与其实际测量之间的差异作为误差项:
\[ e_i = R - \sqrt{(x_i-x_c)^2+(y_i-y_c)^2} \]
总的目标是最小化所有样本点上的这种偏差平方和:
\[ E_{total}(x_c,y_c,R)=\sum^n_{i=1}\left[R-\sqrt{(x_i-x_c)^2+(y_i-y_c)^2}\right]^2 \]
其中 \(n\) 表示总的样本数量。这个过程实际上是在寻找最优参数组合使得上述目标函数达到极小值[^1]。
#### 实现代码片段
下面给出一段具体的Python实现方式,采用SciPy库来进行数值求解:
```python
import numpy as np
from scipy import optimize
def calc_R(xc, yc):
""" 计算所有数据点相对于估计圆心 (xc,yc) 的平均距离 """
return np.sqrt((x - xc)**2 + (y - yc)**2)
def f_2(c):
""" 计算每个点到当前猜测圆心的距离减去平均距离后的残差向量"""
Ri = calc_R(*c)
return Ri - Ri.mean()
# 假设已知的数据点集合
x = np.array([97, 80, 64, 53, ...])
y = np.array([77, 56, 45, 38, ...])
center_estimate = x.mean(), y.mean() # 初始猜測圓心為數據點坐標均值
center_2, ier = optimize.leastsq(f_2, center_estimate)
xc_2, yc_2 = center_2
Ri_2 = calc_R(xc_2, yc_2)
R_2 = Ri_2.mean()
residu = sum((Ri_2 - R_2)**2)
print('Circle Center:', (xc_2, yc_2))
print('Radius:', R_2)
```
这段程序首先定义了一个辅助函数 `calc_R()` 来帮助计算各个点至指定圆心间的欧氏距离;接着创建了另一个名为 `f_2()` 的匿名函数用来表示单个点位处的实际偏离情况——即理论半径同实测值得差距。最后调用了 SciPy 提供的功能强大的 `optimize.leastsq()` 方法完成最终的迭代寻优工作,并输出所得最佳拟合结果中的圆心位置以及相应的半径长度。
阅读全文