Python拟合半圆
时间: 2024-12-31 12:43:48 浏览: 8
### 半圆拟合算法的Python实现
为了实现半圆拟合,可以采用最小二乘法或其他优化技术来找到最佳匹配的半圆方程。下面展示了一种基于给定数据点进行半圆拟合的方法。
#### 定义目标函数
首先定义一个用于描述半圆的目标函数 `half_circle` ,该函数接受横坐标作为输入并返回对应的纵坐标值:
```python
import numpy as np
def half_circle(x, r=1.0, xc=0.0, yc=0.0):
""" 计算半圆上的 y 值 """
return yc + np.sqrt(r ** 2 - (x - xc) ** 2)
```
此部分来源于已有定义[^2]。
#### 数据准备
创建一些模拟的数据点,这些点应该大致分布在理想的半圆形路径附近。可以通过向理论位置添加随机噪声来生成这样的样本集合。
```python
np.random.seed(42) # 设置随机种子以便结果可重复
n_samples = 50 # 样本数量
noise_level = 0.1 # 添加到真实坐标的噪音水平
# 创建理想情况下的 x 和 y 座位
theta = np.linspace(-np.pi / 2, np.pi / 2, n_samples)
true_x = np.cos(theta)
true_y = np.sin(theta)
# 向真实的 xy 加入高斯白噪
noisy_x = true_x + noise_level * np.random.randn(n_samples)
noisy_y = true_y + noise_level * np.random.randn(n_samples)
```
#### 参数估计
利用SciPy库中的optimize模块来进行非线性最小平方误差拟合,寻找最优参数组合(即中心 `(xc, yc)` 及其半径 `r`)使得模型尽可能接近观测数据。
```python
from scipy.optimize import curve_fit
popt, pcov = curve_fit(half_circle, noisy_x, noisy_y, p0=[1., 0., 0.])
fitted_radius, fitted_center_x, fitted_center_y = popt
print(f"Fitted parameters:\nradius={fitted_radius:.3f}, center=( {fitted_center_x:.3f},{fitted_center_y:.3f})")
```
上述代码片段实现了通过曲线拟合法求解最合适的半圆参数,并打印出最终的结果。
#### 结果可视化
最后绘制原始散点图以及拟合后的半圆图形以直观比较两者之间的差异。
```python
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(noisy_x, noisy_y, label='Noisy Data')
xfit = np.linspace(min(true_x), max(true_x), 100)
yfit = half_circle(xfit, *popt)
plt.plot(xfit, yfit, color="red", lw=2, label=f'Fitted Half Circle\nradius={fitted_radius:.3f}')
plt.legend()
plt.show()
```
这段脚本会显示一张图表,在其中可以看到带有噪声的数据点和经过调整之后更加平滑的理想化半圆形状。
阅读全文