интерпретировать результат подгонки сплайна scipy.interpolate

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

knots,coeff,n=scipy.interpolate.splrep(x,y)

Как ни странно, мне нужно было удалить первую и последнюю 3 записи в массивах, чтобы заставить код работать (примечание: первые 4 и последние 4 записи узлов одинаковы и поэтому будут давать ошибку деления на 0). Кто-нибудь знает, почему есть эти дублированные записи? Помимо удаления этих записей, уравнение со страницы вики работает. Из результата

knots=[   15.,    15.,    15.,    15.,    75.,   105., ...,  2895.,  2925., 2985.,  2985.,  2985.,  2985.]
coeffs=[ 1.87979615,  1.54132042,  1.46751212,  1.31223359,  1.34208367,  1.2181689, ..., 0.99327417,0.5866527,   0.,          0.,          0., 0.        ]

Я получаю хорошее приближение точек данных.

Однако, когда я также хочу использовать веса, я заметил, что массивы "knots" и "coeff" выглядят очень странно. Кто знает, как мне нужно интерпретировать результат функции подгонки сплайна? В настоящее время я получаю

knots=[15.,15.,15.,15.,2985.,2985.,2985.,2985.] 
coeff=[ 1.48725714,0.3513811,0.71970619,0.66119226,0.,0.,0.,0. ]

Или это все же ошибка?

В идеале мне нравится иметь код (C/C++, python), который оценивает различные точки с учетом узлов и коэффициентов функции.


person user3611765    schedule 07.05.2014    source источник
comment
Подробный ответ на аналогичный вопрос размещен по адресу stackoverflow.com/questions/22488637/. Ответ предоставляет функцию для ручной оценки узлов и коэффициентов B-сплайна, поэтому вы можете попытаться сопоставить их с входными данными, используемыми другими программами.   -  person nzh    schedule 15.08.2014


Ответы (1)


Я думаю, что причина того, что у вас есть повторяющиеся узлы в начале и конце, заключается в том, что они образуют зажатый сплайн. Это вариант при создании сплайна на других числовых языках (таких как Scilab ). Согласно Math.stackexchange повторение узлов является стандартный способ получить зажатый сплайн, проходящий через конечные точки, со сплайном, начальный и конечный наклон которого аппроксимирует данные до второй и предпоследней точек.

Комментарий выше объясняет, как оценить B-сплайн. Однако вы также можете использовать interpolate.PPoly (через interpolate.PPoly.from_spline), чтобы преобразовать B-сплайн в кусочно-полиномиальный сплайн, который легко вычислить, как это хорошо объяснено в этот ответ.

person Paul    schedule 28.12.2015