Python:使用odeint实现阈值模型

时间:2012-07-19 07:09:19

标签: python differential-equations threshold numerical-integration

我处理的问题(显示的示例是高度简化的)似乎是一个常见的问题,但我还没有找到解决方案。我有三个不同的反应,v1,v2和v3,定义如下:

v1:R - < - > A + C; v1 = k1 *(R - A * C / 5000。)

v2:R - > B + C; v2 = k2 *(R - B * C / 5000。)

v3:A + B - > P: v3 = k3 * A * B

使用资源R,前两个反应分别产生A和C以及B和C,而第三个反应将A和B转换为产品P(k1,k2,k3是常数,这里它们设置为1 )。

第三个反应只有在C超过某个叫做Cthr的阈值(此处:Cthr = 25)时才会发生,否则v3为0.所以我想这个C会累积,然后,一旦达到一定的浓度,就会产生结果在产品P的生产中。

我实现了如下:

def thresholdmodel (yn,tvec,allpara,R):

    (A, B, C, P) = yn

    k1, k2, k3 = allpara['kv']    

    Cthr = allpara['Cthresh']

    if C <= Cthr:
        v3 = 0
    else:      
        v3 = k3*A*B
        C = 0 #does not(!) affect the ouput, why?

    v1 = k1*(R - A*C/5000.)
    v2 = k2*(R - B*C/5000.)

    dA = v1 - v3
    dB = v2 - v3
    dC = v1 + v2
    dP = v3

    return (dA, dB, dC, dP) 

模拟的输出如下所示:http://i50.tinypic.com/apdvkj.png

所以显然它一直工作,直到第一次达到阈值(v3为0,P没有产生),但之后C没有设置为0,我不明白为什么。
我想得到的是:C产生直到阈值,下降到0,再次产生,下降到0,依此类推,看起来像锯齿波。
P的时间过程应该看起来像楼梯(仅在超过Cthr时产生)。

有人知道我要做什么才能将C设置回0并接收预期的输出?非常感谢!

1 个答案:

答案 0 :(得分:2)

我不明白你的方程式,但我可以说明为什么C不会降到0。

由于Cthresholdmodel()中的本地变量,因此将C更改为任何值都不会更改odeint中的状态。 odeint将始终整合dC返回的thresholdmodel()。因此C会不断增加。

编辑:

C将持续增加,因此每次C> 1时都需要更改阈值。阈值,例如:

lastC = 0

def thresholdmodel (yn,tvec,allpara,R):
    global lastC
    (A, B, C, P) = yn

    k1, k2, k3 = allpara['kv']    

    Cthr = allpara['Cthresh']

    if C <= lastC + Cthr:
        v3 = 0
    else:      
        v3 = k3*A*B
        lastC = C

    v1 = k1*(R - A*C/5000.)
    v2 = k2*(R - B*C/5000.)

    dA = v1 - v3
    dB = v2 - v3
    dC = v1 + v2
    dP = v3

    return (dA, dB, dC, dP)