python - 如何让 Python 求解这个二阶非线性 ODE?

标签 python ode

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

我试图求解的二阶非线性常微分方程是:

enter image description here

y的初始值为y0 = 0。

求解普通的一阶方程很容易,因为您只需创建一个函数并将其设置为等于某个值,然后使用 odeint。没问题。但现在我得到了一个二阶方程,我不知道如何告诉 odeint 或函数,我试图找到的是两次微分的东西。

我尝试使用各种数量的积分和微分函数(符号函数和其他函数)并说过这样的话:

y' 微分 = RHS

y' = RHS 相对于 t 积分

等等,但似乎没有任何效果。它要么告诉我我的函数无法被调用,要么某些东西没有属性,或者存在一些无效的限制等等。

这是我现在拥有的代码(准系统),我没有尝试任何技巧来让它工作,它只是返回函数的结果(如果它是一阶函数):

#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 很陌生,而且一般来说编码很糟糕,所以有人可以帮助我吗?

最佳答案

您需要将二阶方程转换为具有 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 作为其中的第一个组件。

关于python - 如何让 Python 求解这个二阶非线性 ODE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348546/

相关文章:

python - 无法将对象类型转换为字符串;然后过滤该字符串; python pandas 数据框

python - 如何逐行反转文件?

python - 我如何实现图片而不是我的红色矩形?

javascript - 哪一个更适合创建 Web 应用程序? web2py 或cherrypy

python - 尝试优化 Lugre 动态摩擦模型中的参数

python - 'unicode' 对象没有属性 'prettify'

python - 通过 odeint 函数求解 ODE 时如何将数组作为参数传递(在 Python 中)

python - 使用 Symfit for Python 进行 ODE 拟合 : How to get estimations for intial values?

python - 如何在 R 中求解二阶微分方程?

r - 常微分方程 (ODE) - 有什么方法可以防止出现负值吗?