2011-04-08 14 views
11

में वेक्टर-मूल्यवान ब्लैक-बॉक्स फ़ंक्शंस शैली के लिए प्लॉट को बताएं मान लीजिए कि मैं एक ब्लैक-बॉक्स फ़ंक्शंस लिखता हूं, जो एक महंगे जटिल मूल्यवान फ़ंक्शन को संख्यात्मक रूप से मूल्यांकन करता है, और फिर वास्तविक और काल्पनिक भाग देता है।गणित

fun[x_?InexactNumberQ] := Module[{f = Sin[x]}, {Re[f], Im[f]}] 

तो मैं यह हमेशा की तरह प्लॉट में उपयोग कर सकते हैं, लेकिन प्लॉट को नहीं पहचानता समारोह एक जोड़ी देता है कि, और रंग दोनों घटता ही रंग। कोई गणित को कैसे बताता है कि निर्दिष्ट फ़ंक्शन हमेशा एक निश्चित लंबाई का वेक्टर देता है? या यह कैसे एक साजिश शैली है?

screen-shot of plot with both curves being the same color

संपादित करें: को देखते हुए प्रयास समस्या का उत्तर देने का प्रयास किया, मुझे लगता है कि डबल reevalution परहेज केवल तभी संभव है स्टाइल प्राप्त ग्राफिक्स की एक पोस्ट-प्रोसेसिंग के रूप में किया जाता है। सबसे अधिक संभावना निम्नलिखित मजबूत नहीं है, लेकिन यह मेरे उदाहरण के लिए काम करने के लिए लगता है:

gr = Plot[fun[x + I], {x, -1, 1}, ImageSize -> 250]; 
k = 1; 
{gr, gr /. {el_Line :> {ColorData[1][k++], el}}} 

two images, one with styling applied

+0

मुझे नहीं लगता कि ऐसा करने के लिए कोई दस्तावेज तरीका है। –

+1

मैंने 'ट्रेस [प्लॉट [{पाप ​​[एक्स], कॉस [x]}, {x, -1, 1}], ट्रेस इंटर्न -> ट्रू] चलाने का प्रयास किया, यह पता लगाने के लिए कि एमएमए लाइनों और असाइन की संख्या निर्धारित करती है रंग/शैलियों - लेकिन यह कुछ भी स्पष्ट नहीं किया। शायद किसी और को आउटपुट समझने में बेहतर भाग्य होगा। – Simon

उत्तर

7

एक संभावना यह है:

