2012-05-17 28 views
5

क्या बूस्ट के एआरएफ-फ़ंक्शन के पीछे एल्गोरिदम के लिए कोई विवरण उपलब्ध है? मॉड्यूल का दस्तावेज बहुत सटीक नहीं है। मुझे पता चला कि कई विधियां मिश्रित हैं। मेरे लिए यह अब्रामोविट्ज़ और स्टीगुन की विविधता की तरह दिखता है।बूस्ट का एल्गोरिदम :: गणित :: erf

  • कौन सी विधियों को मिश्रित किया जाता है?
  • विधियों को कैसे मिश्रित किया जाता है?
  • एआरएफ-फ़ंक्शन (निरंतर समय) की जटिलता क्या है?

सेबस्टियन

उत्तर

4

Boost Math Toolkit के लिये दस्तावेज references की एक लंबी सूची है, जो Abramowitz और Stegun के बीच में। erf-function इंटरफ़ेस में policy टेम्पलेट पैरामीटर शामिल है जिसका उपयोग संख्यात्मक परिशुद्धता (और इसलिए इसकी रन-टाइम जटिलता) को नियंत्रित करने के लिए किया जा सकता है।

#include <boost/math/special_functions/erf.hpp> 
namespace boost{ namespace math{ 

template <class T> 
calculated-result-type erf(T z); 

template <class T, class Policy> 
calculated-result-type erf(T z, const Policy&); 

template <class T> 
calculated-result-type erfc(T z); 

template <class T, class Policy> 
calculated-result-type erfc(T z, const Policy&); 

}} // namespaces 

अद्यतन:

कार्यान्वयन

के सभी संस्करणों:

ERF-समारोह के लिए पहले प्रदान की गई संदर्भ की धारा "कार्यान्वयन" की एक प्रतिलिपि शब्दशः नीचे

इन कार्यों में पहले अपने तर्क सकारात्मक बनाने के लिए सामान्य प्रतिबिंब सूत्रों का उपयोग करते हैं:

erf(-z) = 1 - erf(z); 

erfc(-z) = 2 - erfc(z); // preferred when -z < -0.5 

erfc(-z) = 1 + erf(z); // preferred when -0.5 <= -z < 0 

इन कार्यों के सामान्य संस्करण अपूर्ण गामा फ़ंक्शन के संदर्भ में लागू किए गए हैं।

जब महत्व (मंटिसा) आकार पहचाना जाता है (वर्तमान में 53, 64 और 113-बिट वास्तविकताओं के लिए, प्लस सिंगल-प्रेसिजन 24-बिट को दोहराए जाने के माध्यम से संभाला जाता है) तो जेएम द्वारा तैयार तर्कसंगत अनुमानों की एक श्रृंखला का उपयोग किया जाता है।

z < = 0.5 तो ERF के लिए एक तर्कसंगत सन्निकटन प्रयोग किया जाता है के लिए

, अवलोकन है कि ERF एक अजीब समारोह है और इसलिए ERF का उपयोग कर गणना की जाती है के आधार पर:

erf(z) = z * (C + R(z*z)); 

जहां तर्कसंगत सन्निकटन आर (जेड * जेड) पूर्ण त्रुटि के लिए अनुकूलित किया गया है: जब तक इसकी पूर्ण त्रुटि निरंतर सी की तुलना में काफी छोटी है, तब आर (z * z) की गणना के दौरान किए गए किसी भी राउंड-ऑफ़ त्रुटि को परिणामस्वरूप प्रभावी रूप से गायब हो जाएगा। नतीजतन इस क्षेत्र में एआरएफ और एआरएफसी के लिए त्रुटि बहुत कम है: अंतिम बिट केवल कुछ ही मामलों में गलत है।

z> 0.5 के लिए हम देख सकते हैं कि एक छोटे से अंतराल [क, ख) तो खत्म हो गया:

erfc(z) * exp(z*z) * z ~ c 
कुछ निरंतर ग के लिए

इसलिए के लिए z> 0.5 हम प्रयोग कर erfc गणना:

erfc(z) = exp(-z*z) * (C + R(z - B))/z; 

फिर आर (जेड - बी) निरपेक्ष त्रुटि के लिए अनुकूलित है, और निरंतर सी erfc (z) * exp की औसत है (z * जेड) * जेड सीमा के अंतराल पर लिया गया।एक बार फिर, जब तक आर (जेड - बी) में पूर्ण त्रुटि सी की तुलना में छोटी है तो सी + आर (जेड-बी) सही ढंग से गोल किया जाएगा, और परिणाम में त्रुटि केवल एक्सपी की सटीकता पर निर्भर करेगी समारोह। व्यावहारिक रूप से, सभी मामलों में बहुत कम संख्या में, त्रुटि परिणाम के आखिरी बिट तक ही सीमित है। निरंतर बी चुना जाता है तो यह है कि तर्कसंगत सन्निकटन की सीमा के बाएं हाथ अंत एक सीमा [एक, + ∞] ऊपर सन्निकटन करने के लिए संशोधित किया गया है से अधिक 0.

बड़े z के लिए है:

erfc(z) = exp(-z*z) * (C + R(1/z))/z; 

तर्कसंगत अनुमान excruciating detail में समझाया गया है। अगर आपको अधिक जानकारी चाहिए, तो आप हमेशा source code देख सकते हैं।

+0

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

+0

@Euphoriewelle मैंने बूस्ट मैनुअल के कार्यान्वयन अनुभाग की एक प्रति के साथ अपना जवाब अपडेट किया। मुझे लगता है कि इसे कार्यान्वयन के मुद्दों के बारे में आपके अधिकांश सवालों का जवाब देना चाहिए। अधिक जानकारी के लिए, मुझे डर है कि स्रोत वास्तव में अंतिम गाइड है। – TemplateRex

+0

आपके अपडेट के लिए धन्यवाद! अधिकांश उपयोगकर्ताओं के लिए आपका उत्तर पर्याप्त होना चाहिए। मुझे लगता है कि मेरे पास कोई अन्य विकल्प नहीं है और मामूली विवरण के लिए कोड पढ़ने जा रहे हैं। – Euphoriewelle