我有一个一阶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
答案 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
参数来删除该参数,则会出现步长太小而无法通过添加浮点数来延长时间的错误。