我在以下系统(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 回答
你说"my error raises linearly with the cycles" . 事实上,你在每个周期都是线性增加质量,因为你在每个周期增加相同数量的
new_pulse
变量,并且raw_material
是系统总质量的线性项 .我猜错误是在动力学方程中,而不是在代码中 . 更准确地说,您可能需要在其他地方添加
new_pulse
变量 .好吧,在发布之前先去睡吧......
我发现了错误 . 我以错误的方式计算了音量的增加 . ODE系统工作正常 . 无需质量 balancer . 不再有错误传播 .