0

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

4

1 回答 1

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您将得到步长太小而无法通过浮点加法来提前时间的错误。

于 2018-10-15T13:50:33.857 回答