我可能有一些非线性 ODE 正在解决scipy.integrate.odeint
。但是,可能必须使用非 DE 规则更新每个时间步的参数,该规则使用 ODE 求解器在每个时间步的结果以及执行积分的变量,以更新参数. 例如,非 DE 规则可能是“背景”PDE 系统的粗略离散化。
这是一个玩具示例,与我现在正在做的事情有关:我们可能有一个粒子,它有一些与它相关的属性(、和)随着时间的推移而演变——假设和代表 2D粒子的位置,以及的“颜色”。粒子在二维空间上移动。二维空间是离散的,每个离散点都有一个与之相关的属性 - 假设通过以下规则演变:
- 某些预选的空间点有一个源
- 如果一个粒子最近访问了一个空间点,设置为零
- 在每个时间步,选择 10 个(大小为 4)的相邻空间点的随机集合,并将它们的设置为集合中点的平均
在计算 RHS(、和 )时,我们需要知道离粒子当前位置最近的空间点上的平均值是多少。然而,将的演化作为一堆 DE 规则嵌入到空间点上并不简单……否则我们可以简单地通过像、、、 ... 之类的 ODE 系统, ) 到.odeint
假设我希望 ODE 结果位于t = [t1, ..., t2]
. 然后,我可以设置程序,以便每次调用时odeint
,我只让它在一个时间步之间给我结果,然后在odeint
再次调用之前使用这些结果更新非 DE 规则。但是,这将是非常低效的,因为我会破坏odeint
' 的内部流程?
有没有其他方法可以解决这个问题?难道我可以从“odeint”的面向对象版本继承,然后让我的班级在每个步骤之间执行非 DE 步骤?这会比上面建议的幼稚解决方案更有效吗?