коэффициенты интерполяции сплайна в scipy

Я хочу рассчитать коэффициенты интерполяции сплайна scipy. В MATLAB:

x=[0:3]; y=[0,1,4,0]; spl=spline(x,y); disp(spl.coefs); 

и он вернется:

 ans = -1.5000 5.5000 -3.0000 0 -1.5000 1.0000 3.5000 1.0000 -1.5000 -3.5000 1.0000 4.0000 

Но я не могу этого сделать, используя interolate.splrep в scipy. Можете ли вы рассказать мне, как рассчитать его?

3 Solutions collect form web for “коэффициенты интерполяции сплайна в scipy”

Я не уверен, что есть какой-либо способ получить именно эти коэффициенты от scipy. Что дает scipy.interpolate.splrep , это коэффициенты для узлов для b-сплайна. То, что дает сплайн Matlab, похоже, является частичным полиномиальным коэффициентом, описывающим кубические уравнения, соединяющие точки, в которые вы проходите, что заставляет меня думать, что сплайн Matlab – это сплав на основе контрольной точки, такой как Hermite или Catmull-Rom вместо б-сплайн.

Однако scipy.interpolate.interpolate.spltopp действительно обеспечивает способ получения парциальных полиномиальных коэффициентов b-сплайна. К сожалению, это не работает очень хорошо.

 >>> import scipy.interpolate >>> x = [0, 1, 2, 3] >>> y = [0, 1, 4, 0] >>> tck = scipy.interpolate.splrep(x, y) >>> tck Out: (array([ 0., 0., 0., 0., 3., 3., 3., 3.]), array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), 3) >>> pp = scipy.interpolate.interpolate.spltopp(tck[0][1:-1], tck[1], tck[2]) >>> pp.coeffs.T Out: array([[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]]) 

Обратите внимание, что для каждого узла есть один набор коэффициентов, а не один для каждой из исходных точек. Кроме того, умножение коэффициентов на базисную матрицу b-сплайна не представляется очень полезным.

 >>> bsbm = array([[-1, 3, -3, 1], [ 3, -6, 3, 0], [-3, 0, 3, 0], [ 1, 4, 1, 0]]) * 1.0/6 Out: array([[-0.16666667, 0.5 , -0.5 , 0.16666667], [ 0.5 , -1. , 0.5 , 0. ], [-0.5 , 0. , 0.5 , 0. ], [ 0.16666667, 0.66666667, 0.16666667, 0. ]]) >>> dot(pp.coeffs.T, bsbm) Out: array([[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]]) 

Пакет Polytenomial Package FORTRAN, PPPack , имеет команду bsplpp которая преобразует из B-сплайна в кусочно-полиномиальную форму, которая может служить вашим потребностям. К сожалению, в настоящее время на PPPack нет оболочки Python.

Документы на scipy.interpolate.splrep говорят, что вы можете получить коэффициенты:

 Returns: tck : tuple (t,c,k) a tuple containing the vector of knots, the B-spline coefficients, and the degree of the spline. 

Вот как я могу получить результаты, похожие на MATLAB:

 >>> from scipy.interpolate import PPoly, splrep >>> x = [0, 1, 2, 3] >>> y = [0, 1, 4, 0] >>> tck = splrep(x, y) >>> tck Out: (array([ 0., 0., 0., 0., 3., 3., 3., 3.]), array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), 3) >>> pp = PPoly.from_spline(tck) >>> pp.cT Out: array([[ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00]]) 
  • Многомерная сплайн-интерполяция в python / scipy?
  • Геометрическое среднее, применяемое к ряду
  • Не печатать «успешно завершена оптимизация» scipy.optimize.fmin?
  • Асинхронно считывает и обрабатывает изображение в python
  • Создание массива в numpy / scipy путем итерации в Python?
  • Эффективный расчет расстояния между N точками и ссылкой в ​​numpy / scipy
  • Извлечение точек данных из scipy interolate / griddata
  • Быстрая интерполяция данных сетки
  • Scary's sparse eigsh () для небольших собственных значений
  • Факториал в numpy и scipy
  • Линейная регрессия массивов, содержащих NAN в Python / Numpy
  • Python - лучший язык программирования в мире.