Plot[{#[[1]], #[[2]]}, {x, -1, 1}, PlotStyle -> {{Red}, {Blue}}] &@ fun[x + I] 

enter image description here

संपादित

यदि आपके फ़ंक्शन वास्तव में चिकनी नहीं हैं (यानी। लगभग रैखिक!), दोहरी मूल्यांकन प्रक्रिया को रोकने के लिए आप इतना कुछ नहीं कर सकते हैं, क्योंकि यह प्लॉट [] जाल अन्वेषण एल्गोरिदम की प्रकृति के कारण भी होगा (तरह)।

उदाहरण के लिए:

fun[x_?InexactNumberQ] := Module[{f = Sin[3 x]}, {Re[f], Im[f]}]; 
Plot[{#[[1]], #[[2]]}, {x, -1, 1}, Mesh -> All, 
    PlotStyle -> {{Red}, {Blue}}] &@fun[x + I] 

enter image description here

+0

यदि कोई मज़ा के अंदर बोता है, और साजिश के चारों ओर रीप लपेटता है, तो यह देखा जाता है कि x के कुछ मान के लिए फ़ंक्शन का मूल्यांकन दो बार किया जाता है। मुझे समझ में नहीं आता क्यों, यद्यपि। मज़ेदार [x_? InexactNumberQ]: = मॉड्यूल [{f = sin [x]}, बो [x]; {रे [एफ], आईएम [एफ]}] फिर (रीप [प्लॉट [{# [[1]], # [[2]]}, {x, -1, 1}, प्लॉट स्टाइल - > {{लाल}, {ब्लू}}] और @ मज़े [x + I]] [[- 1, 1]] // टैली) [[सभी, 2]] // टैली {{2, 78}, {1, 1 9 7}}, इसलिए बचत के लिए एक कमरा है। – Sasha

+0

@ साशा हाँ। मैंने आपके "महंगे फ़ंक्शन" कथन को याद किया। आप ज्ञापन का उपयोग कर सकते हैं, हालांकि –

+1

यह कुछ reevals से बचने के लिए प्रतीत होता है। हालांकि, जब तक आप वैश्विक चर को स्थानीयकृत करने की परेशानी नहीं करते हैं, तब तक बहुत प्यारा। मज़ा [x_? InexactNumberQ]: = मॉड्यूल [{एफ = पाप [x]}, बो [x]; टैगलॉन्ग = आईएम [एफ]; पुन [एफ]] जी [x_]: = टैगलॉन्ग अंक = रीप [ प्लॉट [{# [[1]], जी [# [[2]]]}, {x, -1, 1}, प्लॉट स्टाइल -> {{लाल}, {ब्लू}}] और @ {मजेदार [एक्स + आई], टैगलॉन्ग}] [[2, 1]]; –

0

यदि आपका वास्तविक आवेदन के लिए संभव है, एक तरह से सिर्फ सांख्यिक के अलावा प्रतीकात्मक इनपुट लेने के लिए fun अनुमति देने के लिए है, और फिर Plot के अंदर यह Evaluate:

fun2[x_] := Module[{f = Sin[x]}, {Re[f], Im[f]}] 

Plot[Evaluate[fun2[x + I]], {x, -1, 1}] 

enter image description here

यह वही प्रभाव पड़ता है के रूप में यदि आप के बजाय का मूल्यांकन किया था:

Plot[{-Im[Sinh[1 - I x]], Re[Sinh[1 - I x]]}, {x, -1, 1}] 
+0

कारण मैं यह नहीं कर सकता, यह है कि वास्तविक कार्य संख्यात्मक एकीकरण द्वारा परिभाषित किया गया है और इसमें कोई बंद फॉर्म नहीं है। – Sasha

+1

हां, क्षमा करें, मैं आपके प्रश्न को पूरी तरह से पढ़ने में विफल रहा। –

3

मैं वहाँ इस के लिए एक अच्छा समाधान अपने कार्य की गणना करने के महंगा है अगर नहीं लगता। प्लॉट केवल यह स्वीकार करेगा कि यदि आप इसे तर्क के रूप में कार्यों की एक स्पष्ट सूची देते हैं, तो आप कई वक्रों को स्टाइल कर सकते हैं, या आप इसे एक ऐसा फ़ंक्शन देते हैं जो मूल्यों की सूची में मूल्यांकन कर सकता है।

कारण आप शायद ऐसा नहीं करना चाहते हैं जो @belisarius ने सुझाव दिया है कि यह फ़ंक्शन को दो बार (धीमी गति से दो बार) गणना करेगा।

हालांकि, आप इस से बचने के लिए ज्ञापन का उपयोग कर सकते हैं (यानी एफ [x_]: = f [x] = ... निर्माण), और उसके समाधान के साथ जाएं। लेकिन यदि आप वास्तविक मूल्यवान कार्यों के साथ काम करते हैं तो यह आपकी याददाश्त को तेज़ी से भर सकता है।इसे रोकने के लिए आप स्मृति को भरने से बचने के लिए केवल सीमित संख्या में मूल्यों को कैशिंग करने के बारे में लिखना चाहते हैं: http://szhorvat.net/pelican/memoization-in-mathematica.html

+1

वास्तविक और कल्पनात्मक भागों में "दिलचस्प अंक" नहीं होने पर कैशिंग अधिक उपयोगी होगी। प्लॉट प्रत्येक भाग के लिए उन बिंदुओं का पता लगाने की कोशिश करेगा। मैं अपना जवाब अपडेट करूंगा। –