我处理的问题(显示的示例是高度简化的)似乎是一个常见的问题,但我还没有找到解决方案。我有三个不同的反应,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并接收预期的输出?非常感谢!
答案 0 :(得分:2)
我不明白你的方程式,但我可以说明为什么C
不会降到0。
由于C
是thresholdmodel()
中的本地变量,因此将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)