NIntegrate :: ncvb: NIntegrate निर्धारित सटीकता में परिवर्तित होने में विफल रहा
एकीकरण है:
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 प्राप्त किया । **
वास्तविक एकीकरण मूल्य कैसे प्राप्त करें?
जवाब
वास्तव में एक अभिन्न के मूल्य की गणना करने की समस्या को हल करने के लिए $0$, आप AccuracyGoal
डिफ़ॉल्ट मूल्य ( Infinity
) से कम सेट कर सकते हैं , जैसा कि एंड्रयू मॉयलन ने यहां पिछले प्रश्न में उल्लेख किया है : "जब अभिन्न का वास्तविक मूल्य शून्य है, तो डिफ़ॉल्ट PrecisionGoal
कभी संतुष्ट नहीं हो सकता है। आपको AccuracyGoal
ऐसे मामलों में एक परिमित सेट करने की आवश्यकता है। ”।
expr
स्पष्टता के रूप में परिभाषित आपके अभिन्न अंग के साथ , निम्नलिखित में कोई त्रुटि नहीं है:
NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]
(* Out: 1.66533*10^-16 *)
यह सभी देखें:
- जब भी उत्तर शून्य हो, संख्यात्मक एकीकरण में बहुत समय लग रहा है
- NIntegrate को FindRoot के साथ कनवर्ट करने में त्रुटि
- एकीकरण के साथ समस्या
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*)
एक शून्य अभिन्न मूल्य को इंगित करता है!
यदि एकीकृत का वास्तविक मूल्य शून्य है, तो 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
मुझे शायद वही बदलना चाहिए जो मैं सामने कहता हूं:
पूर्ण त्रुटि संदेश, शायद आश्चर्यजनक रूप से कह रहा है कि चिंता करने की कोई बात नहीं है, और किसी भी फिक्स की आवश्यकता नहीं है।
यह त्रुटि संदेशों के अधिकांश लोगों की प्रतिक्रियाओं के विपरीत है, जिसमें मेरा भी शामिल है, खासकर जब संदेश "विफल" शब्द के साथ होता है। बिंदु त्रुटि संदेश के इस भाग के बारे में सोचना है:
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 से अधिक दशमलव स्थानों की आवश्यकता नहीं होती है, जो लगभग निश्चित रूप से यहां नहीं है, वे ठीक हैं, लेकिन ओपी की विधि से बेहतर नहीं है। वास्तव में इस मामले में त्रुटि संदेश इंगित करता है कि उत्तर कितना अच्छा है। अन्य मामलों में, यह इंगित कर सकता है कि उत्तर कितना बुरा हो सकता है।