2013-06-04 5 views
6

大量のデータを円滑に補間するためにscipy.interpolate.UnivariateSplineを使用しています。よく働く。私は関数のように動作するオブジェクトを取得します。元のデータポイントを必要とせずに、後でpythonまたはMatlabでscipy.interpolate.UnivariateSplineの出力を使用

私はスプライン点を後で保存して元のデータを必要とせずに、Matlab(そしてPythonもそれほど緊急ではありません)で使用します。これどうやってするの?

私は手がかりがありません。 UnivariateSplineは以前に計算されたノットと係数を持つコンストラクタを提供していないようです。 MATLABで

、私はMATLABはspline()pchip()を機能試してみた、との両方が近くに来ている間、彼らは一種のGibbs earsのように見えるエンドポイントの近くにエラーを持っています。ここで

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

係数と結び目がscipyのダウンロードUnivariateSplineにget_coeffs()get_knots()を呼び出した結果です。 「Y」の値は、より正確ノットでUnivariateSplineの値であり、または:fは私のUnivariateSplineある

y = f(f.get_knots()) 

カーブフィッティングツールボックスを使用せずに、このデータを使用してUnivariateSplineの動作に一致するスプラインを作成するにはどうすればよいですか? Matlabでデータフィッティングを行う必要はありません。ノット/係数/スプライン値から3次スプラインを作成する方法を知る必要があります。スプラインのノット、係数、および程度を含む...配列:

+0

あなたは再使用したい場合には、このことができます場合、私は知らないが、 'UnivariateSpline'オブジェクトは、少なくともpickleableのようですあなたのPythonでのフィット感。 –

+0

OPの質問に対する詳細な回答はhttp://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648に掲載されています。この答えは、スプラインノットと係数を手動で評価する手段を提供するので、OPは他のプログラムで使用されている入力と一致させることができます。 – nzh

答えて

1

scipyのダウンロードでは、

TCKをとる、scipy.interpolate.splevを試みます。

を追加しました:次のPythonクラスは、スプライン関数を作成します(ノット、coefs、度)と INIT、 は、ちょうど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

いいえ、スプラインを評価できるだけで、UnivariateSplineオブジェクトを再作成することはできません。 –

3

あなたはそれを行うことができますクラスUnivariateSplineからの_eval_args()_from_tck()の関数を使用します。最初のものはスプラインパラメータを返します。このスプラインパラメータを保存し、後で2番目のスプラインオブジェクトを使用して同様のスプラインオブジェクトを作成することができます。ここで

は一例です:

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