2012-12-05 8 views
7

मेरे पास कुछ कोड है जो पहले और दूसरे क्रम (iv और kv) के संशोधित बेसेल कार्यों का उपयोग करता है। कष्टप्रद रूप से वे सीमाएं प्रतीत करते हैं, वे iv (0,713) और केवी (0,697) हैं, प्रत्येक में एक जोड़ें और आपको क्रमशः अनंतता और 0 मिलते हैं। यह मेरे लिए एक समस्या है क्योंकि मुझे इससे अधिक मूल्यों का उपयोग करने की आवश्यकता है, अक्सर 2000 या उससे अधिक तक। जब मैं इन्हें विभाजित करने का प्रयास करता हूं तो मैं 0 या अनंतता से डाइविंग समाप्त करता हूं जिसका अर्थ है कि मुझे या तो त्रुटियां या शून्य मिलती हैं, जिनमें से कोई भी मैं चाहता हूं।पाइथन में बेसेल फ़ंक्शन जो बड़े एक्सपोनेंट्स के साथ काम करते हैं

मैं scipy bessel functions का उपयोग कर रहा हूं, क्या कोई बेहतर कार्य है जो बहुत छोटी और बड़ी संख्याओं का सामना कर सकता है, या इन बड़ी संख्याओं के साथ काम करने के लिए पायथन को संशोधित करने का एक तरीका है। मुझे यकीन है कि असली मुद्दा यह है कि क्यों पाइथन 700 से अधिक काम नहीं कर सकता है, क्या यह कार्य है या क्या यह पायथन है?

मुझे नहीं पता कि पाइथन पहले से ही कर रहा है लेकिन मुझे केवल पहले 5-10 अंक * 10^x की आवश्यकता होगी; यह कहना है कि मुझे सभी 1000 अंकों की आवश्यकता नहीं होगी, शायद यह समस्या है कि कैसे पाउथन इसे काम कर रहा है, वुल्फ्राम अल्फा कैसे काम कर रहा है?

+2

मुझे नहीं लगता कि इसकी एक अजगर समस्या एक डबल चल बिन्दु सीमा मुद्दे के रूप में इतना। scipy सी कोड के चारों ओर एक रैपर प्रदान कर रहा है जो वास्तव में बेसेल समारोह को लागू कर रहा है। इस प्रकार, यह सीमा तक सीमित है जो एक डबल समायोजित कर सकता है। – sizzzzlerz

+0

हाँ, मैंने अभी sys.float_info किया और अनुमान लगाया क्या? max_10_exp = 308 जो सीमा पर बेसेल फ़ंक्शन का उत्तर कम या कम है। यह मेरे लिए बहुत बुरी खबर है। वुल्फ्राम अल्फा हालांकि इसे कैसे काम करने में सक्षम है? – Rapid

+1

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

उत्तर

7

iv और kv सिसि में कार्य अधिक सटीक हैं जितना आप डबल परिशुद्धता मशीन फ़्लोटिंग पॉइंट का उपयोग करते हुए प्राप्त कर सकते हैं। जैसा ऊपर बताया गया है, आप उस सीमा में काम कर रहे हैं जहां परिणाम फ़्लोटिंग पॉइंट रेंज से बहते हैं।

आप mpmath लाइब्रेरी का उपयोग कर सकते हैं, जो इसके आसपास पाने के लिए समायोज्य सटीक (सॉफ़्टवेयर) फ़्लोटिंग पॉइंट करता है। (यह MPFR के समान है, लेकिन अजगर में):

In [1]: import mpmath 

In [2]: mpmath.besseli(0, 1714) 
mpf('2.3156788070459683e+742') 

In [3]: mpmath.besselk(0, 1714) 
mpf('1.2597398974570405e-746') 
+0

ऐसा लगता है कि सही उत्तर मिलते हैं इसलिए आपको बहुत धन्यवाद। मुझे मिला एकमात्र मुद्दा mpf सामान को मेरे शेष कोड में शामिल करने का प्रयास कर रहा है। चूंकि यह एक फ्लोट नहीं है, यह मुझे बहुत सारी त्रुटियां दे रहा है और एमपीएफ एरे स्वीकार नहीं कर रहा है? आपने मेरे प्रश्न का उत्तर दिया है, इसलिए मुझे बस एमपीएफ और एमपीपीआर आदि में उचित मात्रा में शोध करना होगा। क्या फ्लोट के रूप में 1.25 9 7-746 स्ट्रोड होने का कोई तरीका नहीं है, मेरा मतलब है कि केवल 11 चीजें हैं स्टोर करने के लिए। हममम। – Rapid

