2013-06-04 7 views
6

Używam scipy.interpolate.UnivariateSpline do płynnej interpolacji dużej ilości danych. Działa świetnie. Dostaję obiekt, który działa jak funkcja.przy użyciu wyniku scipy.interpolate.UnivariateSpline później w Pythonie lub w Matlab bez potrzeby oryginalnych punktów danych

Teraz chcę zapisać punkty splajnu na później i używać ich w Matlab (a także w Pythonie, ale to mniej pilne), bez potrzeby posiadania oryginalnych danych. Jak mogę to zrobić?

W scipy nie mam pojęcia; UnivariateSpline wydaje się nie oferować konstruktora z wcześniej wyliczonymi węzłami i współczynnikami.

W programie MATLAB, próbowałem funkcji Matlab spline() i pchip(), a jednocześnie zarówno zbliżyć, mają błędy w pobliżu punktów końcowych, które wyglądają trochę jak Gibbs ears.

Oto przykładowy zestaw danych, które mam w formacie Matlab:

splinedata = struct('coeffs',[-0.0412739180955273 -0.0236463479425733 0.42393753107602 -1.27274336116436 0.255711720888164 1.93923263846732 -2.30438927604816 1.02078680231079 0.997156858475075 -2.35321792387215 0.667027554745454 0.777918416623834],... 
'knots',[0 0.125 0.1875 0.25 0.375 0.5 0.625 0.75 0.875 0.9999],... 
'y',[-0.0412739180955273 -0.191354308450615 -0.869601364377744 -0.141538578624065 0.895258135865578 -1.04292294390242 0.462652465278345 0.442550440125204 -1.03967756446455 0.777918416623834]) 

Współczynniki i węzły są wynikiem nazywając get_coeffs() i get_knots() na scipy UnivariateSpline. Wartości „Y” są wartości UnivariateSpline w węzłach, a dokładniej:

y = f(f.get_knots()) 

gdzie f jest my UnivariateSpline.

W jaki sposób mogę użyć tych danych do utworzenia splajnu, który pasuje do zachowania UnivariateSpline, bez konieczności używania Przybornika dopasowywania krzywych? Nie potrzebuję żadnych dopasowań danych w Matlab, po prostu muszę wiedzieć, jak skonstruować splajn sześcienny z wartości węzłów/współczynników/splajnów.

+0

ja nie wiem, czy to pomoże, ale 'obiekt UnivariateSpline' przynajmniej wydaje się być pickleable, w razie gdybyś chciał ponownego wykorzystania twoje dopasowanie w Pythonie. –

+0

Szczegółowa odpowiedź na pytanie OP znajduje się na stronie http://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648. Ta odpowiedź zapewnia sposób ręcznej oceny węzłów spline i współczynników, tak aby OP mógł spróbować dopasować je do danych wejściowych używanych przez inne programy. – nzh

Odpowiedz

1

W scipy, spróbuj scipy.interpolate.splev, która odbywa

TCK: sekwencja ... zawierający Węzły, współczynniki i stopień splajnu.

Dodano: następujące klasy Pythona tworzy funkcje spline: startowych z (sęki, coefs, stopień), następnie używać go podobnie jak funkcji sklejanych stworzonych przez UnivariateSpline(x, y, s):

from scipy.interpolate import splev 
    # http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splev.html 

class Splinefunc: 
    """ splinef = Splinefunc(knots, coefs, degree) 
     ... 
     y = splinef(x) # __call__ 

     19june untested 
    """ 

    def __init__(self, knots, coefs, degree): 
     self.knots = knots 
     self.coefs = coefs 
     self.degree = degree 

    def __call__(self, x): 
     return splev(x, (self.knots, self.coefs, self.degree)) 
+0

nie, to tylko pozwala mi ocenić splajn, nie pozwala mi odtworzyć obiektu UnivariateSpline. –

3

można to zrobić przy użyciu funkcji _eval_args() i z klasy UnivariateSpline. Pierwsza z nich zwraca parametry splajnu, które można zapisać, a następnie utworzyć podobny obiekt splajnowy za pomocą drugiego.

Oto przykład:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.interpolate import UnivariateSpline 

x = np.linspace(-3, 3, 50) 
y = np.exp(-x**2) + 0.1 * np.random.randn(50) 

spl1 = UnivariateSpline(x, y, s=.5) 

xi = np.linspace(-3, 3, 1000) 

tck = spl1._eval_args 

spl2 = UnivariateSpline._from_tck(tck) 

plt.plot(x, y, 'ro', ms=5, label='data') 
plt.plot(xi, spl1(xi), 'b', label='original spline') 
plt.plot(xi, spl2(xi), 'y:', lw=4, label='recovered spline') 

plt.legend() 
plt.show() 

enter image description here

Powiązane problemy