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는 {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287} 근처 q에서 9 개의 재귀 이분법 후에 규정 된 정확도로 수렴하지 못했습니다. NIntegrate는 -1.249 10 ^ -16 및 4.588053980254483` ^ -13을 통해 적분 및 오류 추정치를 얻었습니다 . **
진정한 통합 가치를 얻는 방법은 무엇입니까?
답변
실제로 적분 값을 계산하는 문제를 해결하려면 $0$, Andrew Moylan 이 이전 질문에서 언급했듯이 AccuracyGoal
기본값 ( Infinity
) 보다 낮게 설정할 수 있습니다 . "적분의 실제 값이 0이면 기본값 을 충족 할 수 없습니다. 이러한 경우 유한을 설정해야합니다. ".PrecisionGoal
AccuracyGoal
expr
명확성 을 위해 적분을 정의 하면 다음은 오류를 반환하지 않습니다.
NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]
(* Out: 1.66533*10^-16 *)
또한보십시오:
- 답이 0 일 때마다 수치 적분이 너무 오래 걸립니다.
- 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*)
0 적분 값을 나타냅니다!
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
내가 말한 내용을 변경해야 할 것 같습니다.
놀랍게도 전체 오류 메시지는 걱정할 것이 없으며 수정이 필요하지 않다는 것입니다.
이것은 특히 메시지가 "실패"라는 단어로 이어질 때 저를 포함하여 오류 메시지에 대한 대부분의 사람들의 반응과 반대입니다. 요점은 오류 메시지의 다음 부분에 대해 생각하는 것입니다.
NIntegrate
획득-1.24910*^-16
및4.588053980254483*^-13
적분 및 오류 추정.
즉 NIntegrate
, 적분을 계산하여 구간에
{-4.586804880254483`*^-13, 4.589303080254483`*^-13}
이제 그 정도면 충분할까요?
아마도 당신이 (다른 이유로, 값이 무엇을 나타내야 하는지를 기반으로하여) 믿지 않는 한, 적분은 0이 아니고 10^-13
. 아마 당신은 아무것도 할 필요가 없습니다. 대답을 받아들이십시오. 반면에의 불확실성 4.6*10^-13
이 용납 될 수없는 경우 아래에 설명 된 방법 중 어느 것도이를 수정하지 않습니다. 문제를 숨길뿐입니다.
OP의 방법은 NDSolve
이 간격을 훨씬 벗어나 AccuracyGoal
약 8
.
OP의 방법은 다소 기술적 인 이유로 NIntegrate
적분 1 + integrand
및 빼기 2 Pi
에서 얻은 답 보다 낫습니다 . 기본 정밀도 목표는 about 6
입니다. 즉, 적분 값의 오류 2 Pi 10*^-6
가 4.6*10^-13
. 보다 훨씬 큽니다 . 또한이 방법의 적분 값 (마이너스 2 Pi
)은 구간 내에 있지만 OP의 적분 값보다 훨씬 큽니다.
OP의 방법은 AccuracyGoal
. 상기 설정 AccuracyGoal -> a절대 오차 미만이면 수단은 대략 것으로 10^-a
, NIntegrate
그 결과를 접수한다. 를 낮추면 AccuracyGoal
실제로 NIntegrate
더 나쁜 결과를 받아들이라고 말하는 것입니다. 이를 수행하는 좋은 이유는 @MarcoB 링크 된 답변 중 하나에 나와 있습니다. 낮은 설정 NIntegrate
은 적분이 (거의) 0 일 때 속도가 빨라집니다 . 덜 정확한 결과를 계산하는 것이 더 쉽기 때문입니다.
이러한 다른 방법에는 큰 문제가 없습니다. 소수점 이하 8 자리 이상의 정확도가 필요하지 않는 한, 여기에서는 거의 확실하지 않지만 OP의 방법보다 좋지 않습니다. 이 경우 오류 메시지는 실제로 대답이 얼마나 좋은지 나타냅니다 . 다른 경우에는 대답이 얼마나 나쁠 수 있는지 나타낼 수 있습니다.