Python Numpy polyfit结果与SciPy interp不同

2024-09-30 08:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须用一个旧的,不能推断的版本。 在scipy1.1.0中,外推法按预期工作,给出了正确的结果。 因为我不能在我的应用程序中使用这个,所以我想使用numpy polyfit。 但结果不同,而scipy和bisect的插值结果是相同的。。在

class InterExtraPolate(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!")
    self.x_list = map(float, x_list)
    self.y_list = map(float, y_list)
  def __getitem__(self, x):
    from scipy import interpolate
    f=interpolate.interp1d(self.x_list,self.y_list, fill_value='extrapolate')
    return f(x)


class npInterExraPolate(object):
  def __init__(self, x_list, y_list):
    import numpy as np
    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!")
    self.x_list = map(float, x_list)
    self.y_list = map(float, y_list)
    self.fit=np.polyfit(self.x_list,self.y_list, 1)

  def __getitem__(self, x):
    import numpy as np
    f=np.poly1d(self.fit)
    return f(x)

##Main


ie   =  InterExtraPolate([1, 2.5, 3.4, 5.8, 6], [2, 4, 5.8, 4.3, 4])
npie = npInterExraPolate([1, 2.5, 3.4, 5.8, 6], [2, 4, 5.8, 4.3, 4])

my_xl = [0.5,1.1,6.3]

print ie[my_xl]

print npie[my_xl]

在==== 如何使numpy polyfit/poly1d结果等于scipy外推结果?在


Tags: inimportselfnumpymapmydefnp
2条回答

我解决了我的需要使用平分_左,并添加外推部分在同一个斜坡作为外坡。。在

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

如果绘制实际结果,您将很快看到为什么线性插值不是线性拟合:插值是逐点进行的,而拟合会将所有点都考虑在内: enter image description here

这并不能解释如何正确地执行它,但应该解释为什么它失败了。在

我看不出用多项式拟合代替插值的方法,结果完全一样。在

您要么自己编写插值代码,要么想办法安装一个更新版本的SciPy。在

对于初学者来说,在安装SciPy时看看是否可以使用 user选项。你没有提到为什么必须使用旧版本,以及是什么阻止了你安装新版本。这可能是另一个需要问的问题:如何规避安装最新版本SciPy的限制。在

相关问题 更多 >

    热门问题