Python:使用 odeint 实现阈值模型

标签 python differential-equations threshold numerical-integration

我正在处理的问题(所示的示例是高度简化的)似乎是一个常见问题,但我还没有找到解决方案。我有三种不同的 react ,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,前两个 react 分别产生 A 和 C 以及 B 和 C,而第三个 react 将 A 和 B 转化为产物 P(k1、k2、k3 是常数,这里将它们设置为 1 )。

只有当 C 超过称为 Cthr 的特定阈值(此处:Cthr = 25)时,第三个 react 才会发生,否则 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 并收到预期的输出?非常感谢!

最佳答案

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

由于 Cthresholdmodel() 中的局部变量,因此将 C 更改为任何值都不会更改 odeint 中的状态odeint 将始终集成 thresholdmodel() 返回的 dC。所以C会不断增加。

编辑:

C会不断增加,所以每次C>阈值时都需要改变阈值,如:

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) 

关于Python:使用 odeint 实现阈值模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11555615/

相关文章:

python - 圣人情节斜率场和微分方程

python - 如何在 OpenCV 中实现二值化

java - Java中内存不足的通知

python - 打印二维列表的一部分

python - 如何使用 mysql.connector 传输结果

python - 使用 SciPy 数值求解 ODE

python - 如何在 R 中求解二阶微分方程?

python - OpenCV - 使用凸包和自适应阈值在手指上绘制轮廓

python - 使用 xlwings 写入现有 Excel 工作簿

python - 如何递归查找嵌套 JSON 中的特定键?