Нелинейное решение ОДУ по odeint - PullRequest
1 голос
/ 23 февраля 2020

Я должен решить следующее дифференциальное уравнение:

enter image description here

или

enter image description here

Без термина F_1 код прост. Но я не могу решить это с включенным термином F_1, хотя знаю, что решение должно выглядеть как колебание с затухающими гармониками c.

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt

def harmonic_motion(X,t,k,m,tau):
    x,v=X
    F=-(k/m)*x


    F_1=tau/v*(np.gradient(x,t)**2) # This line doesn't work. 

    dx_dt=v
    dv_dt=F-F_1
    dX_dt=[dx_dt,dv_dt]
    return dX_dt


m=1
k=1
tau=0.1
X0=-3
V0=0

t = np.linspace(0, 15, 250)
sol = odeint(harmonic_motion, [X0,V0], t,args=(k,m,tau))
x=sol[:,0]
v=sol[:,1]

plt.plot(t,x,label='x')
plt.plot(t,v,label='v')
plt.legend()
plt.xlabel('t (s)')
plt.ylabel('x,v (m,m/s)')
plt.show()

1 Ответ

0 голосов
/ 24 февраля 2020

Правильная версия для пружины с воздушным трением:

m*x'' + tau*abs(x')*x' + k*x = 0

Система первого порядка для этого

def harmonic_motion(X,t,k,m,tau):
    x,v = X
    return  v, -(tau*abs(v)*v + k*x)/m

Фазовый график этого теперь должен дать хорошую спираль Происхождение.

...