IDL和Python中样条插值的差异

时间:2012-11-08 09:52:10

标签: python interpolation spline idl-programming-language

我写了IDL代码:

zz= [  0,  5, 10, 15, 30, 50, 90, 100,  500]
uz= [ 20, 20, 20, 30, 60, 90, 30, -200, -200]*(-1.)
zp= findgen(120)*500+500
up= spline((zz-10.),uz,(zp/1000.0))
print, up 

和IDL从 -20到500

给了我 up 数组的值

。我在Python中做的一样

import numpy as npy
zz = npy.array([  0,  5, 10, 15, 30, 50, 90, 100,  500])
uz = npy.array([ 20, 20, 20, 30, 60, 90, 30, -200, -200])*(-1.)
zp = npy.arange(0,120)*500+500
from scipy.interpolate import interp1d
cubic_interp_u = interp1d(zz-10., uz, kind='cubic')
up = cubic_interp_u(zp/1000)
print up

它给了我 up ,其值大约为 -20到-160 。任何的想法?提前谢谢!

1 个答案:

答案 0 :(得分:2)

实际上,我没有看到问题。我在这里使用的是UnivariateSpline而不是interp1dcubic_interp_u,但据我所知,基本的例程基本相同:

import numpy as npy
import pyplot as pl
from scipy.interpolate import UnivariateSpline
zz = npy.array([  0,  5, 10, 15, 30, 50, 90, 100,  500])
uz = npy.array([ 20, 20, 20, 30, 60, 90, 30, -200, -200])*(-1.)
zp = npy.arange(0,120)*500+500
pl.plot(zz, uz, 'ro')
pl.plot(zp/100, UnivariateSpline(zz, uz, s=1, k=3)(zp/100), 'k-.')
pl.plot(zp/1000, UnivariateSpline(zz, uz, s=1, k=3)(zp/1000), 'b-')

我看到的唯一问题是你使用zp/1000来限制插值。使用zp/100,我获得了-160, -20范围之外的所有值,您还可以在点划线的图表上看到与蓝线(zp/1000)相比较的值:

enter image description here

看起来scipy做得很好。

顺便说一下,如果你想(spline-)拟合这样的外围值,你可能想要考虑在日志日志空间中工作,或者大致规范化你的数据(日志日志空间类型)。如果值处于相同的数量级,则大多数拟合问题的效果最佳。