फ़ंक्शन प्लॉटिंग के लिए एल्गोरिदम (अनुकूली?)


21

मैं उन कार्यों के लिए मानक 2d-रेखांकन तैयार करने के लिए एल्गोरिदम की तलाश कर रहा हूं जिनमें विलक्षणता हो सकती है या नहीं हो सकती है। उद्देश्य "मिनी-कैस" लिखना है, इसलिए मुझे कार्यों के प्रकारों का कोई पूर्व ज्ञान नहीं है, उपयोगकर्ता ग्राफ़ करना चाहते हैं।

यह समस्या बहुत पुरानी है, इसलिए मुझे लगता है कि साहित्य में कुछ मानक एल्गोरिदम होने चाहिए। एक बार के लिए मेरे पास Google के माध्यम से संदर्भ खोजने के लिए बहुत कुछ नहीं था।

मुझे एक दिलचस्प एल्गोरिथ्म मिला, जिसका नाम है "YACAS - एल्गोरिथम की पुस्तक" जिसका नाम " एडेप्टिव फंक्शन प्लॉटिंग" है।

तो संक्षेप में:

  • क्या मानक एल्गोरिदम है?
  • क्या ज्ञात कठिन-से-प्लॉट कार्यों के लिए एक परीक्षण सूट है?
  • पढ़ने के लिए दिलचस्प पेपर क्या हैं?

2
शायद सवाल "ग्राफ ड्राइंग" के बजाय "फ़ंक्शन प्लॉटिंग" के साथ बेहतर समझा जाएगा? मैंने पहले (ग्राफ सिद्धांत) शीर्षक का गलत अर्थ निकाला।
एस्ट्रोजूनलू

@ Juanlu001 सुझाव के लिए धन्यवाद। मैंने शीर्षक बदल दिया।
बजकर

जब आप 2D कहते हैं, तो क्या आपका मतलब एक-चर फ़ंक्शन जैसे कि साजिश रचने से है , या क्या आप 2D में दिखाए गए दो-चर फ़ंक्शन ( ) में रुचि रखते हैं जैसे कि विभिन्न रंगों / रंगों का प्रतिनिधित्व करना विभिन्न मूल्य? f ( x , y )f(x)f(x,y)
शेजाबल्क्स

खैर, मेरा मतलब था एक चर के एक समारोह की साजिश रचने का। हालाँकि, मैं दो-चर सेटिंग में मूल्यांकन करने के लिए किन बिंदुओं को चुनने के लिए एल्गोरिदम के बारे में भी सुनना चाहूंगा। मुझे रंगों और छायांकन के बारे में सुनने में कोई दिलचस्पी नहीं है।
soegaard

2 डी कार्यों के लिए, मेरे सवाल का जवाब देख सकते हैं और यहां । मैंने जो किया वह काफी सीमित था, और वह अच्छी तरह से मनमाने कार्य के लिए काम नहीं करेगा। इसके अलावा, विवरण से गायब कुछ आवश्यक चरण हैं, जिनके बिना विधि ठीक से परिवर्तित नहीं होगी: मुझे जाल के प्रत्येक किनारे के बीच में एक नया नमूना बिंदु सम्मिलित करने की आवश्यकता थी, जो अगले रिट्रीएंगुलेशन पर गायब हो जाएगा। (contd।)
स्ज़बोल्क्स

जवाबों:


10

मैंने यहाँ GitHub पर Mathematica के अनुकूली नमूने की दिनचर्या लागू की है (यह एक एकल C फ़ाइल है, शीर्ष लेख फ़ाइल के लिए स्रोत ट्री पर जाएँ)। मुझे बहुत समय पहले मैथेमेटिका पर एक बड़ी पुस्तक में दिनचर्या का विवरण मिला था, और मैं पिछले कुछ समय से इस कार्यान्वयन पर बदलाव का उपयोग कर रहा हूं। यह मूल रूप से ब्याज के क्षेत्र में एक मोटा रैखिक नमूना करता है, फिर उच्च वक्रता वाले क्षेत्रों को परिष्कृत करने के लिए वापस जाता है। यह संभव है कि कुछ बहुत ही तीक्ष्ण सुविधाएँ छूटी हों, लेकिन व्यवहार में मुझे यह बहुत दुर्लभ लगता है। इस फ़ाइल में समानांतर संस्करण भी है।


1
कौन सी किताब है? क्या यह एक मैं जुड़ा हुआ है? क्या आप जानते हैं कि 5 और 6 संस्करणों के बीच उनके क्रियान्वयन में वास्तव में क्या बदलाव आता है?
शेजाबोल

