我正在使用scipy ode解决钟摆问题。
from scipy import *
import matplotlib.pyplot as plt
from scipy.integrate import ode
def pendulumdot(t, y, gamma, omega0, Fd):
theta, v = y[0], y[1]
return array([v, -2*gamma*v-omega0**2*sin(theta)+Fd*cos(2*pi*t)])
def pendulum_sample(theta0, thetadot0, gamma, omega0, Fd, t):
Theta0 = array([theta0, thetadot0])
r = ode(pendulumdot)
r.set_integrator('dopri5')
r.set_initial_value(Theta0)
r.set_f_params( gamma, omega0, Fd)
#r.set_jac_params()
theta = zeros(len(t))
thetadot = zeros(len(t))
theta[0] = theta0
thetadot[0] = thetadot0
for n in range(1, len(t)):
r.integrate(t[n])
assert r.successful()
theta[n] = (r.y)[0]
thetadot[n] = (r.y)[1]
return theta, thetadot
def pendulum_demo():
gamma = 0.1
omega0 = 10.0
theta0 = 0.0
thetadot0 = 0.0
Fd = 50.0
t1 = linspace(0, 200, 10000)
theta1, thetadot1 = pendulum_sample(theta0, thetadot0, gamma, omega0, Fd, t1)
plt.plot(t1, theta1)
t2 = linspace(0, 150, 10000)
theta2, thetadot2 = pendulum_sample(theta0, thetadot0, gamma, omega0, Fd, t2)
plt.plot(t2, theta2)
plt.show()
pendulum_demo()
我在不同的时间范围内绘制两个θ与时间的关系图,一个是(0,150),一个是(0,200)。我期望的是这两个数字在时间范围(0,150)中应该是相同的,但是,这不是我观察到的。我的脚本出了什么问题?感谢。
答案 0 :(得分:2)
您可能应该使用
中的完整初始化r.set_integrator('dopri5', atol=1, rtol = 1e-8)
r.set_initial_value(Theta0, t=t[0])
可让您控制绝对和相对误差阈值,并明确设置初始时间。
您的系统的Lipschitz常量L
约为或更大omega0**2=100
。误差传播由因子exp(L*(t_final-t))
支配。
例如,从时间50到时间150,此因子为exp(100*100)
,约为10^4343
。出于所有实际目的,这意味着最终值对初始值没有可辨别的依赖性,即系统是混乱的。
实际方面看起来比这个悲观估计要好一些,因为两条曲线都与约t=10
重合。这意味着,假设误差容限为1e-8
,exp(L*10)<=1e+8
或L=1.84...
。这为大小100的间隔提供了exp(L*100)=1e+80
的误差放大系数,它仍然足以使结果混乱。
使用错误阈值的实验表明,约t=8.4
处的初始分歧点对相对误差不敏感。此外,分歧(在我的实验中,而不是你的图片)产生dt=1
中从1到24的差异增长,这给出了L=3
,这仍然与最后的估计一致并且远小于理论L=100
。
为了更好地了解会发生什么,您还应该调查衍生图,
plt.plot(t1,thetadot1,t2,thetadot2)
plt.show()
惊人地证明了混乱行为的起源。