Кажется, есть много вопросов, касающихся моделирования маятника и одеинта. Я считаю, что этот вопрос достаточно конкретен, чтобы стоять сам по себе. Он связан с передачей массива времени в 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 достигает установившегося режима поведения. максимально быстро! Где ошибка в моей логике?