2016-05-09 17 views
5

पर जेड-वैल्यू को इंटरपोलेट करें (एक्स, वाई, जेड) में बिंदुओं के एक सेट को देखते हुए जो सतह पर बिंदु हैं , मैं मनमाना (एक्स, वाई) निर्देशांक पर जेड-वैल्यू को अलग करने में सक्षम होना चाहता हूं। मुझे ग्रिड पर मूल्यों को इंटरपोल करने के लिए mlab.griddata का उपयोग करके कुछ सफलता मिली है, लेकिन मैं किसी भी (एक्स, वाई) समन्वय के लिए सामान्य उपयोग फ़ंक्शन को कॉल करने में सक्षम होना चाहता हूं।(एक्स, वाई, जेड) में परिभाषित बिंदुओं के एक सेट को देखते हुए, मनमानी (एक्स, वाई)

अंक का सेट मोटे तौर पर गोलार्द्ध सतह बनाता है। समस्या को सरल बनाने के लिए, मैं एक विधि लिखने की कोशिश कर रहा हूं जो नीचे एक्स, वाई, और जेड निर्देशांक द्वारा परिभाषित गोलार्ध के ज्ञात बिंदुओं के बीच मूल्यों को विभाजित करता है। यद्यपि एक सही क्षेत्र के लिए z = f (x, y) खोजने के लिए एक विश्लेषणात्मक समाधान है, जैसे कि आपको इंटरपोलेट करने की आवश्यकता नहीं है, बिंदुओं का वास्तविक सेट एक सही क्षेत्र नहीं होगा, इसलिए हमें यह मानना ​​चाहिए कि हमें आवश्यकता है अज्ञात (एक्स, वाई) निर्देशांक पर मूल्यों को अलग करने के लिए। Link to IPython notebook with point data

resolution = 10 
u = np.linspace(-np.pi/2, np.pi/2, resolution) 
v = np.linspace(0, np.pi, resolution) 

U, V = np.meshgrid(u, v) 

xs = np.sin(U) * np.cos(V) 
ys = np.sin(U) * np.sin(V) 
zs = np.cos(U) 

मैं scipy.interpolate.interp2d, जो उपयोग किया गया है "एक समारोह जिसका कॉल विधि नए अंक के मूल्य को खोजने के लिए पट्टी प्रक्षेप का उपयोग करता है देता है।"

def polar(xs, ys, zs, resolution=10): 
    rs = np.sqrt(np.multiply(xs, xs) + np.multiply(ys, ys)) 
    ts = np.arctan2(ys, xs) 
    func = interp2d(rs, ts, zs, kind='cubic') 
    vectorized = np.vectorize(func) 

    # Guesses 
    ri = np.linspace(0, rs.max(), resolution) 
    ti = np.linspace(0, np.pi * 2, resolution) 

    R, T = np.meshgrid(ri, ti) 
    Z = vectorized(R, T) 
    return R * np.cos(T), R * np.sin(T), Z 

दुर्भाग्य से मैं बहुत अजीब परिणाम प्राप्त, इसी तरह एक और StackOverflow user who tried to use interp2d करने के लिए।

Polar result

सर्वाधिक सफलता मैं अब तक पाया है inverse squares उपयोग कर रहा है (एक्स, वाई) में जेड के मूल्य का अनुमान। लेकिन यह कार्य Z = 0 के पास ज़ेड के मानों का आकलन करने के लिए सही नहीं है।

Inverse Squares result

क्या मैं एक समारोह z = f(x, y) (एक्स, वाई, जेड) में अंक का एक सेट दिया पाने के लिए कर सकते हैं? क्या मुझे यहां कुछ याद आ रहा है ... क्या मुझे सतह पर एक मूल्य का अनुमान लगाने के लिए एक बिंदु बादल से अधिक की आवश्यकता है?

संपादित करें:

इस समारोह है कि मैं लेखन समाप्त हो गया है। फ़ंक्शन xs, ys, zs के इनपुट सरणी लेता है और का उपयोग करके x, y पर इंटरपोलेट करता है, जिसके लिए नियमित ग्रिड की आवश्यकता नहीं होती है। मुझे यकीन है कि ऐसा करने का एक शानदार तरीका है और किसी भी अपडेट की सराहना करता है, लेकिन यह काम करता है और मैं प्रदर्शन से चिंतित नहीं हूं। एक स्निपेट सहित अगर यह भविष्य में किसी की भी मदद करता है।

