在具有相移变量的方程组上使用scipy-odeint

2024-09-30 18:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上。。。我需要一种在微分方程中加入相移的方法。也就是说,在我的系统函数的定义中,它返回dY/dt,类似于Y(t-3)。就像这个微分方程:

dY/dt = a*Y(t) + b*Y(t-tau)

现在如果我试着把它写成系统定义函数,传递给西皮·奥德林,我迷路了:

^{pr2}$

基本上就是这样。我真的希望有一个简单的答案,但我似乎找不到一个。在

特别是。。。我试图用数值计算由以下函数定义的系统的解:

def etaFunc(A,t): 
    #...definition of all those constants is here...
    return array([(gamma[0,0]*xi(t-theta[0])[0] - eta[0] + zeta[0])/tau[0],\
           (gamma[1,1]*xi(t-theta[1])[1] - eta[1] + zeta[1])/tau[1],\
           (gamma[2,2]*xi(t-theta[2])[2] - eta[2] + zeta[2])/tau[2],\
           (   beta[3,0]*pastEta(t-theta[3])[0] \
             + beta[3,1]*pastEta(t-theta[4])[1] \
             + beta[3,2]*pastEta(t-theta[5])[2] -eta[3]+ zeta[3])/tau[3],\
           (   beta[4,3]*pastEta(t-theta[6])[3] \
             + beta[4,2]*pastEta(t-theta[7])[2] - eta[4] + zeta[4])/tau[4]])

随后,将此函数赋予odeint,如下所示:

ETA = integrate.odeint(etaFunc,initCond,time)

然后我可以得到ETA的每一个单独的组成部分(比如ETA_0):ETA[:,0]。在

我在这里遇到的问题是pastEta(t-theta[?])。现在,这是一个函数,它试图找到已经计算的eta值(对于when start_time < t-theta[?] < ttheta[?] > 0。这不是很好用。在

我知道在这种情况下,我可以单独找到eta的每个分量,然后得到以前计算的eta分量(eta_0、eta_1、eta_2)的计算值,以计算eta_3和eta_4,但这并不理想,因为它剥夺了我“即插即用”任何通用公式的能力。在


Tags: 函数定义系统dtbetaetagammatau
3条回答

integrate.odeint()执行此操作的一种方法是在开始时间和结束时间之间的许多短时间间隔内运行integrate.odeint(),在列表中存储每个短间隔之后的时间值和输出Y值。{{e>{e}你可以在每一个实例中使用^}所需的时间值。在

当然,如果这样做的话,您只会得到Y(t-3)的近似值,但是如果时间间隔足够接近,这种方法可能会让您满意。毕竟,由数值ODE解算器计算的Y(t)值也是近似值。在

延迟并不完全是线性函数。通常的阶跃延迟在Laplace域中表示为e**(a*s)/s,其中{}是延迟。在

这意味着“正常”的ODE解算器将无法工作,除非您有一些变通方法。通常这种解决方法不是很容易做到的,因为对于刚性问题,通常不能用足够好的近似值进行插值。在

无论如何,其中一个解决方案是使用其他答案中发布的库。在

另一个解决方案是对称地进行(如果可以,可以尝试SymPy)。在

第三种解决方案是存储过去的结果,然后进行插值以找到您需要的确切的过去(可能不够好)。在

第四种解决方案可能是一些模拟器文档推荐的解决方案:使用c2d()并在离散时间内模拟整个模型,并将过去的变量存储在一个列表/数组中(没有插值,但您可能需要使用一些小步骤以获得更好的精度)。在

第五个解决方案是使用Padé approximation来表示模型的延迟(根据具体情况可能会起作用)。python控件中有一个^{} function来近似于此。在

相关问题 更多 >