Leo*_*ery 5 python interpolation
我在具有周期性边界条件的2D空间上运行模拟.连续函数由其在网格上的值表示.我需要能够在空间的任何一点评估函数及其梯度.从根本上说,这不是一个难题 - 或者确切地说,这是一个几乎已经解决的问题.该函数可以使用带有scipy.interpolate.RectBivariateSpline的三次样条插值进行插值.几乎解决的原因是RectBivariateSpline无法处理周期性边界条件,scipy.interpolate中也没有其他任何东西可以处理,就我从文档中可以看出来一样.
有没有python包可以做到这一点?如果没有,我可以调整scipy.interpolate来处理周期性边界条件吗?例如,是否足以在整个空间周围放置四个网格元素的边界并明确表示其上的周期性条件?
[附录]稍微详细一点,如果重要的话:我正在用化学梯度模拟动物的运动.我上面提到的连续功能是它们被吸引的化学物质的浓度.它根据直接的反应/扩散方程随时间和空间变化.每只动物都有一个x,y位置(不能假设它在网格点).它们向上移动了引诱剂的梯度.我使用周期性边界条件作为模仿无界空间的简单方法.
最接近的python函数似乎是scipy.signal.cspline2d.这正是我想要的,除了它假设镜像对称的边界条件.因此,我认为有三种选择:
编写我自己的三次样条插值函数,该函数适用于周期性边界条件,可能使用cspline2d源(基于用C编写的函数)作为起点.
kludge:i处的数据对j处的样条系数的影响变为r ^ | ij |,其中r = -2 + sqrt(3)〜-0.26.因此,如果我将网格嵌套在宽度为20的边界内,那么边缘的效果会降低到r ^ 20~10 ^ -5,这会复制周期值,如下所示:
bzs1 = np.array([zs1 [i%n,j%n]表示范围(-20,n + 20)中的i,范围(-20,n + 20)中的j)
bzs1 = bzs1.reshape(( n + 40,n + 40))
然后我在整个数组上调用cspline2d,但只使用中间.这应该有效,但它很难看.
请改用Hermite插值.在2D规则网格中,这对应于双三次插值.缺点是内插函数具有不连续的二阶导数.优点是(1)相对容易编码,(2)对于我的应用,计算效率高.目前,这是我喜欢的解决方案.
正如@mdurant建议的那样,我使用trig函数而不是多项式进行插值算法.事实证明它与三次样条非常相似,但需要更多的计算并产生更糟的结果,所以我不会这样做.
编辑:一位同事告诉我第四个解决方案:
| 归档时间: |
|
| 查看次数: |
1907 次 |
| 最近记录: |