Python 二阶微分方程组

Python 二阶微分方程组,python,scipy,differential-equations,Python,Scipy,Differential Equations,我需要想象连接到振荡器的钟摆。我有一个二阶微分方程组: (m1+m2)*x1'+m2*l*(x2'*cos(x2)-x2'*x2'*sin(x2))+c*q1=0 x1'*cos(x2)-x1'*x2'*sin(x2)+l*x2'+x1'*x2'*x2'*sin(x2)+g*x2'*sin(x2)=0 m1——振荡器的质量 m2——摆锤的质量 l—摆长 c-弹簧率 g=9.8 x1-振荡器的起始位置 x2-摆角 我试图找到python解微分方程的库。我发现了希皮。因此,我需要制作y1=x1'和

我需要想象连接到振荡器的钟摆。我有一个二阶微分方程组:

(m1+m2)*x1'+m2*l*(x2'*cos(x2)-x2'*x2'*sin(x2))+c*q1=0
x1'*cos(x2)-x1'*x2'*sin(x2)+l*x2'+x1'*x2'*x2'*sin(x2)+g*x2'*sin(x2)=0
m1——振荡器的质量
m2——摆锤的质量
l—摆长
c-弹簧率
g=9.8
x1-振荡器的起始位置
x2-摆角
我试图找到python解微分方程的库。我发现了希皮。因此,我需要制作
y1=x1'
y2=x2'
,然后为这个库表示
y1'
y2'

from math import cos, sin, pi

def vectorfield(w,p):
    q1, y1, q2, y2 = w
    m1, m2, c, l, g = p

    f = [y1,
         (-m2*l*(c*q1*cos(q2)/(m1+m2) - m2*l*y2*y2*sin(q2)*cos(q2)/(m1+m2) + y1*y2*sin(q2)
          - y1*y2*y2*sin(q2) - g*y2*sin(q2)) / (l - m2*l*cos(q2)*cos(q2)/(m1+m2))*cos(q2)
          + m2*l*y2*y2*sin(q2) - c*q1) / (m1 + m2),
         y2,
         (c*q1*cos(q2)/(m1+m2) - m2*l*y2*y2*sin(q2)*cos(q2)/(m1+m2) + y1*y2*sin(q2)
          - y1*y2*y2*sin(q2) - g*y2*sin(q2)) / (l - m2*l*cos(q2)*cos(q2)/(m1+m2))
         ]
    return f

def customCos(val):
    return cos(pi*val/180)

def customSin(val):
    return sin(pi*val/180)
然后将此函数放入
odeint

m1 = 1.0
m2 = 0.5
# Spring constants
c = 200.0
l = 0.1
g = 9.8

# Initial conditions
# x1 and x2 are the initial displacements; y1 and y2 are the initial velocities
q1 = 1.0
y1 = 0.0
q2 = 0.5
y2 = 0.0

stoptime = 10.0
numpoints = 20

t = [stoptime * float(i) / (numpoints - 1) for i in range(numpoints)]

# Pack up the parameters and initial conditions:
p = [m1, m2, c, l, g]
w0 = [q1, y1, q2, y2]

# Call the ODE solver.
wsol = odeint(vectorfield, w0, t, args=(p,))

但结果看起来真的不对。那么,我的计算是错误的还是我用错了这个库?

试试
def vectorfield(w,t,p):
。即使您没有时间依赖性,积分器也可能需要它。您的初始方程(除了
q1
x1
)看起来不正确,尤其是第二个方程中的三阶导数项。弹簧车摆方程可以在几个地方找到,例如,在Euler-Lagrange方程
d/dt(dL/d(q'))=dL/dq
中,右侧没有额外的时间导数。