1

我写了 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

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

4

1 回答 1

2

其实我看不出有什么问题。我在UnivariateSpline这里使用而不是interp1dand cubic_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

在此处输入图像描述

看起来 scipy 做得很好。

顺便说一句,如果您想(样条)拟合这些离群值,您可能需要考虑在 log-log 空间中工作,或者粗略地规范化您的数据(log-log space 之类的)。如果值处于同一数量级,则大多数拟合问题效果最佳。

于 2012-11-08T14:21:24.420 回答