अधूरा गामा फ़ंक्शन का तेज़ और सटीक डबल सटीक कार्यान्वयन


10

दोहरी परिशुद्धता विशेष कार्यों को लागू करने की कला की स्थिति क्या है? मुझे निम्नलिखित इंटीग्रल चाहिए: लिए और , जो निचले अधूरे गामा फ़ंक्शन के संदर्भ में लिखा जा सकता है। यहाँ मेरा फोरट्रान और सी कार्यान्वयन है: मीटर=0,1,2,t>0

Fm(t)=01u2metu2du=γ(m+12,t)2tm+12
m=0,1,2,...t>0

https://gist.github.com/3764427

जो श्रृंखला विस्तार का उपयोग करता है, दिए गए सटीकता तक की शर्तों को बताता है, और फिर कम लिए मूल्यों को कुशलता से प्राप्त करने के लिए पुनरावर्तन संबंधों का उपयोग करता है । मैंने इसे अच्छी तरह से परखा है और मुझे उन सभी मापदंडों के लिए 1e-15 सटीकता प्राप्त है जिनकी मुझे आवश्यकता है, विवरण के लिए फोरट्रान संस्करण की टिप्पणियाँ देखें।m

क्या इसे लागू करने का एक बेहतर तरीका है? यहाँ गफ़रन में एक गामा समारोह कार्यान्वयन है:

https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781

यह कुछ अनंत श्रृंखला को समेटने के बजाय तर्कसंगत फ़ंक्शन सन्निकटन का उपयोग कर रहा है जो मैं कर रहा हूं। मुझे लगता है कि यह एक बेहतर दृष्टिकोण है, क्योंकि एक समान सटीकता प्राप्त करनी चाहिए। क्या इन चीजों को प्राप्त करने के लिए कुछ विहित तरीका है, या प्रत्येक विशेष फ़ंक्शन के लिए एक विशेष एल्गोरिथ्म का पता लगाना है?

अपडेट 1 :

टिप्पणियों के आधार पर, यहाँ SLATEC का उपयोग करके कार्यान्वयन है:

https://gist.github.com/3767621

यह 1e-15 सटीकता के स्तर पर मोटे तौर पर मेरे स्वयं के फ़ंक्शन से मानों को पुन: पेश करता है। हालाँकि, मैंने एक समस्या देखी कि t = 1e-6 और m = 50 के लिए, शब्द 1e-303 के बराबर हो जाता है और उच्च "m" के लिए यह बस गलत उत्तर देना शुरू कर देता है। मेरे फ़ंक्शन में यह समस्या नहीं है, क्योंकि मैं लिए सीधे श्रृंखला विस्तार / पुनरावृत्ति संबंधों का उपयोग करता । यहाँ एक सही मूल्य का एक उदाहरण दिया गया है: एफएमtm+12Fm

F100(1e-6)=4.97511945200351715E-003 ,

लेकिन मैं SLATEC का उपयोग करके इसे प्राप्त नहीं कर सकता क्योंकि भाजक ऊपर उड़ता है। जैसा कि आप देख सकते हैं, का वास्तविक मूल्य अच्छा और छोटा है।Fm

अपडेट 2 :

