<p>我解决了我的需要使用平分_左,并添加外推部分在同一个斜坡作为外坡。。在</p>
<pre><code>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
</code></pre>