具有周期性边界条件的2D插值

时间:2014-08-01 19:11:06

标签: python interpolation

我在具有周期性边界条件的2D空间上运行模拟。连续函数由其在网格上的值表示。我需要能够在空间的任何一点评估函数及其梯度。从根本上说,这不是一个难题 - 或者确切地说,这是一个几乎已经解决的问题。该函数可以使用带有scipy.interpolate.RectBivariateSpline的三次样条插值进行插值。它几乎解决的原因是RectBivariateSpline无法处理周期性边界条件,scipy.interpolate中也没有其他任何东西,只要我从文档中可以看出来。

是否有可以执行此操作的python包?如果没有,我可以调整scipy.interpolate来处理周期性边界条件吗?例如,是否足以在整个空间周围放置四个网格元素的边界并明确表示其上的周期性条件?

[ADDENDUM]稍微详细一点,如果重要的话:我正在用化学梯度模拟动物的运动。我上面提到的连续功能是它们被吸引的化学物质的浓度。它根据直接的反应/扩散方程随时间和空间变化。每只动物都有一个x,y位置(不能假设它位于网格点)。它们向上移动了引诱剂的梯度。我使用周期性边界条件作为模仿无界空间的简单方法。

4 个答案:

答案 0 :(得分:6)

最接近的python函数似乎是scipy.signal.cspline2d。这正是我想要的,除了它假设镜像对称的边界条件。因此,我认为有三种选择:

  1. 编写我自己的三次样条插值函数,该函数适用于周期性边界条件,可能使用cspline2d源(基于用C编写的函数)作为起点。

  2. 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]表示i在范围(-20,n + 20)中j为范围(-20,n + 20)]) bzs1 = bzs1.reshape((n + 40,n + 40))

    然后我在整个数组上调用cspline2d,但只使用中间。这应该有用,但它很难看。

  3. 使用Hermite插值代替。在2D规则网格中,这对应于bicubic interpolation。缺点是内插函数具有不连续的二阶导数。优点是(1)相对容易编码,(2)对于我的应用,计算效率高。目前,这是我非常喜欢的解决方案。

  4. 我使用trig函数而不是多项式进行插值的数学运算,正如@mdurant所建议的那样。事实证明它与三次样条非常相似,但需要更多计算并产生更差的结果,因此我不会这样做。

    编辑:一位同事告诉我第四个解决方案:

    1. GNU Scientific Library(GSL)具有可以处理周期性边界条件的插值函数。 GSL有两个(至少)python接口:PyGSLCythonGSL。遗憾的是,GSL插值似乎仅限于一个维度,因此对我来说并不是很有用,但GSL中有很多好东西。

答案 1 :(得分:1)

另一个可行的功能是scipy.ndimage.interpolation.map_coordinates。 它使用周期性边界条件进行样条插值。 它并不直接提供衍生物,但您可以用数字计算它们。

答案 2 :(得分:0)

可以在我的github master/hmc/lattice.py找到这些功能:

  • 定期边界条件 Periodic_Lattice()类已完整described here
  • 格子衍生物在存储库中,您会发现拉普拉斯函数,平方渐变(对于渐变只取平方根)和np.ndarray
  • 的重载版本
  • 单元测试可以在tests/test_lattice.py
  • 中的同一个回购中找到测试用例

答案 3 :(得分:0)

我一直在使用以下函数,该函数会增加输入以创建具有有效周期性边界条件的数据。与修改现有算法相比,增强数据具有明显的优势:可以使用任何算法轻松地插入扩充后的数据。参见以下示例。

HttpMessageNotReadableException

示例

下面的示例显示了一维具有周期性边界条件的插值,但以上函数可以应用于任意维。

example of periodic interpolation

@Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        logger.debug("========================");
        return super.handleHttpMessageNotReadable(ex, headers, status, request);
    }