2009-06-22 15 views
11

पैदा करता है वहाँ जो एक्स मुझे वाई मैं SciPy में रहा हूँ देता है खोजने के लिए एक बेहतर तरीका है? मैंने अभी साइपी का उपयोग शुरू किया और मैं प्रत्येक समारोह से बहुत परिचित नहीं हूं।SciPy में अंतर्वेशन: एक्स ढूँढना है कि वाई

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

यूनिवर्सेटस्पिन क्लास स्पीसी में स्प्लिंस को और अधिक पाइथनिक बनाता है।

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 पर एक्स जानने के लिए तो कार्य करें:

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

मैं y के मामले में एक्स interpolating काम हो सकता है सोचा था, लेकिन यह कुछ हद तक एक अलग रास्ता ले जाता है। यह अधिक अंक के साथ हो सकता है।

+1

क्या इसे दो बार CPU गणना की मात्रा की आवश्यकता नहीं होगी क्योंकि व्यावहारिक रूप से वही डेटा सेट दो बार इंटरपोल कर रहे हैं? – JcMaco

+0

@ जेसीएमएको, यूनिवर्सेटस्पलाइन का पहला उपयोग सिर्फ एक सुंदर साजिश बनाने के लिए है। दूसरा उपयोग वास्तव में मूल्य देता है। – Theran

+0

क्रेग सही है, क्या आप इसे अपने उदाहरण पर सही कर सकते हैं क्योंकि यह अन्यथा महान है! –

1

तो आप सभी की जरूरत रैखिक प्रक्षेप है, तो आप numpy में interp समारोह इस्तेमाल कर सकते हैं।

+0

मैं स्पलीन इंटरपोलेशन पसंद करूंगा। इंटरप फ़ंक्शन मेरी समस्या को और आसानी से हल करने में मेरी सहायता कैसे करेगा? – JcMaco

+0

आपके प्रश्न ने यह निर्दिष्ट नहीं किया कि आपको किस प्रकार की इंटरपोलेशन की आवश्यकता है - यदि रैखिक आपकी समस्या के लिए पर्याप्त नहीं है, तो मुझे नहीं लगता कि इंटरप मदद करेगा। –

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 देगा। बेशक, अगर इंटरपोलेशन क्वाड्रैटिक (या उच्च शक्ति) है तो कई समाधान हो सकते हैं। – JcMaco

संबंधित मुद्दे