Разница сплайн-интерполяции в IDL и Python

Я написал код 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 дал мне значения массива up примерно от -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

и это дало мне up со значениями примерно от -20 до -160. Есть идеи? Заранее спасибо!


person hoang tran    schedule 08.11.2012    source источник
comment
Для начала вы можете построить результат интерполяции по точкам данных и посмотреть, имеет ли это смысл или это полная ерунда. Кроме того, вы можете дважды проверить, одинаково ли IDL и scipy/numpy обрабатывают целочисленные массивы в своих подпрограммах (т. Е. Оба они автоматически переводят свой ввод в число с плавающей запятой?)   -  person    schedule 08.11.2012
comment
@Evert: Да, спасибо. Это хорошая идея, чтобы построить результаты. Я сделал это, и фотографии показаны здесь. Пожалуйста, посмотрите. Я предполагаю, что интерполированная функция Python не может поймать мой профиль. Тем не менее, я до сих пор не думаю, чтобы изменить его! ваша помощь, пожалуйста!   -  person hoang tran    schedule 08.11.2012
comment
Картинки показаны, где? Что вы имеете в виду под профилем?   -  person Janne Karila    schedule 08.11.2012
comment
Извините, я не могу публиковать изображения, потому что у меня недостаточно репутации.   -  person hoang tran    schedule 08.11.2012
comment
@JanneKarila под профилем я имею в виду свой график, здесь, в питоне, сплайн функции не следует моему графику, он не проходит через все точки графика. Он хочет построить кривую 3-го порядка из некоторых начальных точек.   -  person hoang tran    schedule 08.11.2012


Ответы (1)


На самом деле, я не вижу проблемы. Я использую здесь UnivariateSpline вместо interp1d и 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 отлично справляется со своей задачей.

Между прочим, если вы хотите (сплайн-) соответствовать таким выдающимся значениям, вы можете вместо этого рассмотреть возможность работы в пространстве журнала-журнала или грубой нормализации ваших данных (это делает пространство журнала-логарифма). Большинство задач подбора работают лучше всего, если значения имеют одинаковый порядок величины.

person Community    schedule 08.11.2012
comment
большое спасибо! Теперь я думаю, что мне нужна не функция кубического сплайна, а плавно подогнанная кривая. Я хочу, чтобы кривая подгонки проходила через все заданные точки. У вас есть опыт в этом? еще раз большое спасибо! - person hoang tran; 09.11.2012
comment
@hoangtran: у меня здесь практически нет опыта, но сплайн, по сути, представляет собой гладкую кривую; просто у него несколько неудобная математическая формулировка. Также ознакомьтесь с документацией по UnivariateSpline, в частности о параметре s. - person ; 09.11.2012
comment
@hoangtran Кубический сплайн проходит (проходит) через все заданные точки. - person Janne Karila; 09.11.2012