2013-06-04 3 views
6

많은 양의 데이터를 부드럽게 보간하기 위해 scipy.interpolate.UnivariateSpline을 사용하고 있습니다. 훌륭하게 작동합니다. 나는 함수처럼 행동하는 객체를 얻는다.나중에 파이썬이나 Matlab에서 원본 데이터 포인트가 필요없이 scipy.interpolate.UnivariateSpline의 출력을 사용합니다.

이제 스플라인 포인트를 저장하고 원본 데이터를 필요로하지 않고 Matlab (및 Python에도 사용할 수 있지만 덜 긴급합니다)에서 사용하려고합니다. 어떻게해야합니까?

scipy에서 단서가 없습니다; UnivariateSpline은 이전에 계산 된 매듭과 계수로 생성자를 제공하지 않는 것 같습니다.

MATLAB에서 Matlab 함수 spline()pchip()을 사용해 보았습니다. 둘 다 가까와 지지만 Gibbs ears처럼 보이는 끝점 근처에 오류가 있습니다.

여기 매트랩 형식이 I는 데이터의 샘플 세트가있다 :

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에서 데이터 피팅을 할 필요가 없습니다. 매듭/계수/스플라인 값으로 입방 스플라인을 구성하는 방법을 알아야합니다. 스플라인의 매듭 계수 및 정도를 함유 ... 시퀀스 :

+0

는 나도 몰라,하지만'UnivariateSpline' 객체는 적어도 당신이 재사용하고 싶었 경우, pickleable 것 같다 파이썬에 적합합니다. –

+0

OP 질문에 대한 자세한 답변은 http://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648에 게시되어 있습니다. 이 답은 스플라인 노트와 계수를 수동으로 평가하는 수단을 제공하므로 OP는 다른 프로그램에서 사용하는 입력 값과 일치시킬 수 있습니다. – nzh

답변

1

scipy에서

TCK 소요되며, scipy.interpolate.splev 시도.

추가 : 다음 파이썬 클래스는 스플라인 함수를 만듭니다

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

당신은 그것을 할 수 있습니다 : (노트, coefs,도)와 초기화는 는 단지 UnivariateSpline(x, y, s) 만든 스플라인 기능처럼 사용 클래스 UnivariateSpline_eval_args()_from_tck() 함수를 사용합니다. 첫 번째 매개 변수는 스플라인 매개 변수를 반환하며 두 번째 매개 변수를 사용하여 유사한 스플라인 객체를 저장하고 나중에 만들 수 있습니다. 여기

은 예입니다 :이 도움이된다면

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