2012-03-11 15 views
8

मान लीजिए कि मैं z- अक्षपट्टी सतह प्रक्षेप

f(x1,y1) = 10 
f(x2,y2) = 12 
f(x3,y3) = 5 
f(x4,y4) = 2 
... 
f(xn,yn) = 21 

अब मैं च (एक्स, वाई) अनुमान लगाने के लिए सक्षम होना चाहते हैं पर एक सतह को परिभाषित अंक के एन संख्या चला रहे हैं। मैं एक रैखिक और विशेष रूप से एक स्पलीन अनुमान के लिए एक एल्गोरिदम की तलाश में हूं। एक उदाहरण एल्गोरिदम या कम से कम कुछ पॉइंटर्स बहुत अच्छे होंगे।

+0

[विकिपीडिया] [1] आलेख थोड़ा मुश्किल है लेकिन कम से कम उदाहरण अनुभाग को देखने का प्रयास करें। [1]: http://en.wikipedia.org/wiki/Spline_interpolation –

+1

क्या आप नियमित ग्रिड पर एक्स, वाई नियंत्रण बिंदु हैं? –

+0

फॉर्म एफ (एक्स, वाई) के कार्यों के लिए, अंतर्निहित डेटा (डिग्री के बहुपद, एन गॉसियन, आदि के योग) के रूप में एक धारणा बनाने के लिए और अधिक आम है और फिर कम से कम वर्गों के गुणांक निर्धारित करते हैं। क्या वह यहाँ काम करेगा? क्या आप डेटा के प्रतिनिधित्व के बारे में कुछ भी जानते हैं? यदि आप वास्तव में एक स्पलीन चाहते हैं, तो NURBS http://en.wikipedia.org/wiki/NURBS एक नज़र के लायक हैं। उनके पास प्रतिपादन के लिए अच्छी गुण हैं।जब तक वे नियमित ग्रिड पर न हों तब तक आधार प्राप्त करने के लिए (x, y) बिंदुओं के डेलाउने त्रिभुज का निर्माण करें। विमान फिटिंग के लिए, आप एक मानक कम से कम वर्ग फिट करना चाहते हैं। – Gene

उत्तर

1

आप अपने अंक का उपयोग बेजियर (या बीस्पलाइन) सतह के नियंत्रण बिंदुओं के रूप में कर सकते हैं, खासकर यदि (xi, yi)XY विमान में एक आयत का नमूना लें। इस संबंध में, इसमें कोई फिटिंग शामिल नहीं है।

जो सतह आपको मिलेगी वह आपके बिंदुओं के उत्तल ढक्कन में होगी, और {xi, yi} की सीमा पर बिंदुओं को अंतर (इंटरपोलेट) करेगा।

आप प्रयोग करना चाहते हैं तो, This forums postingMatlab में सरल कोड को रोकने के लिए लगता है, और (यह कार्यक्रम के फ़ाइल स्वरूप पता लगाना की आवश्यकता है, हालांकि) आप GuIRIT उपयोग कर सकते हैं भी ऐसा ही करने के लिए अगर आप Matlab की जरूरत नहीं है ।

+0

अंतिम कार्यान्वयन रूबी में होना होगा - इसलिए मैटलैब वास्तव में एक विकल्प नहीं है। लेकिन समस्या वास्तव में एक्सवाई विमान में एक आयताकार के बारे में है। – tcurdt

+0

मैंने रूबी का कभी भी उपयोग नहीं किया, लेकिन मुझे यकीन है कि इसके लिए बेजियर/बीस्पलाइन पैकेज है। – user1071136

4

यह रैखिक अनुमान बनाने के लिए एक दृष्टिकोण का एक अस्पष्ट वर्णन है।

  1. निर्धारित अपने अंकों की Voronoi diagram
  2. प्राप्त करने के लिए इस की दोहरी ले लो (विमान में प्रत्येक बिंदु निकटतम (x_i,y_i) लगता है) Delaunay triangulation: कनेक्ट (x_i,y_i) और (x_j,y_j) अगर वहाँ अंक की एक रेखा खंड है ताकि (x_i,y_i) और (x_j,y_j) समतुल्य (और किसी भी अन्य जोड़ी से करीब) हैं।
  3. प्रत्येक त्रिकोण पर, तीन शीर्षकों के माध्यम से विमान खोजें। यह आपको आवश्यक रैखिक इंटरपोलेशन है।

