NIntegrate :: ncvb: NIntegrate gagal menyatu ke akurasi yang ditentukan
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
Untuk memecahkan masalah menghitung nilai integral yang sebenarnya $0$, Anda dapat menyetel lebih rendah AccuracyGoal
dari nilai default ( Infinity
), seperti yang disebutkan Andrew Moylan dalam pertanyaan sebelumnya di sini : "Ketika nilai sebenarnya dari integral adalah nol, default PrecisionGoal
tidak akan pernah terpenuhi. Anda perlu menyetel terbatas AccuracyGoal
dalam kasus seperti itu ".
Dengan integrand Anda yang ditentukan expr
untuk 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
Juga NDSolve
sebagai 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!
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
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:
NIntegrate
diperoleh-1.24910*^-16
dan4.588053980254483*^-13
untuk estimasi integral dan kesalahan.
Itu berarti NIntegrate
menghitung 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^-13
tidak dapat diterima, maka tidak ada metode yang dibahas di bawah ini yang memperbaikinya; mereka hanya menyembunyikan masalahnya.
Metode OP lebih baik daripada NDSolve
metode, yang terletak jauh di luar interval ini dan sesuai dengan AccuracyGoal
sekitar 8
.
Metode OP lebih baik daripada NIntegrate
jawaban yang diperoleh dengan mengintegrasikan 1 + integrand
dan mengurangi 2 Pi
karena 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
, NIntegrate
akan menerima hasilnya. Dengan menurunkan AccuracyGoal
, Anda sebenarnya menyuruh NIntegrate
untuk menerima hasil yang lebih buruk. Alasan bagus untuk melakukan ini diberikan di salah satu jawaban yang ditautkan @MarcoB: Pengaturan yang lebih rendah dipercepat NIntegrate
ketika 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.