首页 文章

scipy,odeint和质量守恒

提问于
浏览
0

我在以下系统(ODE)中苦苦挣扎(k不是常数):

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

如果我解决这个系统,一切都很好,质量也很大 . 但是如果我在循环中运行模拟,则质量不会保留,并且我的误差会随循环线性增加 .

我做什么(代码片段):

# 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求解器并通过向系统添加代数项来限制总浓度,但我很难定义一致的初始条件 .

您是否期望使用此类型的模型和颂歌解决方案出现大的错误(20次循环后高达50%)?或者我应该继续搜索错误?

2 回答

  • 0

    你说"my error raises linearly with the cycles" . 事实上,你在每个周期都是线性增加质量,因为你在每个周期增加相同数量的 new_pulse 变量,并且 raw_material 是系统总质量的线性项 .

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

  • -1

    好吧,在发布之前先去睡吧......

    我发现了错误 . 我以错误的方式计算了音量的增加 . ODE系统工作正常 . 无需质量 balancer . 不再有错误传播 .

相关问题