NIntegrate :: ncvb: NIntegrate, öngörülen doğruluğa yaklaşamadı

Dec 14 2020

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

6 MarcoB Dec 14 2020 at 23:17

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 ".PrecisionGoalAccuracyGoal

İntegrandınız expraçı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
4 UlrichNeumann Dec 14 2020 at 14:30

Ayrıca NDSolvebir 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!

3 Andreas Dec 14 2020 at 22:33

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
2 MichaelE2 Dec 15 2020 at 00:09

Ö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:

NIntegrateelde edilen -1.24910*^-16ve 4.588053980254483*^-13integral 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^-13kabul edilemez ise, aşağıda tartışılan yöntemlerden hiçbiri bunu düzeltmez; sadece sorunu gizlerler.

OP'nin NDSolveyöntemi, bu aralığın oldukça dışında kalan ve AccuracyGoalyaklaşık değerine karşılık gelen yöntemden daha iyidir 8.

OP'ın yöntem daha iyidir NIntegrateentegre ederek elde edilen cevap 1 + integrandve çıkarılmasıyla 2 Pibiraz 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, NIntegratesonucunu kabul edecektir. Düşürerek AccuracyGoal, aslında NIntegratedaha 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.