NIntegrate :: ncvb: NIntegrate no pudo converger a la precisión prescrita

Dec 14 2020

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

6 MarcoB Dec 14 2020 at 23:17

Para resolver el problema de calcular el valor de una integral que en realidad es $0$, puede establecer un valor más bajo AccuracyGoalque el predeterminado ( Infinity), como Andrew Moylan mencionó en esta pregunta anterior aquí : "Cuando el valor verdadero de la integral es cero, el valor predeterminado PrecisionGoalnunca se puede satisfacer. Debe establecer un valor finito AccuracyGoalen tales casos ".

Con su integrando definido exprpara 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
4 UlrichNeumann Dec 14 2020 at 14:30

También NDSolvecomo 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!

3 Andreas Dec 14 2020 at 22:33

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
2 MichaelE2 Dec 15 2020 at 00:09

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:

NIntegrateobtenida -1.24910*^-16y 4.588053980254483*^-13para las estimaciones integrales y de error.

Eso significa que NIntegratecalculó 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^-13es 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 NDSolvemétodo, que se encuentra muy fuera de este intervalo y corresponde a su AccuracyGoalde aproximadamente 8.

El método del OP es mejor que la NIntegraterespuesta obtenida integrando 1 + integrandy restando 2 Pipor 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, NIntegrateaceptará el resultado. Al bajar AccuracyGoal, en realidad le está diciendo NIntegrateque 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 NIntegratecuando 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.