我目前正在研究一些拉格朗日力学,大部分情况都进展顺利,但我决定尝试一下计算机练习,但我不知道如何让 Python 求解这类方程。
我试图求解的二阶非线性常微分方程是:
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/