2015-12-28 1 views
0

Я пытаюсь использовать пакет SciPy Python для создания сплайна через некоторые данные. Что касается вопроса here, я думаю, что причина, по которой в начале и в конце использования дублирующих узлов есть дублирующие узлы, заключается в том, что он делает зажатый сплайн. Я хочу, чтобы узлы проходили через данные (s = 0). Выходной сигнал splrep повторяет первый и последний узлы по 4 раза каждый (как в вопросе выше), и он включает внутренние точки данных в виде узлов , за исключением второй точки и следующей последней точки. Вот ММВЙ:scipy.interpolate.splrep с s = 0 повторяющимися конечными точками и исключая смежные

import math 
import numpy as np 
import scipy.interpolate 
import matplotlib.pyplot as plt 

x_dec = np.array([ 3.0289979374768700e-01, 3.0280333252410779e-01, 3.0270688524899364e-01, 
    3.0261045192336944e-01, 3.0251403254826026e-01, 3.0241762712469000e-01, 
    3.0232123565368257e-01, 3.0222485813626193e-01, 3.0212849457345037e-01]) 
# Make monotonically increase 
x_inc = math.pi/2 - x_dec 
print x_inc 
y = np.array([0.914024505, 0.914049905, 0.914075289, 0.914100656, 0.914126008, 0.914151343, 
    0.914176662, 0.914201964, 0.91422725]) 

spl_tck = scipy.interpolate.splrep(x_inc,y,k=3,s=0.0) 
# Print the knots 
print spl_tck[0] 

Вот выход:

[ 1.26789653 1.26799299 1.26808944 1.26818587 1.26828229 1.2683787 1.26847509 1.26857147 1.26866783] 

[ 1.26789653 1.26789653 1.26789653 1.26789653 1.26808944 1.26818587 1.26828229 1.2683787 1.26847509 1.26866783 1.26866783 1.26866783 1.26866783] 

Первая строка данные, вторая линия узлы. Как вы можете видеть, узлы повторяют первую и последнюю точки данных (x_inc[0] и x_inc[-1]). Затем точки данных x_inc[2] через x_inc[-3] - все узлы. Однако точки данных x_inc[1] и x_inc[-2] пропускаются как узловые точки.

Я думал, что указание s = 0 заставит сплайн проходить через все точки. Есть ли что-то в B-сплайнах и повторяется конечные точки как узловые точки, которые не позволяют использовать соседние точки данных в конечных точках в виде узлов?

ответ

1

Это так называемое граничное условие не-узла для b-сплайнов. Сплайн все еще проходит через все точки данных (проверьте его: попробуйте splev(x, tck) - y. Здесь играют две вещи: 1) кубический базовый элемент b-сплайна нуждается в пяти узлах; чтобы иметь сплайн, определенный в x[0], вы заполняете точки данных - таким образом, это повторяющееся значение в начале, то есть в конце. 2) для кубических сплайнов число коэффициентов, определяемых положением и числом условий (количество точек данных для интерполяции), отличается на два. Вы можете выбрать два дополнительных условия (например, указать значения конечных производных или потребовать, чтобы 2-й производные были равны нулю на краях базового интервала) или требуют дополнительной гладкости во второй точке от второго до последнего, следовательно, имя не-узел.

+0

Спасибо! Очень полезно. Мне любопытно, однако, почему при переходе от B-сплайнов к кубическим многочленам он сохраняет повторяющиеся узловые точки? Когда я беру вывод из приведенного выше кода и делаю: 'poly = scipy.interpolate.PPoly.from_spline (spl_tck)' out out in 'poly.x' имеет повторяющиеся точки. Это для меня кажется глупым, поскольку узлы в кубическом сплайне являются точками, между которыми действуют коэффициенты, поэтому повторение ничего не делает. Просто результат отправки не-узла B-сплайна в кубический сплайн-конвертер ?? – Paul

+0

Ну, я думаю, это просто, что в плавающей точке не очень четко определено равенство, поэтому попытка обнаружить, что сплайн-узлы совпадают, на самом деле не стоит того. Вы можете взглянуть на источник «PPoly.from_spline», это действительно пять строк. –

+0

Я должен добавить, что будущая версия scipy, вероятно, будет иметь интерполирующий сплайн-объект в полиномиальном базисе. См. Https://github.com/scipy/scipy/pull/5653 –

Смежные вопросы