NIntegrate :: ncvb: NIntegrate konnte nicht mit der vorgeschriebenen Genauigkeit konvergieren
Die Integration ist:
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}]
. Fehlermeldung ist
NIntegrate :: ncvb: NIntegrate konnte nach 9 rekursiven Halbierungen in q in der Nähe von {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287} nicht zur vorgeschriebenen Genauigkeit konvergieren. NIntegrate erhielt -1,249 10 ^ -16 und 4,588053980254483` ^ -13 für die Integral- und Fehlerschätzungen. **
Wie erhalte ich den tatsächlichen Integrationswert?
Antworten
Um das Problem der Berechnung des Wertes eines Integrals zu lösen, das tatsächlich ist $0$Sie können niedriger eingestellt ist AccuracyGoal
als der Standardwert ( Infinity
), wie Andrew Moylan erwähnt hier in dieser vorherigen Frage : „Wenn der wahre Wert des Integral Null ist, wird der Standard PrecisionGoal
. Kann nie zufrieden sein Sie müssen eine endliche gesetzt AccuracyGoal
in solchen Fällen ".
Wenn Ihr Integrand expr
aus Gründen der Übersichtlichkeit definiert ist , werden im Folgenden keine Fehler zurückgegeben:
NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]
(* Out: 1.66533*10^-16 *)
siehe auch:
- Die numerische Integration dauert zu lange, wenn die Antwort Null ist
- Fehler beim Konvergieren von NIntegrate mit FindRoot
- Problem mit der Integration
Auch NDSolve
als Workaround wird ausgewertet~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*)
zeigt einen Nullintegralwert an!
NIntegrate kann Probleme haben, wenn der wahre Wert des Integrals Null ist. In der Fehlermeldung wird dies als möglicher Grund für das Konvergenzproblem angegeben. Um dieses Problem zu umgehen, können Sie dem Integranden 1 hinzufügen und am Ende wie folgt 2Pi subtrahieren
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
Bearbeiten: Ich habe alle Zahlen rationalisiert und jetzt kann WorkingPrecision auf einen höheren Wert gesetzt werden:
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]
Jetzt sollte die Genauigkeit der Berechnung höher sein (15 Stellen?) Und sie wird ohne Beanstandung abgeschlossen. Der vom OP gegebene reale Wert des Integrals ist also
3.28296365*10^-16
Ich sollte wahrscheinlich ändern, was ich vorab sage:
Die vollständige Fehlermeldung besagt, vielleicht überraschend, dass es keinen Grund zur Sorge gibt und keine Korrektur erforderlich ist.
Dies ist das Gegenteil der Reaktionen der meisten Menschen auf Fehlermeldungen, einschließlich meiner, insbesondere wenn die Meldung mit dem Wort "fehlgeschlagen" führt. Der Punkt ist, über diesen Teil der Fehlermeldung nachzudenken:
NIntegrate
erhalten-1.24910*^-16
und4.588053980254483*^-13
für die Integral- und Fehlerschätzungen.
Das heißt NIntegrate
, das Integral wird so berechnet, dass es im Intervall liegt
{-4.586804880254483`*^-13, 4.589303080254483`*^-13}
Ist das eine gute Antwort?
Wahrscheinlich ist das Integral ungleich Null und kleiner als, es sei denn, Sie glauben (z. B. aus anderen Gründen, basierend auf dem, was der Wert darstellen soll) 10^-13
. Wahrscheinlich müssen Sie nichts tun; Akzeptiere einfach die Antwort. Wenn andererseits eine Unsicherheit von 4.6*10^-13
nicht akzeptabel ist, behebt keine der unten diskutierten Methoden dies; Sie verstecken nur das Problem.
Die Methode des OP ist besser als die NDSolve
Methode, die weit außerhalb dieses Intervalls liegt und ihrer AccuracyGoal
von ungefähr entspricht 8
.
Die Methode des OP ist besser als die NIntegrate
Antwort, die durch Integrieren 1 + integrand
und Subtrahieren 2 Pi
aus technischen Gründen erhalten wird: Das Standardgenauigkeitsziel ist ungefähr 6
, was bedeutet, dass der Fehler in dem Wert, durch den das Integral begrenzt 2 Pi 10*^-6
ist, viel größer ist als 4.6*10^-13
. Während der Wert des Integrals in dieser Methode (Minus 2 Pi
) innerhalb des Intervalls liegt, ist er viel größer als der Wert des Integrals des OP.
Die OP-Methode ist besser als das Absenken AccuracyGoal
. Die Einstellung AccuracyGoal -> abedeutet ungefähr, dass das Ergebnis akzeptiert wird , wenn der absolute Fehler kleiner als 10^-a
ist NIntegrate
. Durch Absenken AccuracyGoal
sagen Sie tatsächlich, NIntegrate
dass Sie ein schlechteres Ergebnis akzeptieren sollen. Ein guter Grund dafür ist in einer der Antworten @MarcoB verknüpft angegeben: Eine niedrigere Einstellung beschleunigt sich, NIntegrate
wenn das Integral (fast) Null ist, da es einfacher ist, ein weniger genaues Ergebnis zu berechnen.
An diesen anderen Methoden ist nichts sehr Falsches. Sofern Sie nicht mehr als 8 Dezimalstellen Genauigkeit benötigen, was hier mit ziemlicher Sicherheit nicht der Fall ist, sind sie in Ordnung, aber nicht besser als die OP-Methode. Die Fehlermeldung in diesem Fall zeigt tatsächlich an, wie gut die Antwort ist. In anderen Fällen kann dies darauf hinweisen, wie schlecht die Antwort sein könnte.