हाँ, वहाँ है! बशर्ते कि 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
मूल्य में बहुत करीब हैं (समतुल्य रूप या जब a
x
से परिमाण में काफी छोटा है)। उदाहरण के लिए, यदि 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
कुछ पुस्तकालयों, विशेष रूप से बढ़ावा, एक समारोह 'sqrt1pm1 की पेशकश()' सही रूप sqrt (x + 1) की गणना करने के लिए डिज़ाइन किया गया -1। यदि आप पहले से ही ऐसी लाइब्रेरी का उपयोग करते हैं तो आप 'sqrt (x + a) -sqrt (x) 'को' sqrt1pm1 (a/x) * sqrt (x) 'के रूप में एक संख्यात्मक रूप से मजबूत फैशन में लागू करने के लिए उस फ़ंक्शन का उपयोग कर सकते हैं। – njuffa
@njuffa: आह, बहुत रोचक। जबकि 'log1p' और' expm1' जैसे फ़ंक्शन आम हैं, मैंने कभी पहले 'sqrt1pm1' का सामना नहीं किया है। एक ओर, यह अनुकरण करने के लिए इतना आसान है कि इसके लिए एक अलग समारोह बनाने के लिए अजीब लगता है। दूसरी ओर, अगर मैं सी मानक पुस्तकालय में उपलब्ध था तो मुझे निश्चित रूप से इसका उपयोग करने का मौका मिलेगा। –
@ मार्क डिकिंसन कहान के रूप में दिखाया गया है, 'log1p' और' expm1' अनुकरण करने में भी आसान है। संभावित रूप से लाइब्रेरी में ऐसे कार्यों को प्रदान करने का बिंदु प्रोग्रामर को सबसे तेज़ और सबसे सटीक कार्यान्वयन प्रदान करना है जो संख्यात्मक विश्लेषण के बारे में विशेष रूप से जानकार नहीं हैं। – njuffa