【问题标题】:How can I get dy/dt from odeint of SciPy如何从 SciPy 的 odeint 获得 dy/dt
【发布时间】:2015-12-03 14:17:12
【问题描述】:

我想从 SciPy 的 odeint 以及 y 本身获得 dy/dt

我了解 odeint 得到了dy/dt=func(y0,t) 的解决方案。 不过,我也需要得到dy/dt

我正在处理一个结构动态系统,其中:

y : displacement
dy/dt : velocity
d(dy/dt)/dt : acceleration (force)

而我把系统分为两个系统:

dy/dt = x
dx/dt = func(y0,x0,t)

然后,odeint(func, [y0's, x0's]) 完美运行。 但是,最终目标是对系统施加作用力。

在此先感谢^^

【问题讨论】:

    标签: python scipy odeint


    【解决方案1】:

    只是为了确保我正确理解您的问题:

    (d2x)/(dt2) = F(x,t)  // your second order system that you wish to solve, to simplify the problem I assume that dim(x) = 1
    
    /* your system transformed to first order system of 2 equations
     * x[0] is your dx/dt (velocity), x[1] is your x (displacement)
     */
    
    dxdt[1] = x[0];
    dxdt[0] = F(x[1],t);
    

    您将获得的结果是:

    • x[0] - 速度
    • x[1] - 位移
    • t - 时间

    要计算你只需要做的加速度:

    acc = F(x[1],t);
    

    我希望这就是您所要求的。祝你好运。

    【讨论】:

    • 这意味着我必须再执行一次 F() 的函数求值,这是我程序中最耗时的过程。我的问题的真正意图是我想知道如何从 odeint 的过程中提取函数评估结果。作为
    • 如您所知,odeint 已经完成了函数求值。我的问题是如何才能得到odeint的函数评估结果,而不是自己重复函数评估。
    • 我不确定这是否可能。您当然可以添加另一个状态 dxdt[2] = dF/dt(分析计算),但这将花费更多时间,因为 odeint 可能使用各种算法,最流行的是 6 点 Runge-Kutta,其中函数 F 是评估 6 次以计算下一个样本。我认为 odeint 的设计方式不存储导数,因为它会花费两倍的内存(该算法无法区分您的哪个状态是重要的) .如果速度对您很重要,请尝试编写您自己的 R-K 实现。
    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多