【问题标题】:Scipy: excessive odeint workScipy:过度的 odeint 工作
【发布时间】:2019-01-22 12:33:39
【问题描述】:

我有一个一阶 ODE 系统:f(x) = x_i ** 2 - x_i 用于所有 i(我目前正在研究 3 个维度)。

我是这样定义的:

lower, upper = -10, 10

def xdot(__xs, t):
    return [__xs[i] ** 2 - __xs[i] for i in range(len(__xs))]

x0 = [1.2, 1.2, 1.2]
t = np.linspace(lower, upper, upper - lower)
res = integrate.odeint(xdot, x0, t)

这是使用 odeint 的正确方法吗?我得到: ODEintWarning: Excess work done on this call

【问题讨论】:

  • 您在计算科学方面的研究可能会更好。你做了什么研究?例如:scicomp.stackexchange.com/q/15835
  • 对于值 > 1,导数为正,即值将增加,函数在这里不稳定
  • @xdze2 谢谢你可以回答一下
  • 它对我来说没有任何错误...python 3.6.1
  • @Bazingaa:然后你能在整个区间 [-10, 10] 上绘制它吗?

标签: scipy ode


【解决方案1】:

您对 ODE 求解器的使用是正确的。


x' = x^2-x=x*(x-1)的解决方案是

(1/x)'=-x'/x^2 = -1+1/x
1/x = C*e^t + 1  ==> C = (1/x0 - 1)*e^(-t0)
x(t) = x0 / ( (1-x0)*e^(t-t0) + x0)

如果x0 > 1 分母的根在t = t0 + ln(x0) - ln(x0-1)

对于x0 = 1.2,这发生在t=t0+1.7917594,而您的积分区间的长度为20。接近这一点的函数值和导数增长得非常大,从而驱动内部步长减小以进行补偿。具有小步长的大量集成步骤会导致错误消息“Excess work done”。如果你通过增加mxstep 参数来消除它,你会得到步长太小而无法通过浮点加法来推进时间的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2017-04-15
    • 2013-10-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多