2012-11-08 82 views
1

样条插值的我写的IDL代码:差异IDL和Python

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

。同样我确实在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 

,它给了我与价值观从约-20到-160。任何想法?提前致谢!

+0

对于初学者,您可以在数据点上绘制插值结果,并查看是否有意义,或者是否完全无意义。另外,你可能想要仔细检查IDL和scipy/numpy是否将整数数组作为它们的例程相同(即,它们是否都会自动将其输入转换为浮点数?) – Evert

+0

@Evert:是的,谢谢。绘制结果是一个好主意。我已经完成了,图片显示在这里。请看一看。我猜Python的内插函数无法捕捉到我的配置文件。但是,我仍然不知道要修改它!请帮助你! –

+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做得很好。顺便说一句,如果你想(样条线)适合这样的偏离值,你可能需要考虑在对数空间中工作,或者粗略地规范你的数据(对数空间类型) 。如果数值处于相同的数量级,大多数拟合问题的效果最好。

+0

非常感谢你!现在我想我需要的不是一个三次样条函数,而是一条平滑拟合的曲线。我想要拟合曲线通过所有给定的点。你有这方面的经验吗?再次感谢! –

+0

@hoangtran:我在这里几乎没有任何经验,但样条基本上是一条平滑的曲线;它只是有一个不太方便的数学公式。另外,请查看UnivariateSpline的文档,特别是关于他参数的文档。 – Evert

+0

非常感谢您的帮助! –