擅长:python、mysql、java
<h3>一。常数外推</h3>
<p>您可以使用scipy中的<code>interp</code>函数,它将左右值外推为超出范围的常量:</p>
<pre><code>>>> from scipy import interp, arange, exp
>>> x = arange(0,10)
>>> y = exp(-x/3.0)
>>> interp([9,10], x, y)
array([ 0.04978707, 0.04978707])
</code></pre>
<h3>2。线性(或其他自定义)外推</h3>
<p>你可以在一个插值函数周围写一个包装器来处理线性外推。例如:</p>
<pre><code>from scipy.interpolate import interp1d
from scipy import arange, array, exp
def extrap1d(interpolator):
xs = interpolator.x
ys = interpolator.y
def pointwise(x):
if x < xs[0]:
return ys[0]+(x-xs[0])*(ys[1]-ys[0])/(xs[1]-xs[0])
elif x > xs[-1]:
return ys[-1]+(x-xs[-1])*(ys[-1]-ys[-2])/(xs[-1]-xs[-2])
else:
return interpolator(x)
def ufunclike(xs):
return array(map(pointwise, array(xs)))
return ufunclike
</code></pre>
<p><code>extrap1d</code>接受一个插值函数并返回一个也可以进行外推的函数。你可以这样使用它:</p>
<pre><code>x = arange(0,10)
y = exp(-x/3.0)
f_i = interp1d(x, y)
f_x = extrap1d(f_i)
print f_x([9,10])
</code></pre>
<p>输出:</p>
<pre><code>[ 0.04978707 0.03009069]
</code></pre>