我在具有周期性边界条件的二维空间上运行模拟。连续函数由其在网格上的值表示。我需要能够在空间中的任何一点评估函数及其梯度。从根本上说,这不是一个难题——或者准确地说,这是一个几乎已经解决的问题。该函数可以使用带有 scipy.interpolate.RectBivariateSpline 的三次样条插值。 几乎 解决的原因是 RectBivariateSpline 无法处理周期性边界条件,scipy.interpolate 中的任何其他内容也无法处理,据我从文档中可以看出。
有没有可以做到这一点的python包?如果没有,我可以调整 scipy.interpolate 来处理周期性边界条件吗?例如,是否足以在整个空间周围放置一个由四个网格元素组成的边界并在其上明确表示周期性条件?
[附录] 更多细节,以防万一:我正在模拟动物在化学梯度中的运动。我上面提到的连续函数是吸引它们的化学物质的浓度。根据简单的 react /扩散方程,它随时间和空间而变化。每只动物都有一个 x,y 位置(不能假定为位于网格点)。它们向上移动引诱剂的梯度。我使用周期性边界条件作为模仿无限空间的简单方法。
最佳答案
看起来最接近的 python 函数是 scipy.signal.cspline2d。这正是我想要的,除了它假设镜像对称边界条件。因此,看来我有三个选择:
编写我自己的适用于周期性边界条件的三次样条插值函数,也许使用 cspline2d 源(基于用 C 编写的函数)作为起点。
kludge:i 处的数据对 j 处的样条系数的影响 变为 r^|i-j|,其中 r = -2 + sqrt(3) ~ -0.26。所以效果 如果我将网格嵌套在边框内,则边缘下降到 r^20 ~ 10^-5 一直宽度为 20 的复制周期值, 像这样:
bzs1 = np.array( [zs1[i%n,j%n] for i in range(-20, n+20) for j in range(-20, n+20)] )
bzs1 = bzs1.reshape((n + 40, n + 40))然后我在整个数组上调用 cspline2d,但只使用中间部分。这应该可行,但它很丑。
改为使用 Hermite 插值。在二维规则网格中,这对应于 bicubic interpolation .缺点是插值函数的二阶导数不连续。优点是 (1) 编码相对容易,以及 (2) 对于我的应用程序,计算效率高。目前,这是我喜欢的解决方案。
正如@mdurant 所建议的,我使用三角函数而不是多项式对插值进行了计算。结果证明它与三次样条非常相似,但需要更多计算并产生更差的结果,所以我不会这样做。
编辑:一位同事告诉我第四种解决方案:
- GNU Scientific Library (GSL) 具有可以处理周期性边界条件的插值函数。 GSL 有两个(至少)python 接口(interface):PyGSL和 CythonGSL .不幸的是,GSL 插值似乎仅限于一维,所以对我来说用处不大,但 GSL 中有很多好东西。
关于python - 具有周期性边界条件的二维插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087111/