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

2024-05-14 23:58:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在研究一些拉格朗日力学,这在很大程度上是很好的,但我决定尝试一个计算机练习,我不知道如何让Python解决这类方程。你知道吗

我要解决的二阶非线性常微分方程是:

enter image description here

y的初始值为y0=0。你知道吗

解决一个正常的,一阶方程是很容易的,因为你只要创建一个函数设置它等于一些东西,然后使用odeint。没问题。但现在我得到了一个二阶方程,我不知道如何告诉odeint或函数,我试图找到的是两次微分的东西。你知道吗

我尝试过使用不同数量的积分和微分函数(象征性的和其他的),比如:

y’s=右

y’=相对于t积分的RHS

以此类推,但似乎什么都不管用。要么它告诉我我的函数不能被调用,要么某个东西没有属性,或者有一些无效的限制等等。你知道吗

下面是我现在的代码(barebone),我没有尝试过任何诡计让它工作,如果它是一阶函数,它只返回函数的结果:

#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还很陌生,而且总体上对编码也很不在行,所以这里有人能帮我吗?你知道吗


Tags: 函数数量model属性计算机np方程力学
1条回答
网友
1楼 · 发布于 2024-05-14 23:58:14

你需要把你的二阶方程转换成一阶系统,有两个分量

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作为第一个组件。你知道吗

相关问题 更多 >

    热门问题