def interpolate(x, y, xs, ys, zs): 
    r = np.sqrt(x*x + y*y) 
    t = np.arctan2(y, x) 

    rs = np.sqrt(np.multiply(xs, xs) + np.multiply(ys, ys)) 
    ts = np.arctan2(ys, xs) 

    rs = rs.ravel() 
    ts = ts.ravel() 
    zs = zs.ravel() 

    ts = np.concatenate((ts - np.pi * 2, ts, ts + np.pi * 2)) 
    rs = np.concatenate((rs, rs, rs)) 
    zs = np.concatenate((zs, zs, zs)) 


    Z = scipy.interpolate.griddata((rs, ts), zs, (r, t)) 
    Z = Z.ravel() 
    R, T = np.meshgrid(r, t) 
    return Z 
+0

मशीन सीखने का उपयोग करें। :) – erip

+0

क्या आपने scipy.interpolate.LinearNDInterpolator की कोशिश की है? इस प्रकार की समस्याओं के लिए मेरे पास अच्छे अनुभव हैं –

उत्तर

2

आप कह रहे हैं कि आपने griddata का उपयोग करने का प्रयास किया है। तो वह क्यों काम नहीं कर रहा था? griddata भी काम करता है यदि नए अंक नियमित रूप से दूरी पर नहीं हैं।उदाहरण के लिए,

# Definitions of xs, ys and zs 
nx, ny = 20, 30 
x = np.linspace(0, np.pi, nx) 
y = np.linspace(0, 2*np.pi, ny) 

X,Y = np.meshgrid(x, y) 

xs = X.reshape((nx*ny, 1)) 
ys = Y.reshape((nx*ny, 1)) 

## Arbitrary definition of zs 
zs = np.cos(3*xs/2.)+np.sin(5*ys/3.)**2 

## new points where I want the interpolations 
points = np.random.rand(1000, 2) 

import scipy.interpolate 
zs2 = scipy.interpolate.griddata(np.hstack((xs, ys)), zs, points) 

क्या यह आपके बाद नहीं है?

+0

हां, यह काम करता है। धन्यवाद! मैं एक कार्यान्वयन चाहता था जहां मैं अंतर्निहित फ़ंक्शन कॉल (जैसे इंटरप 2 डी का रिटर्न वैल्यू) प्राप्त कर सकता हूं और एक समय में एक बिंदु में पास कर सकता हूं, लेकिन मैं हमेशा (एक्स, वाई) अंक की सरणी में पास करने के लिए अन्य कोड को दोबारा कर सकता हूं। –

1

अगर मैं अपने प्रश्न को समझते हैं, आप xs अंक, ys, zs कि द्वारा

xs = np.sin(U) * np.cos(V) 
ys = np.sin(U) * np.sin(V) 
zs = np.cos(U) 

परिभाषित कर रहे हैं तो क्या आप चाहते हैं किसी दिए गए के लिए अंतर्वेशन और एक z- मूल्य को खोजने के लिए सक्षम होने के लिए है एक्स और वाई? आपको इंटरपोलेशन की आवश्यकता क्यों है? उपरोक्त समीकरणों एक क्षेत्र का प्रतिनिधित्व करते हैं, वे xs*xs + ys*ys + zs*zs = 1 के रूप में लिखा जा सकता है, तो इस समस्या के लिए एक आसान विश्लेषणात्मक समाधान है:

def Z(X, Y): 
    return np.sqrt(1-X**2-Y**2) 
    ## or return -np.sqrt(1-X**2-Y**2) since this equation has two solutions 

जब तक कि मैं सवाल गलत समझा।

+0

आह, स्पष्टीकरण के लिए, बिंदुओं का सेट मोटे तौर पर गोलार्द्ध है, इसलिए विश्लेषणात्मक समाधान जरूरी नहीं है। मैं इसे शामिल करने के लिए अपने प्रश्न को संपादित करूंगा ... –

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