1
@Szabolcs: नहीं, मेरा मानना ​​है कि यह इस पुस्तक खंड 4.1.3 में था। विवरण गणित के एक बहुत पुराने संस्करण पर लागू होता है। नए संस्करण (शायद v6 से शुरू हो रहे हैं) ऊर्ध्वाधर स्पर्शोन्मुखता का पता लगाते हैं और भूखंडों से उभरी हुई ऊर्ध्वाधर रेखाओं को हटाते हैं। नए संस्करण निश्चित रूप से बहुत से परिष्कृत प्रतीकात्मक पूर्वाग्रह करते हैं ताकि वे असंगतता, अपरिभाषित क्षेत्रों और शाखा में कटौती से निपट सकें।
विक्टर लियू

आप जिस प्रतीकात्मक प्रीप्रोसेसिंग के बारे में बात कर रहे हैं, उसे प्रलेखन में "बहिष्करण पहचान" कहा जाता है। इसे परिभाषित करके Exclusions -> Noneया तो अपने फ़ंक्शन की संरचना को छिपाकर या तो इसे बंद किया जा सकता है । यह वह नहीं है, जब मैं बदलावों के बारे में पूछ रहा था। मेरा मानना ​​है कि एल्गोरिथ्म में कुछ बदलाव थे, क्योंकि v5 और v6 अलग-अलग बिंदुओं पर नमूने लिए गए थे। अभी मैं v5 पर परीक्षण नहीं कर सकता, हालांकि फिर से तुलना करने के लिए। Plotf[x_?NumericQ] := ...
शेजाबल्क्स

"गणितज्ञ ग्राफिक्स गाइडबुक" में समस्या की बहुत अच्छी चर्चा थी। मुझे विशेष रूप से पसंद आया कि एल्गोरिथ्म की लघु कॉमिंग का भी वर्णन किया गया था।
soegaard

मैं अब GitHub फ़ाइल नहीं ढूँढ सकता, क्या यह स्थानांतरित हुआ?
आंद्रेई

12

यह जानकर कि अन्य कैस ऐसा कैसे करते हैं, इससे आपको मदद मिल सकती है।

मेरी जानकारी के लिए, गणितज्ञ एक-चर फ़ंक्शन या पैरामीट्रिक कर्व साजिश रचने के लिए निम्नलिखित बुनियादी एल्गोरिथ्म पर भिन्नता का उपयोग करता है (मैं मान रहा हूँ इस विवरण के लिए)।f(x)(x(t),y(t))f(x)

  1. प्लॉटिंग डोमेन पर बिंदुओं के एक नियमित रूप से स्पेस ग्रिड के साथ शुरू करें। Control गणितज्ञ में, यह नियंत्रित करने के लिए एक पैरामीटर है कि कितने को लेना है, कहा जाता है PlotPoints।)

  2. क्रमिक लाइन सेगमेंट की प्रत्येक जोड़ी को देखें (तीन क्रमिक बिंदुओं द्वारा परिभाषित, ) और एक नया डालें नमूना खंड दोनों खंडों के बीच में ( और ) यदि उनका कोण एक सीमा से बड़ा है।(x1,f(x1)),(x2,f(x2)),(x3,f(x3)) x2+x3x1+x22x2+x32

  3. यदि हम अभी तक पुनरावृति सीमा तक नहीं पहुँचे हैं ( MaxRecursionMathematica द्वारा निर्धारित ), तो चरण 2 से दोहराएँ।

इसमें से कुछ की चर्चा स्टैन वैगन की किताब मैथेमेटिका इन एक्शन में की गई है, जिसे आप यहां गूगल बुक्स पर देख सकते हैं

मैंने इस एल्गोरिथ्म को लागू करने से पहले बेहतर नियंत्रण किया कि फ़ंक्शन की गणना करने के लिए मेरे महंगी कितनी बार मूल्यांकन किया गया था। यहाँ चरण 2 के लिए गणित कोड है:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

फ़ंक्शन ग्राफ़ पर MathWorld वेब पेज में कई पेपरों के संदर्भ शामिल हैं जो अनुकूली फ़ंक्शन प्लॉटिंग पर प्रासंगिक लगते हैं। पृष्ठ का हवाला देते हुए:

ग्राफ्टिंग प्लॉटिंग के लिए अच्छी दिनचर्या अनुकूली एल्गोरिदम का उपयोग करती है जो उन क्षेत्रों में अधिक बिंदुओं की साजिश करते हैं जहां फ़ंक्शन सबसे तेजी से बदलता है (वैगन 1991, मैथ वर्क्स 1992, हेक 1993, विकम-जोन्स 1994)। ट्यूपर (1996) ने एक एल्गोरिथ्म विकसित किया है [...]

दूसरी ओर, Google पर मैंने एक कागज पर ठोकर खाई

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

यह बताता है कि डोमेन और अन्य चीजों को कैसे ठीक से चुनना है। मुझे आशा है कि वे आपके लिए उपयोगी हैं।


1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.