Mathematica Asked on December 26, 2021
When I run the following identical numerical integrals
NIntegrate[
Exp[2 I s] Exp[2 I t] ((Cos[s] - Cos[t])^2 + (Sin[s] - Sin[t])^2) +
1, {s, 0, 2 [Pi]}, {t, 0, 2 [Pi]}] // Timing
NIntegrate[
Exp[2 I s] Exp[2 I t] (2 - 2 Cos[s - t]) + 1, {s, 0, 2 [Pi]}, {t,
0, 2 [Pi]}] // Timing
I find the first takes around 14 seconds while the second only takes a fraction of a second. Can anyone explain why there is such a difference and how to improve the timing of the first integral because I’m going to be doing a lot of similar integrals of the first kind without being able to simplify the integrand to look more like the second? Thanks in advance for any help.
The symbolic processing misses the obvious way to compute these integrals, namely, Method -> "Trapezoidal"
, about 100 times faster than "SymbolicProcessing" -> 0
:
NIntegrate[
Exp[2 I s] Exp[2 I t] ((Cos[s] - Cos[t])^2 + (Sin[s] - Sin[t])^2) + 1,
{s, 0, 2 π}, {t, 0, 2 π},
Method -> "Trapezoidal"] // RepeatedTiming
NIntegrate[
Exp[2 I s] Exp[2 I t] (2 - 2 Cos[s - t]) + 1,
{s, 0, 2 π}, {t, 0, 2 π},
Method -> "Trapezoidal"] // RepeatedTiming
(*
{0.0020, 39.4784 - 8.88178*10^-16 I}
{0.0021, 39.4784 - 1.11022*10^-16 I}
*)
For purposes of comparison:
NIntegrate[
Exp[2 I s] Exp[2 I t] ((Cos[s] - Cos[t])^2 + (Sin[s] - Sin[t])^2) + 1,
{s, 0, 2 π}, {t, 0, 2 π}] // AbsoluteTiming
NIntegrate[
Exp[2 I s] Exp[2 I t] (2 - 2 Cos[s - t]) + 1,
{s, 0, 2 π}, {t, 0, 2 π}] // AbsoluteTiming
(*
{13.3983, 39.4784 - 1.07495*10^-13 I}
{0.366373, 39.4784 - 1.20667*10^-15 I}
*)
Reference
Answered by Michael E2 on December 26, 2021
The first NIntegrate
spends some time doing symbolic pre-processing of the integrand. You can turn that off and the integrals complete in about the same time:
NIntegrate[
Exp[2 I s] Exp[2 I t] ((Cos[s] - Cos[t])^2 + (Sin[s] - Sin[t])^2) + 1, {s, 0, 2 π}, {t, 0, 2 π},
Method -> {Automatic, "SymbolicProcessing" -> 0}] // Timing
(* result: {0.203125, 39.4784 - 5.6413*10^-9 I} *)
NIntegrate[
Exp[2 I s] Exp[2 I t] (2 - 2 Cos[s - t]) + 1, {s, 0, 2 π}, {t, 0, 2 π},
Method -> {Automatic, "SymbolicProcessing" -> 0}] // Timing
(* result: {0.203125, 39.4784 + 2.07215*10^-8 I} *)
You may notice the slightly different numerical error in the imaginary part.
Answered by flinty on December 26, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP