def make_extrapolator_fixed_slope(xSmall, fSmall, outwardSlope):
"""Create an extrapolator that uses cubic interpolation within the given domain xSmall, and an
imposed linear fit with imposed slope outside the given domain xSmall. Data must be sorted.
Inputs:
xSmall independent variable on the smaller domain (array)
fSmall dependent variable on the smaller domain (array)
outwardSlope imposed slope outside the domain xSmall
Outputs:
extrapolator function that can be evaluated on a domain, like interpolators
"""
def extrapolator(xLarge):
fLarge = np.zeros_like(xLarge, dtype=np.float)
# exterior region: left side
indLeftExterior = xLarge < xSmall[0]
fLarge[indLeftExterior] = outwardSlope * (xLarge[indLeftExterior] - xSmall[0]) + fSmall[0]
#exterior region: right side
indRightExterior = xLarge > xSmall[-1]
fLarge[indRightExterior] = outwardSlope * (xLarge[indRightExterior] - xSmall[-1]) + fSmall[-1]
# interpolated points in the interior using cubic interpolation
interpolatorInterior = scipy.interpolate.InterpolatedUnivariateSpline(xSmall, fSmall, k=3) # cubic
indInterior = (xLarge >= xSmall[0]) & (xLarge <= xSmall[-1])
fLarge[indInterior] = interpolatorInterior(xLarge[indInterior])
return fLarge
return extrapolator
评论列表
文章目录