似乎有许多问题涉及钟摆建模和odeint。我相信这个问题足够具体,可以独立存在。它关注的是将时间数组传递给odeint。
我正在模拟一个驱动的阻尼摆。我预计瞬态行为会在一段时间后消失,并且已经绘制了我的角速度与时间的关系来观察它。 我的问题是,改变句点数似乎不能提供一致的结果。我没有看到代码或我的假设失败的地方。
from numpy import *
from scipy.integrate import odeint
import matplotlib.pyplot as plt
#pendulum diff eq
def pendulum(y,t,b,gamma,drivefreq):
phi,omega=y
dydt = [omega,-b*omega - sin(phi) + g*cos(drivefreq*t)]
return dydt
#pendulum parameters: dampening, force amplitude, drivefreq
b=0.05; g=0.4; drivefreq=0.7
args=(b,g,drivefreq)
#num pts per period, num periods, time array
N=256; nT=200;
t=linspace(0,nT*2*pi/drivefreq,nT*N)
上述问题是否有问题?这里使用非整数值是不好的形式吗? Linspace应该仍然提供一个不断间隔的数组。我已经看到其他例子成功地做到了这一点...我的想法是将时间基于驾驶时间并设置一些数字,每个时期256点。这有错吗?
#initial conditions
y0= [0,0] #[phi0,omega0]
#run odeint
out=odeint(pendulum, y0,t,args)
omega = out[:,1]
#plot ang velocity vs time
fig=plt.figure('ang velocity vs time')
plt.plot(t,omega)
以下是周期数(nT)等于140,180和200的图。我期望看到相同行为的延续,但180周期结果不会失去其瞬态并且200结果达到稳定国家行为最快!我逻辑中的错误在哪里?
答案 0 :(得分:1)
Lipschitz常数约为L=1
,对于时间差exp(L*dT)=exp(dT)
,其误差放大系数为dT
。只考虑大约1e-16
的正常数值噪声,只需要dT=37
将此初始误差放大到大约1
的贡献,为exp(37)*1e-16 = 1.17
。
如您所见,在0到1200或更大的时间范围内,即使算法执行中最微小的变化也会导致轨迹中看似随机的变化。在0到30之间的时间范围内,您只能在这些程序变化下保证至少图形相似。