निम्नलिखित पायथन में पहले दो चरणों लागू करता है। आपके ग्रिड की नियमितता आपको चीजों को गति देने की अनुमति दे सकती है (यह त्रिभुज को भी गड़बड़ कर सकती है)।

import itertools 

""" Based on http://stackoverflow.com/a/1165943/2336725 """ 
def is_ccw(tri): 
    return ((tri[1][0]-tri[0][0])*(tri[1][1]+tri[0][1]) 
      + (tri[2][0]-tri[1][0])*(tri[2][1]+tri[1][1]) 
      + (tri[0][0]-tri[2][0])*(tri[0][1]+tri[2][1])) < 0 

def circumcircle_contains_point(triangle,point): 
    import numpy as np 
    matrix = np.array([ [p[0],p[1],p[0]**2+p[1]**2,1] for p in triangle+point ]) 
    return is_ccw(triangle) == (np.linalg.det(matrix) > 0) 

triangulation = set() 
""" 
A triangle is in the Delaunay triangulation if and only if its circumscribing 
circle contains no other point. This implementation is O(n^4). Faster methods 
are at http://en.wikipedia.org/wiki/Delaunay_triangulation 
""" 
for triangle in itertools.combinations(points,3): 
    triangle_empty = True 
    for point in points: 
     if point in triangle: 
      next 
     if circumcircle_contains_point(triangle,point): 
      triangle_empty = False 
      break 
    if triangle_empty: 
     triangulation.add(triangle) 
2

अनियमित 2 डी डेटा पर इंटरपोलेशन इतना आसान नहीं है। मैं अनियमित 2 डी के लिए कोई वास्तविक स्पलीन सामान्यीकरण के बारे में नहीं जानता।

ट्राईऐन्ग्युलेशंस-आधारित दृष्टिकोण के अलावा, आप बार्न्स (http://en.wikipedia.org/wiki/Barnes_interpolation) और उलटा दूरी भार (http://en.wikipedia.org/wiki/Inverse_distance_weighting), या अधिक आम तौर पर, RBF (http://en.wikipedia.org/wiki/Radial_basis_functions) पर एक नज़र हो सकता है।

यदि आपका बिंदु दृढ़ता से गैर-समान रूप से फैलता है (घने क्लस्टर), तो कार्यों के आकार को अनुकूली बनाने के लिए आवश्यक हो सकता है, या इंटरपोलेशन के बजाय सन्निकटन का सहारा लेना आवश्यक हो सकता है।

+0

वास्तव में वे बहुत ज्यादा फैल नहीं रहे हैं। सबसे खराब मामला मैं शायद एक रैखिक इंटरपोलेशन के साथ भी रह सकता हूं लेकिन एक चिकनी सतह पसंद करूंगा। – tcurdt

+0

अनुमान एक दिलचस्प कोण की तरह लगता है। रेडियल आधार कार्यों के लिए – tcurdt

+0

+1। मैंने कुछ साल पहले एक पेपर लिखा था जिसमें इन वस्तुओं के साथ कई गुना पर काम करने के लिए सामान्यीकृत किया गया था। जब तक आपके पास घने क्लस्टर नहीं होते हैं तब तक वे बहुत अच्छा काम करते हैं और अंक संख्याओं की संख्या बहुत बड़ी नहीं होती है। (यदि एन बड़ा हो जाता है, तो आप चाहते हैं कि आपका आरबीएफ कॉम्पैक्ट सपोर्ट करे ताकि मैट्रिक्स शामिल हो। लेकिन फिर आपको स्पैस रैखिक बीजगणित का उपयोग इसे स्वीकार्य रूप से स्केल करने के लिए करना होगा।) अच्छा, चिकनी इंटरपोलेशन। –

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