Результаты Python Numpy Polyfit отличаются от SciPy интерполяции - PullRequest
0 голосов
/ 26 мая 2018

Я должен использовать более старую версию Scipy, которую нельзя экстраполировать.В Scipy 1.1.0 экстраполяция работает, как и ожидалось, давая правильные результаты.Поскольку я не могу использовать это в своем приложении, я хочу использовать numpy polyfit.но результаты разные, в то время как интерполяция результатов scipy и bisect одинакова*

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я решил для своих нужд, используя bisect_left и добавив экстраполированный участок в том же уклоне, что и внешние уклоны.

class bsInterExtraPolate(object):
  def __init__(self, x_list, y_list):
    if any(y - x <= 0 for x, y in zip(x_list, x_list[1:])):
      raise ValueError("x_list must be in strictly ascending order!")
    x_list = self.x_list = map(float, x_list)
    y_list = self.y_list = map(float, y_list)
    intervals = zip(x_list, x_list[1:], y_list, y_list[1:])
    self.slopes = [(y2 - y1)/(x2 - x1) for x1, x2, y1, y2 in intervals]

  def __getitem__(self, x):
    #-- expanding for lin extrapolation using outer slopes
    from bisect import bisect_left
    if type(x)==list:
      yval=[]
      for xval in x:
        if xval < self.x_list[0]:
          i=0
        elif xval > self.x_list[-1]:
          i=len(self.x_list)-2
        else:
          i = bisect_left(self.x_list, xval) - 1
        ytmp=self.y_list[i] + self.slopes[i] * (xval - self.x_list[i])
        yval.append(ytmp)
    else:
      xval=float(x)
      if xval < self.x_list[0]:
        i=0
      elif xval > self.x_list[-1]:
        i=len(self.x_list)-2
      else:
        i = bisect_left(self.x_list, xval) - 1
      ytmp=self.y_list[i] + self.slopes[i] * (xval - self.x_list[i])
      yval=ytmp
    return yval
0 голосов
/ 26 мая 2018

Если вы нарисуете фактические результаты, вы быстро поймете, почему линейная интерполяция не является линейной подгонкой: интерполяция работает от точки к точке, в то время как подгонка учитывает все точки: enter image description here

Это не объясняет, как сделать это правильно, но должно объяснить, почему это не удается.

Я не вижу способа использовать полиномиальное соответствие в качестве альтернативы интерполяции с точно такой жерезультат.

Вам придется либо самостоятельно кодировать интерполяцию, либо найти способ установить более новую версию SciPy.

Для начала посмотрите, можете ли вы использовать *Опция 1012 * при установке SciPy.Вы не упоминаете, почему вы должны использовать более старую версию, и что мешает вам установить более новую версию.Это может быть еще один вопрос, который нужно задать: как обойти все ограничения, связанные с установкой современной версии SciPy.

...