2013-06-04 1 views
6

Ich verwende scipy.interpolate.UnivariateSpline, um eine große Menge von Daten reibungslos zu interpolieren. Funktioniert super. Ich bekomme ein Objekt, das sich wie eine Funktion verhält.Ausgabe von scipy.interpolate.UnivariateSpline später in Python oder in Matlab, ohne die ursprünglichen Datenpunkte

Jetzt möchte ich die Spline-Punkte für später speichern und sie in Matlab (und auch Python, aber das ist weniger dringend), ohne die ursprünglichen Daten verwenden. Wie kann ich das machen?

In scipy habe ich keine Ahnung; UnivariateSpline scheint keinen Konstruktor mit den zuvor berechneten Knoten und Koeffizienten zu bieten.

In MATLAB, ich habe die Funktionen Matlab versucht spline() und pchip(), und während beide nahe kommen, haben sie Fehler in der Nähe der Endpunkte, die wie Gibbs ears Art aussehen.

Hier ist ein Beispiel Satz von Daten, die ich habe, in Matlab Format:

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]) 

Die Koeffizienten und Knoten sind das Ergebnis von UnivariateSpline get_coeffs() und get_knots() auf dem scipy aufrufen. Die ‚y‘ Werte sind die Werte der UnivariateSpline an dem Knoten, oder genauer gesagt:

y = f(f.get_knots()) 

wobei f mein UnivariateSpline.

Wie kann ich mit diesen Daten einen Spline erstellen, der dem Verhalten der UnivariateSpline entspricht, ohne die Curve-Fitting Toolbox verwenden zu müssen? Ich muss in Matlab keine Daten anpassen, ich muss nur wissen, wie man einen kubischen Spline aus Knoten/Koeffizienten/Spline-Werten konstruiert.

+0

Ich weiß nicht, ob das hilft, aber ein 'UnivariateSpline' Objekt zumindest scheint pickleable zu sein, falls Sie wiederverwenden wollte Ihr passt in Python. –

+0

Eine detaillierte Antwort auf die Frage des OP ist unter http://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648 veröffentlicht. Diese Antwort bietet eine Möglichkeit, die Spline-Knoten und -Koeffizienten manuell zu bewerten, so dass das OP versuchen kann, sie mit den Eingaben zu vergleichen, die von anderen Programmen verwendet werden. – nzh

Antwort

1

In scipy, versuchen scipy.interpolate.splev, die

TCK nimmt: eine Sequenz ... mit dem Knoten, Koeffizienten, und der Grad des Splines.

hinzugefügt: die folgenden Python-Klasse erstellt Spline-Funktionen: init mit (Knoten, coefs, Grad), es dann wie Spline-Funktionen von UnivariateSpline(x, y, s) erstellt verwenden nur:

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

nein, das erlaubt mir nur, einen Spline auszuwerten, es lässt mich nicht ein UnivariateSpline-Objekt neu erstellen. –

3

Sie dagegen tun können mit den Funktionen _eval_args() und _from_tck() aus der Klasse UnivariateSpline. Die erste gibt die Spline-Parameter zurück, die Sie speichern können, und erstellt später ein ähnliches Spline-Objekt mit dem zweiten. Hier

ein Beispiel:

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

Verwandte Themen