Сплайн-интерполяция наименьших квадратов, заставляющая интерполант проходить через определенные точки - PullRequest
0 голосов
/ 06 июня 2019

У меня проблемы с реализацией не совсем обычной задачи интерполяции.У меня есть несколько (x, y) точек данных, разбросанных вдоль некоторой кривой, которую априори я не знаю, и я хочу восстановить эту кривую в лучшем виде, интерполируя свою точку с минимальной квадратной ошибкой.Я подумал об использовании scipy.interpolate.splrep для этой цели (но, возможно, есть лучшие варианты, которые вы бы посоветовали использовать).Дополнительная трудность в моем случае заключается в том, что я хочу ограничить сплайновую кривую, чтобы она проходила через некоторые конкретные точки моих исходных данных.Я предполагаю, что игра с узлами и весами могла бы сделать трюк, но я не знаю, как это сделать (я откладываю избегание теории сплайн-интерполяции помимо основных процедур подгонки).Кроме того, по некоторым нераскрытым причинам, когда я пытаюсь настроить узлы в моем splrep, я получаю ту же ошибку в этом посте , которая продолжает усложнять вещи.Вот мой пример кода:

from __future__ import division
import numpy as np
import scipy.interpolate as spi
import matplotlib.pylab as plt

# Some surrogate sample data
f = lambda x : x**2 - x/2.
x = np.arange(0.,20.,0.1)
y = f(4*(x + np.random.normal(size=np.size(x))))

# I want to use spline interpolation with least-square fitting criterion, making sure though that the spline starts
# from the origin (or in general passes through a precise point of my dataset). 
# In my case for example I would like the spline to originate from the point in x=0. So I attempted to include as first knot x=0... 
# but it won't work, nor I am sure this is the right procedure...

fy = spi.splrep(x,y)
fy = spi.splrep(x,y,t=fy[0])
yy = spi.splev(x,fy)

plt.plot(x,y,'-',x,yy,'--')
plt.show()

, который, несмотря на то, что я даже передаю узлы, вычисленные по первому вызову splrep, даст мне:

  File "/usr/lib64/python2.7/site-packages/scipy/interpolate/fitpack.py", line 289, in splrep
    res = _impl.splrep(x, y, w, xb, xe, k, task, s, t, full_output, per, quiet)
  File "/usr/lib64/python2.7/site-packages/scipy/interpolate/_fitpack_impl.py", line 515, in splrep
    raise _iermess[ier][1](_iermess[ier][0])
ValueError: Error on input data

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Вы используете аргумент весов splrep: можете дать этим точкам нужные вам фиксированные очень большие веса.Это обходной путь, так что следите за качеством и стабильностью.

0 голосов
/ 07 июня 2019

Установка больших весов для определенных точек - действительно рабочее решение, предложенное @ ev-br.Кроме того, поскольку нет прямого способа сопоставить производные в экстремумах кривой, то же самое обоснование может быть применено и в этом случае.Скажем, вы хотите, чтобы производные в y[0] и y[-1] соответствовали производным ваших точек данных, затем вы добавляете большие веса также для y[1] и y[-2], то есть

weights = np.ones(len(x))
weights[[0,-1]] = 100  # Promote spline interpolant through first and last point
weights[[1,-2]] = 50   # Make spline interpolant derivative tend to derivatives at first/last point
fy = spi.splrep(x,y,w=weights,s=0.1)
yy = spi.splev(x,fy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...