用odeint和curve_fit写出单摆拟合曲线的代码
时间: 2024-09-20 17:09:14 浏览: 31
要使用`odeint`从数值解的角度模拟单摆的运动并进行拟合,你需要首先定义单摆的动力学方程,然后利用`curve_fit`进行非线性最小二乘拟合。这里是一个简单的例子:
```python
import numpy as np
from scipy.integrate import odeint
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 单摆动力学模型
def single_pendulum(t, y, L, g):
theta, omega = y
return [omega, -g/L * np.sin(theta)]
# 假设给定的一些实验数据(时间、角度)
t_data = np.linspace(0, 2*np.pi, 100) # 摆动周期内的采样点
theta_data = np.sin(t_data) + 0.1 * np.cos(2*t_data) # 观察到的角度数据,加上噪声
# 模型参数(摆长L和重力加速度g),这里假设你知道它们的实际值
L = 1 # 摆长 (m)
g = 9.81 # 重力加速度 (m/s^2)
# 使用odeint模拟单摆运动
y0 = [np.pi/2, 0] # 初始条件,θ=π/2, ω=0
theta_simulated = odeint(single_pendulum, y0, t_data, args=(L, g))
# 定义拟合函数(根据模型转换为角度数据的形式)
def pendulum_function(angle_data, A, w0, phi):
return A * np.sin(w0 * t_data + phi)
# 利用curve_fit进行拟合
popt, _ = curve_fit(pendulum_function, t_data, theta_data, p0=[1, 2*np.pi, 0]) # popt是最佳拟合参数
# 计算拟合后的角度数据
theta_fitted = pendulum_function(t_data, *popt)
# 绘制原始数据、模拟结果和拟合曲线
plt.plot(t_data, theta_data, 'o', label='Data')
plt.plot(t_data, theta_simulated, '-r', label='Simulation')
plt.plot(t_data, theta_fitted, '-b', label='Fit')
plt.legend()
plt.xlabel('Time (s)')
plt.ylabel('Angle (rad)')
plt.title('Single Pendulum Motion and Fit')
plt.show()
阅读全文