NIntegrate :: ncvb: NIntegrate gagal menyatu ke akurasi yang ditentukan

Dec 14 2020

Integrasinya adalah:

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}]

. Pesan kesalahan adalah

NIntegrate :: ncvb: NIntegrate gagal menyatu ke akurasi yang ditentukan setelah 9 pembagian rekursif di q dekat {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287}. NIntegrate diperoleh -1.249 10 ^ -16 dan 4.588053980254483` ^ -13 untuk estimasi integral dan error. **

Bagaimana cara mendapatkan nilai integrasi yang sebenarnya?

Jawaban

6 MarcoB Dec 14 2020 at 23:17

Untuk memecahkan masalah menghitung nilai integral yang sebenarnya $0$, Anda dapat menyetel lebih rendah AccuracyGoaldari nilai default ( Infinity), seperti yang disebutkan Andrew Moylan dalam pertanyaan sebelumnya di sini : "Ketika nilai sebenarnya dari integral adalah nol, default PrecisionGoaltidak akan pernah terpenuhi. Anda perlu menyetel terbatas AccuracyGoaldalam kasus seperti itu ".

Dengan integrand Anda yang ditentukan expruntuk kejelasan, berikut ini tidak mengembalikan kesalahan:

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

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

Lihat juga:

  • Integrasi numerik memakan waktu terlalu lama jika jawabannya nol
  • Kesalahan untuk menggabungkan NIntegrate dengan FindRoot
  • Masalah dengan Integrasi
4 UlrichNeumann Dec 14 2020 at 14:30

Juga NDSolvesebagai solusi untuk mengevaluasi~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*)

menunjukkan nilai integral nol!

3 Andreas Dec 14 2020 at 22:33

NIntegrate mungkin mengalami masalah jika nilai sebenarnya dari integral adalah nol. Pesan kesalahan mengutip ini sebagai kemungkinan alasan untuk masalah konvergensi. Sebagai solusinya, Anda bisa menambahkan 1 ke integrand dan mengurangi 2Pi pada akhirnya seperti

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

Sunting: Saya merasionalisasi semua angka dan sekarang WorkingPrecision dapat disetel ke nilai yang lebih tinggi:

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]

Sekarang ketepatan penghitungan harus lebih tinggi (15 digit?) Dan selesai tanpa keluhan. Jadi nilai integral yang diberikan oleh OP adalah

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

Saya mungkin harus mengubah apa yang saya katakan di depan:

Pesan kesalahan lengkap, mungkin mengejutkan, mengatakan tidak ada yang perlu dikhawatirkan, dan tidak ada perbaikan yang diperlukan.

Ini adalah kebalikan dari reaksi kebanyakan orang terhadap pesan kesalahan, termasuk saya, terutama ketika pesan tersebut mengarah dengan kata "gagal". Intinya adalah memikirkan tentang bagian pesan kesalahan ini:

NIntegratediperoleh -1.24910*^-16dan 4.588053980254483*^-13untuk estimasi integral dan kesalahan.

Itu berarti NIntegratemenghitung integral menjadi dalam interval

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

Nah, apakah itu jawaban yang cukup bagus?

Mungkin, kecuali Anda percaya (untuk alasan lain, katakanlah, berdasarkan apa yang seharusnya diwakili oleh nilai) bahwa integralnya bukan nol dan lebih kecil dari 10^-13. Mungkin Anda tidak perlu melakukan apa pun; terima saja jawabannya. Di sisi lain, jika ketidakpastian 4.6*10^-13tidak dapat diterima, maka tidak ada metode yang dibahas di bawah ini yang memperbaikinya; mereka hanya menyembunyikan masalahnya.

Metode OP lebih baik daripada NDSolvemetode, yang terletak jauh di luar interval ini dan sesuai dengan AccuracyGoalsekitar 8.

Metode OP lebih baik daripada NIntegratejawaban yang diperoleh dengan mengintegrasikan 1 + integranddan mengurangi 2 Pikarena alasan yang agak teknis: Tujuan presisi default adalah tentang 6, yang berarti bahwa kesalahan dalam nilai yang dibatasi oleh integral 2 Pi 10*^-6, yang jauh lebih besar dari 4.6*10^-13. Selanjutnya, sementara nilai integral dalam metode ini (minus 2 Pi) terletak di dalam interval, itu jauh lebih besar daripada nilai integral OP.

Metode OP lebih baik daripada menurunkan AccuracyGoal. Pengaturannya AccuracyGoal -> aberarti secara kasar bahwa jika kesalahan absolut lebih kecil dari 10^-a, NIntegrateakan menerima hasilnya. Dengan menurunkan AccuracyGoal, Anda sebenarnya menyuruh NIntegrateuntuk menerima hasil yang lebih buruk. Alasan bagus untuk melakukan ini diberikan di salah satu jawaban yang ditautkan @MarcoB: Pengaturan yang lebih rendah dipercepat NIntegrateketika integralnya (hampir) nol, karena lebih mudah untuk menghitung hasil yang kurang akurat.

Tidak ada yang salah dalam metode lain ini. Kecuali Anda membutuhkan lebih dari 8 tempat ketelitian desimal, yang hampir pasti tidak terjadi di sini, mereka baik-baik saja tetapi tidak lebih baik dari metode OP. Pesan kesalahan dalam kasus ini sebenarnya menunjukkan seberapa bagus jawabannya. Dalam kasus lain, ini mungkin menunjukkan seberapa buruk jawabannya.