NIntegrate :: ncvb: NIntegrate निर्धारित सटीकता में परिवर्तित होने में विफल रहा

Dec 14 2020

एकीकरण है:

NIntegrate[-0.17116940940118283` + 1/(
  9.736942322213501` + 7.789553857770802` Cos[q]) + (
  0.02866566930866079` (0.5` + 1.` Cos[q]) Sin[
    q] (-3.0095696738628313` Sqrt[1.25` + 1.` Cos[q]]
       Cos[0.` + ArcTan[(0.5` Sin[q])/(-1 - 0.5` Cos[q])]] + 
     1.` Sin[q]))/(
  0.9772727272727273` + 1.` Cos[q] - 0.045454545454545456` Cos[2 q] - 
   0.09090909090909091` Cos[3 q]) + ((0.35586923225834494` + 
     0.5931153870972414` Cos[q] + 0.11862307741944829` Cos[2 q]) Sin[
    0.` + ArcTan[(0.5` Sin[q])/(-1 - 0.5` Cos[q])]])/((1.75` + 
     1.` Cos[q] - 0.5` Cos[2 q])^(3/2) Sqrt[
   1 - (1.` Sin[q]^2)/(
    1.75` + 1.` Cos[q] - 0.5000000000000001` Cos[2 q])]), {q, -Pi, 
  Pi}]

। त्रुटि संदेश है

NIntegrate :: ncvb: NIntegrate 9 में पुनरावर्ती द्विभाजन के बाद {सटीकता} {{-1.1415925408997200878589214505087874555555959151515888815615380287287} के पास निर्धारित सटीकता में परिवर्तित करने में विफल रहा। अभिन्न और त्रुटि अनुमानों के लिए NIntegrate ने -1.249 10 ^ -16 और 4.588053980254483` ^ -13 प्राप्त किया । **

वास्तविक एकीकरण मूल्य कैसे प्राप्त करें?

जवाब

6 MarcoB Dec 14 2020 at 23:17

वास्तव में एक अभिन्न के मूल्य की गणना करने की समस्या को हल करने के लिए $0$, आप AccuracyGoalडिफ़ॉल्ट मूल्य ( Infinity) से कम सेट कर सकते हैं , जैसा कि एंड्रयू मॉयलन ने यहां पिछले प्रश्न में उल्लेख किया है : "जब अभिन्न का वास्तविक मूल्य शून्य है, तो डिफ़ॉल्ट PrecisionGoalकभी संतुष्ट नहीं हो सकता है। आपको AccuracyGoalऐसे मामलों में एक परिमित सेट करने की आवश्यकता है। ”।

exprस्पष्टता के रूप में परिभाषित आपके अभिन्न अंग के साथ , निम्नलिखित में कोई त्रुटि नहीं है:

NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]

(* Out: 1.66533*10^-16 *)

यह सभी देखें:

  • जब भी उत्तर शून्य हो, संख्यात्मक एकीकरण में बहुत समय लग रहा है
  • NIntegrate को FindRoot के साथ कनवर्ट करने में त्रुटि
  • एकीकरण के साथ समस्या
4 UlrichNeumann Dec 14 2020 at 14:30

NDSolveवर्कअराउंड मूल्यांकन के रूप में भी~0

expr = -0.17116940940118283` +1/(9.736942322213501` +7.789553857770802` Cos[q]) + (0.02866566930866079` (0.5` + 1.` Cos[q]) Sin[q] (-3.0095696738628313` Sqrt[1.25` + 1.` Cos[q]] Cos[0.` + ArcTan[(0.5` Sin[q])/(-1 - 0.5` Cos[q])]] +1.` Sin[q]))/(0.9772727272727273` + 1.` Cos[q] -0.045454545454545456` Cos[2 q] -0.09090909090909091` Cos[3 q]) + ((0.35586923225834494` +0.5931153870972414` Cos[q] +0.11862307741944829` Cos[2 q]) Sin[0.` + ArcTan[(0.5` Sin[q])/(-1 - 0.5` Cos[q])]])/((1.75` +1.` Cos[q] - 0.5` Cos[2 q])^(3/2) Sqrt[1 - (1.` Sin[q]^2)/(1.75` + 1.` Cos[q] -0.5000000000000001` Cos[2 q])]) 
// Rationalize;

NDSolveValue[{int'[q] == expr, int[-Pi] == 0}, int[Pi], {q, -Pi, Pi},AccuracyGoal -> 15]
(*-3.79922*10^-8*)

एक शून्य अभिन्न मूल्य को इंगित करता है!

3 Andreas Dec 14 2020 at 22:33

यदि एकीकृत का वास्तविक मूल्य शून्य है, तो NIntegrate को समस्या हो सकती है। त्रुटि संदेश इस अभिसरण समस्या के संभावित कारण के रूप में उद्धृत करता है। वर्कअराउंड के रूप में आप 1 को एकीकृत में जोड़ सकते हैं और 2Pi को अंत में घटा सकते हैं जैसे

NIntegrate[-0.17116940940118283 + 
1/(9.736942322213501 + 7.789553857770802*Cos[q]) + 
   (0.02866566930866079*(0.5 + 1.*Cos[q])*
  Sin[q]*(-3.0095696738628313*Sqrt[1.25 + 1.*Cos[q]]*
     Cos[0. + ArcTan[(0.5*Sin[q])/(-1 - 0.5*Cos[q])]] + 
           1.*Sin[q]))/(0.9772727272727273 + 1.*Cos[q] - 
  0.045454545454545456*Cos[2*q] - 
  0.09090909090909091*Cos[3*q]) + 
   ((0.35586923225834494 + 0.5931153870972414*Cos[q] + 
    0.11862307741944829*Cos[2*q])*
  Sin[0. + ArcTan[(0.5*Sin[q])/(-1 - 0.5*Cos[q])]])/
     ((1.75 + 1.*Cos[q] - 0.5*Cos[2*q])^(3/2)*
  Sqrt[1 - (1.*Sin[q]^2)/(1.75 + 1.*Cos[q] - 
       0.5000000000000001*Cos[2*q])]) + 1, {q, -Pi, Pi}] - 2*Pi

संपादित करें: मैंने सभी नंबरों को युक्तिसंगत बनाया और अब कार्यप्रणाली को अधिक मूल्य पर सेट किया जा सकता है:

NIntegrate[-(17116940940118283/100000000000000000) + 
 1/(9736942322213501/
  1000000000000000 + (7789553857770802/1000000000000000)*Cos[q]) + 
 ((2866566930866079/100000000000000000)*(1/2 + Cos[q])*Sin[q]*
      ((-(30095696738628313/10000000000000000))*Sqrt[5/4 + Cos[q]]*
           Cos[ArcTan[((1/2)*Sin[q])/(-1 - (1/2)*Cos[q])]] + 
   Sin[q]))/
   (43/44 + Cos[q] - (1/22)*Cos[2*q] - (1/11)*Cos[3*q]) + 
 ((35586923225834494/
    100000000000000000 + (5931153870972414/10000000000000000)*
           Cos[q] + (11862307741944829/100000000000000000)*
    Cos[2*q])*
      Sin[ArcTan[((1/2)*Sin[q])/(-1 - (1/2)*Cos[q])]])/
   ((7/4 + Cos[q] - (1/2)*Cos[2*q])^(3/2)*
   Sqrt[1 - Sin[q]^2/(7/4 + Cos[q] - (1/2)*Cos[2*q])]), {q, -Pi, Pi}, 
WorkingPrecision -> 30]

अब गणना की सटीकता अधिक होनी चाहिए (15 अंक?) और यह शिकायत के बिना पूरा होता है। तो ओपी द्वारा दिए गए अभिन्न का वास्तविक मूल्य है

3.28296365*10^-16
2 MichaelE2 Dec 15 2020 at 00:09

मुझे शायद वही बदलना चाहिए जो मैं सामने कहता हूं:

पूर्ण त्रुटि संदेश, शायद आश्चर्यजनक रूप से कह रहा है कि चिंता करने की कोई बात नहीं है, और किसी भी फिक्स की आवश्यकता नहीं है।

यह त्रुटि संदेशों के अधिकांश लोगों की प्रतिक्रियाओं के विपरीत है, जिसमें मेरा भी शामिल है, खासकर जब संदेश "विफल" शब्द के साथ होता है। बिंदु त्रुटि संदेश के इस भाग के बारे में सोचना है:

NIntegrateप्राप्त -1.24910*^-16और 4.588053980254483*^-13अभिन्न और त्रुटि अनुमानों के लिए।

इसका मतलब NIntegrateहै कि अभिन्न की गणना अंतराल में होनी चाहिए

{-4.586804880254483`*^-13, 4.589303080254483`*^-13} 

अब, यह एक अच्छा पर्याप्त जवाब है?

शायद, यह है, जब तक आप विश्वास नहीं करते हैं (अन्य कारणों के लिए, कहते हैं, इस आधार पर कि मूल्य का प्रतिनिधित्व करने के लिए क्या माना जाता है) कि अभिन्न गैर-शून्य और से छोटा है 10^-13। संभवतः आपको कुछ भी करने की आवश्यकता नहीं है; बस जवाब स्वीकार करो। दूसरी ओर, यदि कोई अनिश्चितता 4.6*10^-13अस्वीकार्य है, तो नीचे दिए गए तरीकों में से कोई भी तय नहीं है; वे सिर्फ समस्या को छिपाते हैं।

ओपी की विधि विधि से बेहतर है NDSolve, जो इस अंतराल के बाहर अच्छी तरह से निहित है और इसके AccuracyGoalबारे में है 8

ओपी की विधि कुछ तकनीकी कारणों NIntegrateसे समेकित 1 + integrandऔर घटाकर प्राप्त उत्तर से बेहतर है 2 Pi: डिफ़ॉल्ट सटीक लक्ष्य के बारे में है 6, जिसका अर्थ है कि अभिन्न के मूल्य में त्रुटि से घिरा हुआ है 2 Pi 10*^-6, जो इससे कहीं अधिक है 4.6*10^-13। इसके अलावा, जबकि इस पद्धति (ऋण 2 Pi) में अभिन्न का मूल्य अंतराल के अंदर है, यह ओपी के अभिन्न के मूल्य से बहुत बड़ा है।

ओपी की विधि कम करने से बेहतर है AccuracyGoal। सेटिंग का AccuracyGoal -> aअर्थ मोटे तौर पर यह है कि यदि पूर्ण त्रुटि से कम है 10^-a, NIntegrateतो परिणाम को स्वीकार करेगा। कम करके AccuracyGoal, आप वास्तव में NIntegrateएक बुरा परिणाम स्वीकार करने के लिए कह रहे हैं । ऐसा करने का एक अच्छा कारण @MarcoB से जुड़े उत्तरों में से एक में दिया गया है: NIntegrateअभिन्न (लगभग) शून्य होने पर एक कम सेटिंग गति देती है, क्योंकि कम सटीक परिणाम की गणना करना आसान है।

इन अन्य तरीकों में बहुत गलत नहीं है। जब तक आपको सटीकता के 8 से अधिक दशमलव स्थानों की आवश्यकता नहीं होती है, जो लगभग निश्चित रूप से यहां नहीं है, वे ठीक हैं, लेकिन ओपी की विधि से बेहतर नहीं है। वास्तव में इस मामले में त्रुटि संदेश इंगित करता है कि उत्तर कितना अच्छा है। अन्य मामलों में, यह इंगित कर सकता है कि उत्तर कितना बुरा हो सकता है।