Scipy:工作过多

时间:2018-08-15 15:40:59

标签: scipy ode

我有一个一阶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

1 个答案:

答案 0 :(得分:0)

您对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。接近这一点,函数值和导数会变得非常大,从而驱使内部步长减小以进行补偿。集成步骤数量多,步长小的原因导致出现错误消息“多余的工作已完成”。如果您通过增加mxstep参数来删除该参数,则会出现步长太小而无法通过添加浮点数来延长时间的错误。