Неожиданные результаты от scipy.interpolate.Rbf - PullRequest
1 голос
/ 29 июня 2019

Я получаю некоторые ошибки при интерполяции с RBF.Вот пример в 1D.Я думаю, что это связано с тем, насколько близки мои значения 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

1 Ответ

1 голос
/ 18 июля 2019

Действительно, при правильной реализации RBF-интерполяция с использованием полигармонического сплайна r ^ 3 в 1D совпадает с естественным кубическим сплайном и является «наиболее гладким» интерполантом.

К сожалению, scipy.interpolate.Rbf, несмотря на название, не является правильной реализацией методов RBF, известных из теории приближений. Ошибка около в строке

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

Они забыли (линейный) полиномиальный член при построении полигармонического RBF! Система должна была быть (2) .

Так вот, нельзя и слепо доверять interp1d. Какой алгоритм используется в функции interp1d в scipy.interpolate , предполагает, что он может не использовать естественный кубический сплайн, но другое условие. Нет упоминания об этом на странице справки: нужно перейти к исходному тексту на python, и я боюсь того, что мы там найдем.

Есть ли исправление для этого?

Если это серьезная работа, создайте собственную реализацию алгоритма интерполяции RBF. Или, если вы хотите попробовать другую реализацию в python, очевидно, есть одна из Университета Мичигана: https://rbf.readthedocs.io. Если вы это сделаете, не могли бы вы опубликовать свои выводы здесь? Если нет, то вы уже оказали хорошую услугу, продемонстрировав важную ошибку SciPy - спасибо!

...