【发布时间】:2014-07-23 22:10:53
【问题描述】:
我在以下系统 (ODE) 中有点挣扎(k`s 不是恒定的):
def my_diff(y,t,k):
f = np.zeros(4)
f[0] = - k[0]*y[0] - k[1]*y[0] - k[2]*y[0]**2
f[1]= k[0]*y[0]
f[2] = k[1]*y[0]
f[3] = k[2]*y[0]**2
return f
正在发生三种化学反应:
f[0] .. concentration of raw-material
f[1] .. concentration of product 1
f[2] .. concentration of product 2
f[3] .. concentration of product 3
如果我解决了这个系统,一切都会正常工作并且质量会保持不变。但是,如果我在循环中运行模拟,质量不会保持不变,并且我的错误会随着循环线性增加。
我做什么(代码 sn-p):
# solve the ODE
sol = integrate.odeint(my_diff,y,t,(k,))
# update initial conditions and solve again
y = [ sol.T[0][-1] + new_pulse,
sol.T[1][-1] , sol.T[2][-1] , sol.T[3][-1]]
不幸的是,系统中的总质量增加了。我一遍又一遍地阅读我的代码,但找不到任何错误。我尝试使用 IDA 求解器并通过向系统添加代数项来限制总浓度,但我很难定义一致的初始条件。
对于这种类型的模型和 ode 求解器,您是否会期望出现较大的错误(20 次循环后高达 50%)?还是我应该继续寻找错误?
【问题讨论】:
-
将
new_pulse添加到第一个组件会更改总质量,但我认为这不是您正在谈论的更改。对吗? -
“我一遍又一遍地阅读我的代码,但找不到任何错误。” 如果您向我们展示了您的代码(最好是一个最小的独立示例),也许我们可以找到问题(如果有的话)。