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 достигает установившегося режима поведения. максимально быстро! Где ошибка в моей логике?

маятник


person suneater    schedule 27.04.2016    source источник


Ответы (1)


У вас есть константа Липшица около L=1, что дает коэффициент увеличения ошибки exp(L*dT)=exp(dT) для разницы во времени dT. Только с учетом нормального числового шума около 1e-16 требуется только dT=37, чтобы увеличить эту начальную ошибку до вклада около 1, как exp(37)*1e-16 = 1.17.

Как видите, на промежутке времени от 0 до 1200 и более даже малейшее изменение в выполнении алгоритма приведет к кажущимся случайным изменениям траектории. У вас есть гарантия по крайней мере графического сходства при этих процедурных вариациях для временного промежутка от 0 до примерно 30.

person Lutz Lehmann    schedule 27.04.2016
comment
Спасибо. Я знал о такой склонности к хаосу, но это действительно заставляет меня ценить чувствительность. Значит, для таких больших таймфреймов шум, связанный с машинной точностью, не позволяет мне делать точные прогнозы? Странно то, что хороший выбор периодов, которые, по-видимому, создают устойчивое состояние, приводит к фазовым графикам и сечениям Пуанкаре, которые полностью соответствуют моим ожиданиям. Хотя, возможно, это моя избирательная предвзятость. - person suneater; 27.04.2016
comment
Кроме того, у вас может быть некоторый резонанс на пути. Для физического маятника частота зависит от энергии, давая частоту 1 для малых энергий и падая до 0 при приближении к неустойчивой стационарной точке. Таким образом, существует энергия с частотой 0,7, и пересечение этого состояния добавит хаотичности. - person Lutz Lehmann; 27.04.2016