Я пытаюсь найти числовой пакет, который будет соответствовать естественному шлицу, который минимизирует метод взвешенных наименьших квадратов.
Существует пакет в scipy, который делает то, что я хочу для неестественных шлицов.
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate, randn
x = np.arange(0,5,1.0/6)
xs = np.arange(0,5,1.0/500)
y = np.sin(x+1) + .2*np.random.rand(len(x)) -.1
knots = np.array([1,2,3,4])
tck = interpolate.splrep(x,y,s=0,k=3,t=knots,task=-1)
ys = interpolate.splev(xs,tck,der=0)
plt.figure()
plt.plot(xs,ys,x,y,'x')
Файл spline.py внутри этого tar-файла с этой страницы по умолчанию соответствует естественному сплайну . Также на этой странице есть код, который в основном утверждает то, что вы хотите. Пакет pyD3D также имеет естественную сплайн-функцию в своем модуле pyDataUtils . Последний вариант мне кажется наиболее многообещающим. Однако, похоже, у него нет возможности устанавливать свои собственные узлы. Может быть, если вы посмотрите на источник, вы сможете найти способ исправить это.
Кроме того, я нашел это сообщение в списке рассылки Scipy, в котором говорится, что использование s = 0.0 (как в данном коде) делает сплайны, подогнанные с помощью описанной выше процедуры, естественным образом в соответствии с составителем сообщения. Я нашел эту функцию splmake , у которой есть возможность выполнять естественную подгонку сплайна, но, посмотрев на исходный код, я обнаружил, что она еще не реализована.