+1

आपको सबकुछ 'mpf' के रूप में रखना होगा। हालांकि, लॉगरिदम के बजाए छोटी संख्या के लॉगेरिथम के साथ काम करने का भी एक अच्छा विचार हो सकता है। यदि आपको संख्याएं जोड़ने की आवश्यकता है, तो 'logaddexp' का उपयोग करें। या, आप बड़ी और छोटी संख्याओं से छुटकारा पाने की कोशिश करने के लिए समस्या पर पुनर्विचार कर सकते हैं और कुछ गणित कर सकते हैं। –

+0

@ रैपिड: यदि आप चाहें तो दशमलव अंक और एक्सपोनेंट को अलग से स्टोर करने के लिए आप अपनी खुद की कक्षा लिख ​​सकते हैं, लेकिन क्या यह वास्तव में प्रयास के लायक है? – endolith

3

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

import numpy as np 
from scipy.special import * 

X = np.random.random(3) 

v = 2.000000000 

print "Bessel Function J" 
print jn(v,X) 

print "Modified Bessel Function, Iv" 
print ((1j**(-v))*jv(v,1j*X)).real 
print iv(v,X) 

print "Modified Bessel Function of the second kind, Kv" 
print (iv(-v,X)-iv(v,X)) * (np.pi/(2*sin(v*pi))) 
print kv(v,X) 

print "Modified spherical Bessel Function, in" 
print np.sqrt(np.pi/(2*X))*iv(v+0.5,X) 
print [sph_in(floor(v),x)[0][-1] for x in X] 

print "Modified spherical Bessel Function, kn" 
print np.sqrt(np.pi/(2*X))*kv(v+0.5,X) 
print [sph_kn(floor(v),x)[0][-1] for x in X] 

print "Modified spherical Bessel Function, in" 
print np.sqrt(np.pi/(2*X))*iv(v+0.5,X) 
print [sph_in(floor(v),x)[0][-1] for x in X] 

यह देता है:

Bessel Function J 
[ 0.01887098 0.00184202 0.08399226] 

Modified Bessel Function, Iv 
[ 0.01935808 0.00184656 0.09459852] 
[ 0.01935808 0.00184656 0.09459852] 

Modified Bessel Function of the second kind, Kv 
[ 12.61494864 135.05883902 2.40495388] 
[ 12.61494865 135.05883903 2.40495388] 

Modified spherical Bessel Function, in 
[ 0.0103056 0.00098466 0.05003335] 
[0.010305631072943869, 0.00098466280846548084, 0.050033450286650107] 

Modified spherical Bessel Function, kn 
[ 76.86738631 2622.98228411  6.99803515] 
[76.867205587011171, 2622.9730878542782, 6.998023749439338] 

Modified spherical Bessel Function, in 
[ 0.0103056 0.00098466 0.05003335] 
[0.010305631072943869, 0.00098466280846548084, 0.050033450286650107] 

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

+0

यदि वे बड़े मूल्यों के लिए भी असफल होंगे, तो यह एक उत्तर कैसे है? क्या समर्पित कार्यों की तुलना में वे अधिक सटीक हैं? – endolith

+0

@endolith क्षमा करें अगर वह अंतिम रेखा स्पष्ट नहीं है। जो मैं कह रहा हूं वह यह है कि बड़े मूल्यों को सटीक होने के लिए एक संगत रूप से बड़ी परिशुद्धता ('mpmath' में सेट) की आवश्यकता होती है। Mpmath का उपयोग करने का लाभ इस मान को सेट करने में सक्षम होने से आता है। – Hooked

1

समस्या के साथ समस्या हो सकती है। बड़े सकारात्मक एक्स के लिए, किसी भी एनयू के लिए एसिम्प्टोटिक केवी (एनयू, एक्स) ~ ई^{- x}/\ sqrt {x} है। तो बड़े एक्स के लिए आप बहुत छोटे मूल्यों के साथ खत्म हो जाते हैं। यदि आप इसके बजाय बेसेल फ़ंक्शन के लॉग के साथ काम करने में सक्षम हैं, तो समस्याएं गायब हो जाएंगी। साइलाब इस एसिम्प्टोटिक का शोषण करता है: इसमें पैरामीटर बर्फ है जो 0 पर डिफ़ॉल्ट होता है, लेकिन जब 1 पर सेट किया जाता है तो एक्स (x) * केवी (एनयू, एक्स) वापस आ जाएगा, और यह उचित आकार के सब कुछ रखता है।

वास्तव में, एक ही scipy में उपलब्ध है - scipy.special.kve

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