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までの配列の値を私に与えました

.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

実は問題ないです。ここではandUnivariateSplineの代わりに使用していますが、基本的なルーチンは、私が知る限り、基本的に同じです。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

ここに画像の説明を入力してください

scipyは素晴らしい仕事をしているようです。

ちなみに、このような範囲外の値を(スプライン)フィットさせたい場合は、代わりに両対数スペースで作業するか、データを大まかに正規化することを検討してください(両対数スペースのようなものです)。ほとんどのフィッティングの問題は、値が同じ桁数である場合に最適に機能します。

于 2012-11-08T14:21:24.420 に答える