उपरोक्त समस्या से बचने के लिए, कोई फ़ंक्शन dgamit(Tricomi का अधूरा गामा फ़ंक्शन) का उपयोग कर सकता है , फिर F(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2, इसलिए साथ कोई समस्या नहीं है, लेकिन दुर्भाग्य से लिए चल रहा है । हालांकि यह मेरे उद्देश्यों के लिए पर्याप्त उच्च हो सकता है।मीटर 172 मीटरtgamma(m+0.5_dp)m172m


2
क्यों अपने स्वयं के समारोह कोड? GSL, cephes, और SLATEC सभी इसे लागू करते हैं।
ज्यॉफ ऑक्सीबेरी

मैंने सवाल अपडेट किया है कि मैं SLATEC का उपयोग क्यों नहीं करता हूं।
ओडिन्ज íertík

@ Ond appejČertík आप एक बग की खोज की है! अपने प्रश्न को उकेरा!
अली

अली --- यह SLATEC में एक बग नहीं है, लेकिन वास्तव में, विभाजित करने के लिए कि मैं वास्तव में जरूरत है द्वारा क्रम में के लिए एक मूल्य प्राप्त करने के लिए । तो संख्यात्मक विधि जो लिए काम करती है, लिए इतनी अच्छी तरह से काम नहीं कर सकती है । γ(z,x)tm+12Fm(t)γ(z,x)Fm(t)
ओंडेजे íertík

@ Ond sorryejČertík ठीक है, क्षमा करें, मेरी गलती है, मैंने अपनी टिप्पणी करने से पहले आपके कोड की जांच नहीं की।
अली

जवाबों:


9

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

आम तौर पर छोटे और बड़े तर्कों के लिए अलग-अलग अंदाजों का उपयोग करना फायदेमंद होता है, जहां "बड़े" और "छोटे" के बीच इष्टतम स्विच-ओवर प्रयोगात्मक रूप से निर्धारित किया जाता है, और सामान्य रूप से का एक कार्य है । मेरे कोड के लिए, मैंने "छोटे" तर्कों को उन संतोषजनक स्थिति के रूप में परिभाषित किया है, जो कि ।mam+112

बड़े तर्कों के लिए, मैं गणना करता हूं

Fm(a)=12γ(m+12,a)×p×p,  p=a12(m+12)

ऑपरेशनों का यह क्रम समय से पहले आने से बचा जाता है। जैसा कि हमें पूरी तरह से सामान्य कम अधूरा गामा फ़ंक्शन के बजाय आधे-अधूरे आदेशों के केवल कम अधूरे गामा फ़ंक्शन की आवश्यकता है, यह एक प्रदर्शन परिप्रेक्ष्य से गणना करने के लिए फायदेमंद है

γ(m+12,a)=Γ(m+12)Γ(m+12,a)

की सारणीबद्ध मानों का उपयोग और कंप्यूटिंग के अनुसार इस जवाब है, जबकि ध्यान से इस मुद्दे से परहेज एक जुड़े हुए बहु-जोड़ ऑपरेशन के उपयोग के माध्यम से घटाव रद्द करना। एक संभावित आगे अनुकूलन यह देखने के लिए है कि पर्याप्त रूप से बड़े , के भीतर एक दिया फ़्लोटिंग पॉइंट सटीक।Γ(m+12)Γ(m+12,a)aγ(m+12,a)=Γ(m+12)

छोटे तर्कों के लिए, मैंने निम्न अपूर्ण गामा फ़ंक्शन के लिए श्रृंखला विस्तार के साथ शुरुआत की

ए। एर्दली, डब्ल्यू। मैग्नस, एफ। ओबेरथिंगर, और एफजी ट्रिकोमी, "हायर ट्रांससेडेंटल फंक्शंस, वॉल्यूम 2"। न्यूयॉर्क, एनवाई: मैकग्रा-हिल 1953

और लड़कों के फंक्शन गणना करने के लिए इसे निम्नानुसार संशोधित किया (जब श्रृंखला किसी दिए गए परिशुद्धता के लिए पर्याप्त रूप से छोटी हो तो श्रृंखला को छोटा करना):Fm(a)

Fm(a)=121m+12exp(a)(1+n=1an(1+m+12)× ... ×(n+m+12))

बॉयज़ फ़ंक्शन के कम आदेशों के लिए दिलचस्प और संभावित रूप से महत्वपूर्ण विशेष मामले भी हैं, विशेष रूप से । सबसे पहले, हमारे पास , जहां फोरट्रान 2008 मौलिक समारोह के रूप में में प्रदान की त्रुटि समारोह है मानक पुस्तकालय कार्यों के रूप में ++ और C / C और ।m=0,1,2,3F0(a)=π4aerf(a)erfERFerferff

तेजी से अभिकलन के लिए जब , मैं छोटे तर्कों के लिए कस्टम मिनिमेक्स बहुपद सन्निकटन का उपयोग करता हूं, तो , और आगे पुनरावर्तन , बड़े लोगों के लिए , जहां उत्तरार्द्ध में घटाव रद्द करने के साथ मुद्दों को जुड़े हुए बहु-जोड़ आपरेशनों के उपयोग से कम किया जाता है।m=1,2,3a<212Fm(a)=12a((2m1)Fm1(a)exp(a))

कहाँ समारोह मूल्यों के लिए गणना की जा करने के लिए है एक दिया में एक साथ कई आदेश , एक के उच्चतम मूल्य के लिए समारोह मूल्य की गणना करने चाहेगा जैसा कि ऊपर चर्चा सीधे, यानी, तो संख्यानुसार स्थिर पिछड़े प्रत्यावर्तन का उपयोग को संगणित करने के लिए अन्य सभी फ़ंक्शन मान।ammFm1=12m1(2a Fm(a)+exp(a))


महान उत्तर के लिए @njuffa धन्यवाद। यदि आप इस खुले स्रोत के लिए अपना कोड बनाते हैं, तो मुझे लगता है कि यह बहुत से लोगों के लिए बहुत उपयोगी होगा।
ओन्दोज íertík

1
वर्तमान में, वर्णित एल्गोरिथ्म का एक CUDA कार्यान्वयन NVIDIA की डेवलपर वेबसाइट से मुफ्त डाउनलोड के लिए उपलब्ध है (एक CUDA डेवलपर के रूप में मुफ्त पंजीकरण की आवश्यकता है, आमतौर पर एक व्यावसायिक दिन के भीतर अनुमोदन)। कोड बीएसडी लाइसेंस के तहत है, जो किसी भी तरह की परियोजना के बारे में संगत होना चाहिए।
njuffa


4

मैं अब्रामोविक्ज़ और स्टेगुन की किताब या नए संशोधन में एक नज़र डालूंगा, जिसे एनआईएसटी ने कुछ साल पहले प्रकाशित किया था और जो ऑनलाइन उपलब्ध है, मुझे विश्वास है। वे चीजों को एक स्थिर तरीके से लागू करने के तरीकों पर भी चर्चा करते हैं।


मैं इसे इस्तेमाल कर रहा था: dlmf.nist.gov/8 , जब इसे लागू कर रहे थे, लेकिन यह शायद एक और संसाधन है। न्यूमेरिकल रेसिपीज के चैप्टर 5 में भी रोचक जानकारी है, लेकिन यह केवल एक वेरिएबल के फंक्शन्स पर लागू होती है।
ओडिन्ज kertík

मुझे नहीं लगता कि आपको उनके 2001 के संदर्भ की तुलना में बहुत अधिक हाल ही में कुछ मिलेगा; SLATEC इससे पुरानी होगी।
जियोफ ऑक्सीबेरी

1

यह अत्याधुनिक नहीं लगता है लेकिन नेटलिब में SLATEC "1400 सामान्य उद्देश्य गणितीय और सांख्यिकीय दिनचर्या प्रदान करता है।" अधूरा गामा यहाँ विशेष कार्यों के तहत उपलब्ध है

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

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