Python Odeint在多个周期内不一致,模拟驱动摆

Python Odeint在多个周期内不一致,模拟驱动摆,python,physics,odeint,Python,Physics,Odeint,关于钟摆建模和odeint,似乎有很多问题。我认为这个问题足够具体,可以单独提出。它涉及将时间数组传递给odeint 我正在模拟一个受驱动的阻尼摆。我希望经过一些周期后瞬态行为会消失,并绘制了我的角速度与时间的关系图来观察这一点我的问题是,改变周期数似乎不能提供一致的结果。我看不出代码或假设失败的地方。 from numpy import * from scipy.integrate import odeint import matplotlib.pyplot as plt #pendulum

关于钟摆建模和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)分别为140180和200的曲线图。我希望看到相同行为的延续,但是180周期的结果并没有失去瞬变,200周期的结果最快达到稳态行为!我的逻辑错在哪里


你有一个约为
L=1的利普希茨常数,它给出了时间差
dT
的误差放大系数
exp(L*dT)=exp(dT)
。仅考虑正常数值噪声约为
1e-16
,只需
dT=37
即可将该初始误差放大至约
1
,如
exp(37)*1e-16=1.17


如您所见,在从0到1200或更大的时间跨度内,算法执行过程中的任何细微变化都会导致轨迹出现看似随机的变化。在这些程序变化下,您只能保证在0到30之间的时间范围内至少有图形相似性。

谢谢。我意识到这种混乱的倾向,但这确实让我体会到了这种敏感性。那么,对于如此大的时间范围,机器精度相关的噪音阻止我做出精确的预测?奇怪的是,似乎产生稳定状态的周期的“良好选择”会产生完全符合我预期的相位图和庞加莱截面。但这可能是我的选择性偏见。你可能在这条道路上还有一些共鸣。对于物理摆,频率取决于能量,对于小能量,频率为1,当接近不稳定的驻点时,频率向0下降。因此,存在频率为0.7的能量,穿过该状态将增加混沌行为。