Odeint在多个时期不一致,建模驱动摆

时间:2016-04-27 18:56:19

标签: python physics odeint

似乎有许多问题涉及钟摆建模和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结果达到稳定国家行为最快!我逻辑中的错误在哪里?

pendulum

1 个答案:

答案 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之间的时间范围内,您只能在这些程序变化下保证至少图形相似。