如何使Python解决此二阶非线性ODE?

时间:2019-08-04 16:56:54

标签: python ode

我目前正在研究拉格朗日力学,大部分情况下都进展顺利,但是我决定尝试一下计算机练习,但是我不知道如何使Python解决这类方程式。

我要解决的二阶非线性ODE是:

enter image description here

y的初始值为y0 = 0。

解决一个正常的一阶方程很容易,因为您只需创建一个函数使其等于某个值,然后使用odeint。没问题。但是现在我有了一个二阶方程,而且我不知道如何告诉odeint或函数我要查找的内容是两次微分。

我尝试使用各种数量的积分和微分功能(符号功能和其他功能),诸如此类:

y'微分= RHS

y'=关于t的RHS集成

依此类推,但似乎没有任何效果。要么它告诉我无法调用我的函数,要么某些内容不具有属性,或者存在一些无效的限制等等。

这是我现在拥有的代码(准系统),在这里我没有尝试过任何技巧来使其正常工作,并且如果它是一阶命令,它只是返回函数的结果:

#Setting up the derivative
def model(y,t):
    M = g = R = 1
    m = 0.7

    k = g/(R*(M+m))
    return k*(m-M*np.sin(y))

#Initial condition
y0 = 0

#Time interval
t = np.linspace(0,20,1000)

#solve ODE
y = odeint(model,y0,t)

预期结果应该是摇摆不定的,但是当然这不是正确的,因为它是错误的。我公认对Python来说还很陌生,而且总体上对代码的掌握也很差,所以有人可以在这里帮助我吗?

1 个答案:

答案 0 :(得分:2)

您需要将二阶方程转换为具有2个分量的一阶系统

def model(u,t):
    y, v = u
    M = g = R = 1
    m = 0.7

    k = g/(R*(M+m))
    return [ v, k*(m-M*np.sin(y)) ]

然后,您的解决方案每个时间索引还将包含两个组成部分,因此您必须首先提取y