写一个水晶球拟合的脚本
时间: 2024-05-11 12:18:45 浏览: 136
拟合数据_数据拟合_多项式拟合_
好的,以下是一个简单的水晶球拟合的 Python 脚本:
```python
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 定义拟合函数
def sphere(x, y, z, a, b, c, r):
return (x - a) ** 2 + (y - b) ** 2 + (z - c) ** 2 - r ** 2
# 生成数据
x = np.random.uniform(-10, 10, size=100)
y = np.random.uniform(-10, 10, size=100)
z = np.random.uniform(-10, 10, size=100)
noise = np.random.normal(0, 0.1, size=100)
r = np.sqrt(x ** 2 + y ** 2 + z ** 2) + noise
# 调用 curve_fit 进行拟合
popt, pcov = curve_fit(sphere, (x, y, z), r)
# 输出拟合参数
print("a =", popt[0])
print("b =", popt[1])
print("c =", popt[2])
print("r =", popt[3])
# 绘制数据散点图和拟合结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=r, cmap='viridis')
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x_fit = popt[3] * np.cos(u) * np.sin(v) + popt[0]
y_fit = popt[3] * np.sin(u) * np.sin(v) + popt[1]
z_fit = popt[3] * np.cos(v) + popt[2]
ax.plot_wireframe(x_fit, y_fit, z_fit, color='r')
plt.show()
```
其中,`sphere()` 函数为拟合的模型,使用了三维空间中的球面方程。`curve_fit()` 函数是 scipy 库中用于非线性拟合的工具函数。本例中使用了 `np.random` 生成了一些随机数据,然后将这些数据传入 `curve_fit()` 函数中,得到拟合结果。最后,使用 `matplotlib` 库绘制了散点图和拟合结果。
阅读全文