scipy odeint:在此调用上完成的工作过多并且对初始值非常敏感

计算科学 scipy 微分方程
2021-12-27 19:09:09

我正在尝试odeint并收到错误

'在此调用上完成的工作过多(可能是错误的 Dfun 类型)。'。

返回的值对初始值的微小变化也非常敏感。一些初始值不会遇到这个问题,而其他初始值会。

rho = 0.1  
beta = 0.01  
N = 50       
gamma = 0.20    
theta = 0.01       
delta = 0.1      
alpha = 1000         
S = 1000   
W = 180

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt


def model(L,t):
    
    R = (L * delta * alpha * 20) / (2* theta*S*N*W)
    dLdt= rho*L-beta*N+(L*delta*alpha*R*W*20)/(N*S)
    
    return dLdt

L0 = 20

# time points
t = np.linspace(0, 500,  1000)

# solve ODE
L, infodict = odeint(model,L0,t,full_output=True)
infodict['message']

输出L20100然后尖峰到1.62e+011再次变为零。

1个回答

本质上,通过组合所有常数因子,您的 ODE 是

dLdt=A+BL+CL2
与初始L(0)=L0足够大,二次项的正反馈驱动方程在有限时间内动态爆炸,正如您观察到的值变得非常大。这是精确解的一个属性,因此精确的数值解会复制这一点也就不足为奇了。

只有当初始点低于右侧二次多项式的正根时,您的方程才会给出有界解。

你有

A = beta*N
B = rho
C = ((delta * alpha * 20)/(N*S))**2/(2*theta)
print([A,B,C])
print(np.roots([C,B,-A]))

给出二次的系数[0.5, 0.1, 0.08]和根[-3.20194102 1.95194102]对于稍大于该值的值,您仍会在爆发点之前达到积分间隔的末端,但是这些值会越来越大。