2015-09-07 8 views
5

क्या पूर्ण पैरामीटर रेंज x, a> = 0 के लिए निम्न अभिव्यक्ति का मूल्यांकन करने का संख्यात्मक स्थिरता का एक शानदार तरीका है?एसक्यूआरटी (एक्स + ए) के क्रमिक रूप से स्थिर मूल्यांकन - वर्ग (x)

f(x,a) = sqrt(x+a) - sqrt(x) 

इसके अलावा किसी भी प्रोग्रामिंग भाषा या पुस्तकालय है कि समारोह के इस प्रकार प्रदान करता है? यदि हां, किस नाम से? मुझे अभी उपरोक्त अभिव्यक्ति का उपयोग करके कोई विशिष्ट समस्या नहीं है, लेकिन अतीत में इसे कई बार सामना करना पड़ा और हमेशा सोचा कि यह समस्या पहले हल होनी चाहिए!

+2

कुछ पुस्तकालयों, विशेष रूप से बढ़ावा, एक समारोह 'sqrt1pm1 की पेशकश()' सही रूप sqrt (x + 1) की गणना करने के लिए डिज़ाइन किया गया -1। यदि आप पहले से ही ऐसी लाइब्रेरी का उपयोग करते हैं तो आप 'sqrt (x + a) -sqrt (x) 'को' sqrt1pm1 (a/x) * sqrt (x) 'के रूप में एक संख्यात्मक रूप से मजबूत फैशन में लागू करने के लिए उस फ़ंक्शन का उपयोग कर सकते हैं। – njuffa

+0

@njuffa: आह, बहुत रोचक। जबकि 'log1p' और' expm1' जैसे फ़ंक्शन आम हैं, मैंने कभी पहले 'sqrt1pm1' का सामना नहीं किया है। एक ओर, यह अनुकरण करने के लिए इतना आसान है कि इसके लिए एक अलग समारोह बनाने के लिए अजीब लगता है। दूसरी ओर, अगर मैं सी मानक पुस्तकालय में उपलब्ध था तो मुझे निश्चित रूप से इसका उपयोग करने का मौका मिलेगा। –

+0

@ मार्क डिकिंसन कहान के रूप में दिखाया गया है, 'log1p' और' expm1' अनुकरण करने में भी आसान है। संभावित रूप से लाइब्रेरी में ऐसे कार्यों को प्रदान करने का बिंदु प्रोग्रामर को सबसे तेज़ और सबसे सटीक कार्यान्वयन प्रदान करना है जो संख्यात्मक विश्लेषण के बारे में विशेष रूप से जानकार नहीं हैं। – njuffa

उत्तर

10

हाँ, वहाँ है! बशर्ते कि x कम से कम एक और a सकारात्मक है, तो आप उपयोग कर सकते हैं:

f(x, a) = a/(sqrt(x + a) + sqrt(x)) 

जो पूरी तरह से संख्यानुसार स्थिर है, लेकिन शायद ही अपने आप में एक पुस्तकालय समारोह के लायक है। बेशक, जब x = a = 0, परिणाम 0 होना चाहिए।

स्पष्टीकरण: sqrt(x + a) - sqrt(x)(sqrt(x + a) - sqrt(x)) * (sqrt(x + a) + sqrt(x))/(sqrt(x + a) + sqrt(x)) के बराबर है। अब sqrt(x+a)^2 - sqrt(x)^2 प्राप्त करने के लिए पहले दो शब्दों को गुणा करें, जो a को सरल बनाता है।

यहाँ एक उदाहरण स्थिरता का प्रदर्शन है: मूल अभिव्यक्ति के लिए परेशानी का मामला है जहां x + a और x मूल्य में बहुत करीब हैं (समतुल्य रूप या जब ax से परिमाण में काफी छोटा है)। उदाहरण के लिए, यदि x = 1 और a छोटा है, हम 1 के चारों ओर एक टेलर विस्तार कि sqrt(1 + a)1 + a/2 - a^2/8 + O(a^3) होना चाहिए से जानते हैं, इसलिए sqrt(1 + a) - sqrt(1)a/2 - a^2/8 के पास होना चाहिए। आइए इसे छोटे a की विशेष पसंद के लिए आज़माएं। यहाँ मूल कार्य है (पायथन में लिखा, इस मामले में, लेकिन आप स्यूडोकोड के रूप में यह इलाज कर सकते हैं):

def f(x, a): 
    return sqrt(x + a) - sqrt(x) 

और यहाँ स्थिर संस्करण है:

def g(x, a): 
    if a == 0: 
     return 0.0 
    else: 
     return a/((sqrt(x + a) + sqrt(x)) 

अब देखते हैं कि हम क्या x = 1 साथ मिलता है और a = 2e-10:

>>> a = 2e-10 
>>> f(1, a) 
1.000000082740371e-10 
>>> g(1, a) 
9.999999999500001e-11 

मूल्य हम मिल गया है चाहिए (मशीन सटीकता तक) है: a/2 - a^2/8 - इस विशेष a के लिए , आईईईई 754 डबल-प्रेसिजन फ्लोट के संदर्भ में क्यूबिक और उच्च ऑर्डर शब्द महत्वहीन हैं, जो केवल परिशुद्धता के लगभग 16 दशमलव अंक प्रदान करते हैं। के तुलना के लिए कि मूल्य की गणना करते हैं:

>>> a/2 - a**2/8 
9.999999999500001e-11 
+1

यह वही है जो मैं ढूंढ रहा था। हालांकि यह x = a = 0 के लिए काम नहीं करता है, यह मूल से काफी बेहतर है। –

+0

आह, अच्छा बिंदु। हां, लाइब्रेरी-गुणवत्ता फ़ंक्शन के लिए, आप विशेष-केस 'x = a = 0' चाहते हैं। –

+0

मैंने 'a = 0' के लिए एक विशेष मामले में संपादित किया है। सुधारों के लिए धन्यवाद! –

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