首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在Python的ODEINT中修改我的ODEINT?

有没有办法在Python的ODEINT中修改我的ODEINT?
EN

Stack Overflow用户
提问于 2020-04-15 10:24:02
回答 1查看 55关注 0票数 0

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

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

代码语言:javascript
复制
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)。我预计当身体向上移动时,由于外力的作用,会出现更混乱的运动模式。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-15 14:05:06

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

代码语言:javascript
复制
t = np.linspace(0.00,10.00,301)
y = odeint(function, initial, t, hmax=0.1, atol = 1e-8, rtol=1e-10)

并且不使用虚线给出了该图

下半场的纠结清晰可见。

因此,您的代码是正确的,但您需要考虑到,ODE求解器是为平滑的右侧构建的,从数学方法开始,直到并特别是针对最佳步长的预测器。因为在这里右侧有局部不可预测的非平滑变化,所以必须告诉求解器不要使用非常大的步长,因为这可能会跳过模型阶段的变化并返回。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61220296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档