我正在处理的问题(所示示例高度简化)似乎是一个常见问题,但我还没有找到解决方案。我有三种不同的反应,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 并接收预期的输出?非常感谢!