scipy.interpolate.Rbf的结果出乎意料

3

我在使用RBF插值时遇到了一些错误。以下是一个一维的例子。我认为这与我的y值彼此之间的接近程度有关。有没有什么解决办法?

import numpy as np
from scipy.interpolate import Rbf, interp1d
import matplotlib.pyplot as plt

x = np.array([0.77639752, 0.8136646, 0.85093168, 0.88819876, 0.92546584, 0.96273292, 1.])
y = np.array([0.97119742, 0.98089758, 0.98937066, 0.99540737, 0.99917735, 1., 0.99779049])
xi = np.linspace(min(x),max(x),1000)

fig = plt.figure(1)
plt.plot(x,y,'ko', label='Raw Data')

#RBF
rbfi = Rbf(x,y, function='linear')
plt.plot(xi,rbfi(xi), label='RBF (linear)')

rbfi = Rbf(x,y, function='cubic')
plt.plot(xi,rbfi(xi), label='RBF (cubic)')

#1D
f = interp1d(x,y, kind='cubic')
plt.plot(xi,f(xi), label='Interp1D (cubic)')


plt.plot(x,y,'ko', label=None)
plt.grid()
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.tight_layout()

plt.savefig('RBFTest.png')

enter image description here


你期望的是什么? - DrBwts
我想我认为RBF三次函数会与interp1D三次函数匹配,而不是像现在这样非常狂野。 - Kevin Hoopes
数学上讲,无论样条的阶数如何,径向基插值样条插值并不相同。 - DrBwts
1个回答

5

实际上,当使用多项式和谐样条 r^3在一维中正确实现RBF插值时,与自然立方样条重合,并且是“最平滑”的插值方法。

不幸的是,尽管名称为scipy.interpolate.Rbf,但它似乎并不是从逼近理论中已知的RBF方法的正确实现。错误大约在该行处。

self.nodes = linalg.solve(self.A, self.di)

他们在构建多项式RBF时忘记了(线性)多项式项!该系统应为(2)
现在,也不应该盲目信任interp1dscipy.interpolate中interp1d函数使用的算法表明它可能不是使用natural立方样条,而是使用不同的条件。帮助页面中没有提到它:需要进入Python源代码,我担心我们会发现什么。

这个问题有解决方法吗?

如果这是一项重要的工作,请自己实现RBF插值算法。或者,如果您想尝试Python中的其他实现,则显然来自密歇根大学的一个实现:https://rbf.readthedocs.io。如果您这样做了,能否在此处发布您的发现?如果没有,您已经通过展示一个重要的SciPy错误做出了良好的服务 - 谢谢!

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