如何为SciPy的interp1d指定边界行为

6

我正在尝试设置SciPy的interp1d函数的边界行为,根据文档,这应该是可能的:

Behavior at the boundary can be specified at instantiation time.

但是我没有找到关于这个的更多信息。 interp1d文档中没有提到它。 那么:我该如何定义行为呢? 顺便问一下:它使用的默认边界行为是什么?

编辑:示例(假设数据点在x=0x=n之间,且采用三次插值)

我知道至少有三种边界行为类型,我希望能够指定:

平坦:我可以要求函数趋于平坦,换句话说,导数为零。

f'(0)  = f'(n)  = 0
f''(0) = f''(n) = 0

cyclic: 指的是类似于

f'(0)  = f'(n)
f''(0) = f''(n)

因此,起点和终点具有相同的“斜率”。

手动: 或者我可以手动提供导数的值...

f'(0)  = ...
f'(n)  = ...
f''(0) = ...
f''(n) = ...

尽管可能不是同时适用于所有四个。
1个回答

3

我认为文档中的那句话措辞不当,请忽略它。

interp1d函数目前不允许指定边界行为,

  • 对于线性插值,我们根本没有选择。
  • 对于高阶插值,interp1d使用默认参数kind='smoothest'的样条构造器scipy.interpolate.splmake,因此在边界行为上也没有选择余地。

另一方面,您可能需要查看scipy.interpolate.PiecewisePolynomial,它使用分段多项式表示曲线,并具有指定导数的能力(尽管是在所有节点而不仅仅是在边界处)。


根据我的有限理解,“斜率”(即导数)与顺序没有直接关系:假设数据点在 x=0x=n 之间且进行三次插值,我可以要求函数平坦化,换句话说,导数为零(即 f'(0)=f'(n)=0f''(0)=f''(n)=0)。或者我可以要求类似于 f'(0)=f'(n)f''(0)=f''(n)(开头和结尾具有相同的“斜率”)。或者我可以手动提供导数的值... - neo post modern
@neopostmodern 没错。我已经更新了上面的帖子,以考虑到您问题中的编辑。 - rth
很不幸,我在 scipy.interpolate.splmake 上找不到任何资料(除了人们抱怨文档不见了)。我会接受你的答案,因为显然在 SciPy不可能实现我所要求的内容,并且我稍后会发布我的解决方法/自己的实现。 - neo post modern
谢谢。也许splmake并不是为了向用户公开而设计的,因此缺少文档。源代码可以在https://github.com/scipy/scipy/blob/master/scipy/interpolate/interpolate.py#L2116找到。 - rth
我想“以后”意味着“永远不会”。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接