【问题标题】:scipy, odeint and conservation of massscipy、odeint 和质量守恒
【发布时间】: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 添加到第一个组件会更改总质量,但我认为这不是您正在谈论的更改。对吗?
  • “我一遍又一遍地阅读我的代码,但找不到任何错误。” 如果您向我们展示了您的代码(最好是一个最小的独立示例),也许我们可以找到问题(如果有的话)。

标签: python scipy ode


【解决方案1】:

你说“我的错误随着周期线性增加”。事实上,您在每个循环中线性增加质量,因为您在每个循环中增加相同的数量 new_pulse 您的 raw_material 变量,而 raw_material 是系统总质量的线性项。

我猜错误出在动力学方程中,而不是在代码中。更准确地说,您可能必须在其他地方添加您的 new_pulse 变量。

【讨论】:

    【解决方案2】:

    嗯,发帖前先睡吧……

    我发现了错误。我以错误的方式计算了音量增加。 ODE 系统工作正常。不需要质量平衡。不再发生错误传播。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2019-01-22
      • 1970-01-01
      • 2018-11-06
      • 2015-12-13
      • 2013-03-26
      • 2013-10-01
      • 2015-12-03
      相关资源
      最近更新 更多