NIntegrate :: ncvb: NIntegrate, öngörülen doğruluğa yaklaşamadı
Entegrasyon şu şekildedir:
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}]
. Hata mesajı
NIntegrate :: ncvb: NIntegrate, q'da {q} = {-3.14159254089972008785892145083358745552559732061581598827615380287} yakınındaki 9 özyinelemeli ikiye bölmeden sonra öngörülen doğruluğa yakınlaşamadı. NIntegrate , integral ve hata tahminleri için -1.249 10 ^ -16 ve 4.588053980254483` ^ -13 elde edildi . **
Gerçek entegrasyon değeri nasıl elde edilir?
Yanıtlar
Gerçekte olan bir integralin değerini hesaplama problemini çözmek için $0$Andrew Moylan'ın bu önceki soruda bahsettiği gibi AccuracyGoal
, varsayılan değerden ( Infinity
) daha düşük bir değer belirleyebilirsiniz : "İntegralin gerçek değeri sıfır olduğunda, varsayılan asla karşılanamaz. Bu gibi durumlarda bir sonlu ayarlamanız gerekir ".PrecisionGoal
AccuracyGoal
İntegrandınız expr
açıklık amacıyla tanımlandığında , aşağıdaki hata vermez:
NIntegrate[expr, {q, -Pi, Pi}, AccuracyGoal -> 10]
(* Out: 1.66533*10^-16 *)
Ayrıca bakınız:
- Cevap sıfır olduğunda sayısal entegrasyon çok uzun sürüyor
- FindRoot ile NIntegrate'i yakınsama hatası
- Entegrasyonla İlgili Sorun
Ayrıca NDSolve
bir geçici çözüm olarak değerlendirilir~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*)
sıfır integral değerini gösterir!
NIntegrate, integralin gerçek değeri sıfırsa sorun yaşayabilir. Hata mesajı, yakınsama sorununun olası nedeni olarak bunu aktarır. Bir çözüm olarak, integrale 1 ekleyebilir ve sonunda 2Pi'yi çıkartabilirsiniz.
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
Düzenleme: Tüm sayıları rasyonelleştirdim ve şimdi WorkingPrecision daha yüksek bir değere ayarlanabilir:
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]
Şimdi hesaplamanın kesinliği daha yüksek olmalıdır (15 hane?) Ve şikayet edilmeden tamamlanır. Dolayısıyla, OP tarafından verilen integralin gerçek değeri
3.28296365*10^-16
Önceden söylediklerimi muhtemelen değiştirmeliyim:
Tam hata mesajı, belki de şaşırtıcı bir şekilde, endişelenecek bir şey olmadığını ve düzeltmeye gerek olmadığını söylüyor.
Bu, çoğu insanın hata mesajlarına tepkisinin tam tersidir, benimki de dahil olmak üzere, özellikle mesaj "başarısız" kelimesiyle başlarsa. Önemli olan, hata mesajının bu kısmı hakkında düşünmektir:
NIntegrate
elde edilen-1.24910*^-16
ve4.588053980254483*^-13
integral ve hata tahminleri için.
Bu NIntegrate
, integralin aralıkta olacağı anlamına gelir
{-4.586804880254483`*^-13, 4.589303080254483`*^-13}
Şimdi, bu yeterince iyi bir cevap mı?
Muhtemelen, siz (başka nedenlerden ötürü, değerin neyi temsil etmesi gerektiğine bağlı olarak) integralin sıfır olmadığı ve ondan daha küçük olduğuna inanmadığınız sürece 10^-13
. Muhtemelen hiçbir şey yapmanıza gerek yoktur; sadece cevabı kabul et. Öte yandan, bir belirsizlik 4.6*10^-13
kabul edilemez ise, aşağıda tartışılan yöntemlerden hiçbiri bunu düzeltmez; sadece sorunu gizlerler.
OP'nin NDSolve
yöntemi, bu aralığın oldukça dışında kalan ve AccuracyGoal
yaklaşık değerine karşılık gelen yöntemden daha iyidir 8
.
OP'ın yöntem daha iyidir NIntegrate
entegre ederek elde edilen cevap 1 + integrand
ve çıkarılmasıyla 2 Pi
biraz teknik nedenlerle: Varsayılan hassas hedefi hakkındadır 6
, hangi değerindeki hata integrali ile sınırlanmış demek olduğunu 2 Pi 10*^-6
çok daha fazla olan 4.6*10^-13
. Ayrıca, bu yöntemdeki integralin değeri (eksi 2 Pi
) aralığın içinde yer alırken , OP'nin integralinin değerinden çok daha büyüktür.
OP'nin yöntemi düşürmekten daha iyidir AccuracyGoal
. Ayarı AccuracyGoal -> amutlak hata az ise araç kabaca 10^-a
, NIntegrate
sonucunu kabul edecektir. Düşürerek AccuracyGoal
, aslında NIntegrate
daha kötü bir sonucu kabul etmeyi söylüyorsunuz . Bunu yapmak için iyi bir neden, @MarcoB bağlantılı yanıtlardan birinde verilmiştir: Daha düşük bir ayar NIntegrate
, integral (neredeyse) sıfır olduğunda hızlanır , çünkü daha az doğru bir sonucu hesaplamak daha kolaydır.
Bu diğer yöntemlerde çok yanlış bir şey yok. 8 ondalık basamağa ihtiyaç duymadığınız sürece, ki bu neredeyse kesinlikle böyle değildir, bunlar iyidir ancak OP'nin yönteminden daha iyi değildir. Bu durumda hata mesajı aslında cevabın ne kadar iyi olduğunu gösterir . Diğer durumlarda, cevabın ne kadar kötü olabileceğini gösterebilir.