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는 {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287} 근처 q에서 9 개의 재귀 이분법 후에 규정 된 정확도로 수렴하지 못했습니다. NIntegrate는 -1.249 10 ^ -16 및 4.588053980254483` ^ -13을 통해 적분 및 오류 추정치를 얻었습니다 . **

진정한 통합 가치를 얻는 방법은 무엇입니까?

답변

6 MarcoB Dec 14 2020 at 23:17

실제로 적분 값을 계산하는 문제를 해결하려면 $0$, Andrew Moylan 이 이전 질문에서 언급했듯이 AccuracyGoal기본값 ( Infinity) 보다 낮게 설정할 수 있습니다 . "적분의 실제 값이 0이면 기본값 을 충족 할 수 없습니다. 이러한 경우 유한을 설정해야합니다. ".PrecisionGoalAccuracyGoal

expr명확성 을 위해 적분을 정의 하면 다음은 오류를 반환하지 않습니다.

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

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

또한보십시오:

  • 답이 0 일 때마다 수치 적분이 너무 오래 걸립니다.
  • 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*)

0 적분 값을 나타냅니다!

3 Andreas Dec 14 2020 at 22:33

NIntegrate는 적분의 실제 값이 0이면 문제가있을 수 있습니다. 오류 메시지는 수렴 문제의 가능한 이유를 인용합니다. 해결 방법으로 적분에 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

편집 : 모든 숫자를 합리화했으며 이제 WorkingPrecision을 더 높은 값으로 설정할 수 있습니다.

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 자리?) 불만없이 완료됩니다. 따라서 OP에 의해 주어진 적분의 실제 값은 다음과 같습니다.

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

내가 말한 내용을 변경해야 할 것 같습니다.

놀랍게도 전체 오류 메시지는 걱정할 것이 없으며 수정이 필요하지 않다는 것입니다.

이것은 특히 메시지가 "실패"라는 단어로 이어질 때 저를 포함하여 오류 메시지에 대한 대부분의 사람들의 반응과 반대입니다. 요점은 오류 메시지의 다음 부분에 대해 생각하는 것입니다.

NIntegrate획득 -1.24910*^-164.588053980254483*^-13적분 및 오류 추정.

NIntegrate, 적분을 계산하여 구간에

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

이제 그 정도면 충분할까요?

아마도 당신이 (다른 이유로, 값이 무엇을 나타내야 하는지를 기반으로하여) 믿지 않는 한, 적분은 0이 아니고 10^-13. 아마 당신은 아무것도 할 필요가 없습니다. 대답을 받아들이십시오. 반면에의 불확실성 4.6*10^-13이 용납 될 수없는 경우 아래에 설명 된 방법 중 어느 것도이를 수정하지 않습니다. 문제를 숨길뿐입니다.

OP의 방법은 NDSolve이 간격을 훨씬 벗어나 AccuracyGoal8.

OP의 방법은 다소 기술적 인 이유로 NIntegrate적분 1 + integrand및 빼기 2 Pi에서 얻은 답 보다 낫습니다 . 기본 정밀도 목표는 about 6입니다. 즉, 적분 값의 오류 2 Pi 10*^-64.6*10^-13. 보다 훨씬 큽니다 . 또한이 방법의 적분 값 (마이너스 2 Pi)은 구간 내에 있지만 OP의 적분 값보다 훨씬 큽니다.

OP의 방법은 AccuracyGoal. 상기 설정 AccuracyGoal -> a절대 오차 미만이면 수단은 대략 것으로 10^-a, NIntegrate그 결과를 접수한다. 를 낮추면 AccuracyGoal실제로 NIntegrate더 나쁜 결과를 받아들이라고 말하는 것입니다. 이를 수행하는 좋은 이유는 @MarcoB 링크 된 답변 중 하나에 나와 있습니다. 낮은 설정 NIntegrate은 적분이 (거의) 0 일 때 속도가 빨라집니다 . 덜 정확한 결과를 계산하는 것이 더 쉽기 때문입니다.

이러한 다른 방법에는 큰 문제가 없습니다. 소수점 이하 8 자리 이상의 정확도가 필요하지 않는 한, 여기에서는 거의 확실하지 않지만 OP의 방법보다 좋지 않습니다. 이 경우 오류 메시지는 실제로 대답이 얼마나 좋은지 나타냅니다 . 다른 경우에는 대답이 얼마나 나쁠 수 있는지 나타낼 수 있습니다.