2009-06-22 9 views
11

생산 찾기 X는 X이 날 내가 SciPy에서 찾고 오전 Y에게주는 찾을 수있는 더 좋은 방법이 있나요? 방금 SciPy를 사용하기 시작했고 각 기능에 익숙하지 않습니다. 당신이 필요로하는 모든 선형 보간 인 경우SciPy에서 보간 : Y

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

x = [70, 80, 90, 100, 110] 
y = [49.7, 80.6, 122.5, 153.8, 163.0] 
tck = interpolate.splrep(x,y,s=0) 
xnew = np.arange(70,111,1) 
ynew = interpolate.splev(xnew,tck,der=0) 
plt.plot(x,y,'x',xnew,ynew) 
plt.show() 
t,c,k=tck 
yToFind = 140 
print interpolate.sproot((t,c-yToFind,k)) #Lowers the spline at the abscissa 
+0

당신이 더 나은하려는 작업에 정교한 수 있습니까? 성능, 정확성, 간결성? – Ryan

답변

16

scipy의 UnivariateSpline 클래스는 훨씬 더 pythonic 스플라인을하고 있습니다.

x = [70, 80, 90, 100, 110] 
y = [49.7, 80.6, 122.5, 153.8, 163.0] 
f = interpolate.UnivariateSpline(x, y, s=0) 
xnew = np.arange(70,111,1) 

plt.plot(x,y,'x',xnew,f(xnew)) 

는 할 Y에서 X를 찾는 방법은 다음과 같습니다

yToFind = 140 
yreduced = np.array(y) - yToFind 
freduced = interpolate.UnivariateSpline(x, yreduced, s=0) 
freduced.roots() 

나는 작동 할 수 있습니다 Y의 측면에서 X를 보간 생각하지만 다소 다른 경로를합니다. 그것은 더 많은 포인트와 더 가까울지도 모른다.

+1

실질적으로 동일한 데이터 세트를 두 번 보간 한 이후로 두 배의 CPU 계산이 필요하지 않습니까? – JcMaco

+0

@JcMaco, UnivariateSpline의 첫 번째 사용법은 예쁜 음모를 꾸미는 것입니다. 두 번째 용도는 실제로 값을 제공하는 것입니다. – Theran

+0

Craig가 맞습니다. 그렇지 않으면 위의 예처럼 문제를 해결할 수 있습니까? –

1

, 당신은 NumPy와의 interp 기능을 사용할 수 있습니다.

+0

스플라인 보간을 선호합니다. interp 함수는 내 문제를보다 쉽게 ​​해결하는 데 어떻게 도움이됩니까? – JcMaco

+0

귀하의 질문에 어떤 유형의 보간이 필요한지 명시하지 않았습니다. 선형이 문제에 대해 충분하지 않은 경우, interp가 도움이된다고 생각하지 않습니다. –

0

내가 미안하다면 질문에 대한 오해가있을 수 있습니다. SciPy를 사용할 필요가 없다고 생각합니다. NumPy에는 최소 자승 기능이 있습니다.

#!/usr/bin/env python 

from numpy.linalg.linalg import lstsq 



def find_coefficients(data, exponents): 
    X = tuple((tuple((pow(x,p) for p in exponents)) for (x,y) in data)) 
    y = tuple(((y) for (x,y) in data)) 
    x, resids, rank, s = lstsq(X,y) 
    return x 

if __name__ == "__main__": 
    data = tuple((
     (1.47, 52.21), 
     (1.50, 53.12), 
     (1.52, 54.48), 
     (1.55, 55.84), 
     (1.57, 57.20), 
     (1.60, 58.57), 
     (1.63, 59.93), 
     (1.65, 61.29), 
     (1.68, 63.11), 
     (1.70, 64.47), 
     (1.73, 66.28), 
     (1.75, 68.10), 
     (1.78, 69.92), 
     (1.80, 72.19), 
     (1.83, 74.46) 
    )) 
    print find_coefficients(data, range(3)) 

이렇게하면 [128.81280358 -143.16202286 61.96032544]가 반환됩니다.

>>> x=1.47 # the first of the input data 
>>> 128.81280358 + -143.16202286*x + 61.96032544*(x**2) 
52.254697219095988 

0.04 밖으로, 나쁜

+0

문제는 어느 번호가 52.21을 줄지 찾는 것입니다. 물론 보간법이 2 차 (또는 고출력) 인 경우 많은 솔루션이있을 수 있습니다. – JcMaco