有没有办法在Python中更改ODEINT中的ODE?

2024-10-01 15:30:22 发布

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

我试图模拟一个有点不同的振荡系统:我希望它在物体向上运动时使用一个特定的运动方程(O.D.E.),在物体向下运动时使用另一个运动方程。为了解这些方程,我使用了来自Scypi的ODEINT

例如,让我们考虑经典的质点弹簧系统。我试着让系统在物体向上运动时,用外部激励的运动方程,在物体向下运动时,用简单的方程

def function (x,t):

    F0 = 10.00
    w = 1.00
    m = 2.00
    c = 1.00
    k = 20.00
    s = x[0]
    dsdt = x[1]

    if x[1] >= 0:
        d2sdt2 = (F0*np.sin(w*t)-c*dsdt-k*s)/m
    else:
        d2sdt2 = (-c*dsdt-k*s)/m

    result = [dsdt,d2sdt2]
    return result

initial = [3.00,0.00]
t = np.linspace(0.00,10.00,101)
y = odeint(function, initial, t)

所得结果表明,只有第二个运动方程在物体(Results Obtained)上起作用。当身体向上移动时,由于外力的作用,我原本预计会出现一种更加混乱的运动模式

有没有更好的方法来实现这一点


Tags: 系统npfunctionresultinitial弹簧物体经典
1条回答
网友
1楼 · 发布于 2024-10-01 15:30:22

只需添加一些参数来增加内部步骤的密度和输出的密度

t = np.linspace(0.00,10.00,301)
y = odeint(function, initial, t, hmax=0.1, atol = 1e-8, rtol=1e-10)

而不使用虚线给出了绘图 enter image description here

下半部分的扭结清晰可见

因此,您的代码是正确的,但您需要考虑ODE解算器是为平滑的右侧构造的,从数学方法开始,一直到(尤其是)最佳步长的预测器。由于右侧存在局部不可预测的非平滑变化,因此必须告诉解算器不要使用非常大的步长,因为这可能会跳过模型阶段的变化并返回

另外,对于平滑打印,整个水平轴上100个点的输出密度通常太小。根据打印的最终“打印中”大小,使用200到600点

相关问题 更多 >

    热门问题