NIntegrate :: ncvb: NIntegrate no pudo converger a la precisión prescrita
La integración es:
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}]
. El mensaje de error es
NIntegrate :: ncvb: NIntegrate no pudo converger a la precisión prescrita después de 9 bisecciones recursivas en q cerca de {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287}. NIntegrate obtuvo -1.249 10 ^ -16 y 4.588053980254483` ^ -13 para las estimaciones de integral y error. **
¿Cómo obtener el valor real de integración?
Respuestas
Para resolver el problema de calcular el valor de una integral que en realidad es $0$, puede establecer un valor más bajo AccuracyGoal
que el predeterminado ( Infinity
), como Andrew Moylan mencionó en esta pregunta anterior aquí : "Cuando el valor verdadero de la integral es cero, el valor predeterminado PrecisionGoal
nunca se puede satisfacer. Debe establecer un valor finito AccuracyGoal
en tales casos ".
Con su integrando definido expr
para mayor claridad, lo siguiente no devuelve errores:
NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]
(* Out: 1.66533*10^-16 *)
ver también:
- La integración numérica está tardando demasiado cuando la respuesta es cero
- Error al converger NIintegrate con FindRoot
- Problema con la integración
También NDSolve
como solución alternativa se evalúa a~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*)
indica un valor integral cero!
NIntegrate puede tener problemas si el verdadero valor de la integral es cero. El mensaje de error cita esto como posible motivo del problema de convergencia. Como solución alternativa, puede agregar 1 al integrando y restar 2Pi al final como
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
Editar: racionalicé todos los números y ahora WorkingPrecision se puede establecer en un valor más alto:
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]
Ahora la precisión del cálculo debería ser mayor (¿15 dígitos?) Y se completa sin quejas. Entonces, el valor real de la integral dado por el OP es
3.28296365*10^-16
Probablemente debería cambiar lo que digo desde el principio:
El mensaje de error completo, quizás sorprendentemente, dice que no hay nada de qué preocuparse y que no se necesita una solución.
Esto es lo opuesto a las reacciones de la mayoría de las personas a los mensajes de error, incluida la mía, especialmente cuando el mensaje lleva la palabra "falló". El punto es pensar en esta parte del mensaje de error:
NIntegrate
obtenida-1.24910*^-16
y4.588053980254483*^-13
para las estimaciones integrales y de error.
Eso significa que NIntegrate
calculó la integral para estar en el intervalo
{-4.586804880254483`*^-13, 4.589303080254483`*^-13}
Ahora, ¿ es esa una respuesta suficientemente buena?
Probablemente, lo es, a menos que crea (por otras razones, por ejemplo, basado en lo que se supone que representa el valor) que la integral es distinta de cero y menor que 10^-13
. Probablemente no necesite hacer nada; solo acepta la respuesta. Por otro lado, si una incertidumbre de 4.6*10^-13
es inaceptable, entonces ninguno de los métodos discutidos a continuación corrige eso; simplemente esconden el problema.
El método del OP es mejor que el NDSolve
método, que se encuentra muy fuera de este intervalo y corresponde a su AccuracyGoal
de aproximadamente 8
.
El método del OP es mejor que la NIntegrate
respuesta obtenida integrando 1 + integrand
y restando 2 Pi
por razones un tanto técnicas: el objetivo de precisión predeterminado es aproximadamente 6
, lo que significa que el error en el valor por el que está acotada la integral 2 Pi 10*^-6
, que es mucho mayor que 4.6*10^-13
. Además, aunque el valor de la integral en este método (menos 2 Pi
) se encuentra dentro del intervalo, es mucho mayor que el valor de la integral de OP.
El método del OP es mejor que bajar AccuracyGoal
. La configuración AccuracyGoal -> asignifica aproximadamente que si el error absoluto es menor que 10^-a
, NIntegrate
aceptará el resultado. Al bajar AccuracyGoal
, en realidad le está diciendo NIntegrate
que acepte un resultado peor. Una buena razón para hacer esto se da en una de las respuestas @MarcoB vinculado: una configuración más baja se acelera NIntegrate
cuando la integral es (casi) cero, porque es más fácil calcular un resultado menos preciso.
No hay nada de malo en estos otros métodos. A menos que necesite más de 8 lugares decimales de precisión, lo que casi con certeza no es el caso aquí, están bien pero no son mejores que el método del OP. El mensaje de error en este caso, de hecho, indica qué tan buena es la respuesta. En otros casos, podría indicar qué tan mala podría ser la respuesta.