1

Answer using the numerical integration was provided here https://mathematica.stackexchange.com/a/276353/88922

I want to NIntegrate and plot a highly oscillatory function, but get errors which I don't know how to resolve. Also, the integration converges very slowly.

I have a function

$\mathrm{eA} = 0.0579484\cdot \int dk_x \, dk_y \, dk_z \frac{\cos[-3.2 \cdot k_x] \cos[-0.999957 \cdot t \cdot k_z]}{0.000086\cdot k_z^2 + k_x^2 +k_y^2}$

which I want to integrate numerically and plot over $t$. I write

eA[t_] := (0.0579484*NIntegrate[(Cos[-3.2*kx]*Cos[-0.999957*t*kz])/(0.000086*kz^2+kx^2+ky^2),{kx,-60 Pi,60 Pi},{ky,-60 Pi,60 Pi},{kz,-60 Pi,60 Pi}])

where I don't integrate from $-\infty$ to $\infty$ because I find $-60\pi$ to $60\pi$ to be a sufficient boundary.

When I plot it

Plot[eA[t], {t, -0.2, 0.2}, PlotRange -> All]

I get

enter image description here

which for some reason is the exact same result as when I plotted it for the $-14 \pi$ to $14 \pi$. Also, this result doesn't match a reference one.

The errors that I get are

NIntegrate::slwcon: Numerical integration converging too slowly; suspect one of the following: singularity, value of the integration is 0, highly oscillatory integrand, or WorkingPrecision too small.

NIntegrate::eincr: The global error of the strategy GlobalAdaptive has increased more than 2000 times. The global error is expected to decrease monotonically after a number of integrand evaluations. Suspect one of the following: the working precision is insufficient for the specified precision goal; the integrand is highly oscillatory or it is not a (piecewise) smooth function; or the true value of the integral is 0. Increasing the value of the GlobalAdaptive option MaxErrorIncreases might lead to a convergent numerical integration. NIntegrate obtained 110.14634155042681 and 0.001241352644141132 for the integral and error estimates.

A known singularity is when $k_x = k_y = k_z = 0$, but I'm not sure how to exclude it.

The reference plot is for

eAref[t_]:=1.14386/Sqrt[0.000880621 + 0.999914 t^2]

and gives

enter image description here

-----------------------------------

EDIT:

The solution https://mathematica.stackexchange.com/a/275768/88922 worked and I acquired the result that I needed for which I thank the author very much.

However, I encountered some problems when I modified the integral by multiplying the numerator by $\cos(k_y \cdot R_y)$

f1[u_,Rx_,Rz_]=Assuming[Rx\[Element]Reals&&Rx!=0&&Rz\[Element]Reals&&u>0,Integrate[(Cos[kx Rx] Cos[ky Ry]Cos[kz Rz])/(kx^2+ky^2+u*kz^2),{kz,-\[Infinity],\[Infinity]},{ky,-\[Infinity],\[Infinity]},{kx,-\[Infinity],\[Infinity]}]]

which resulted in

enter image description here

The program integrated over only $dk_x$ and left the rest untouched.

Also, when I delete the $\cos(k_y \cdot R_y)$, go back to the previous form

f1[u_,Rx_,Rz_]=Assuming[Rx\[Element]Reals&&Rx!=0&&Rz\[Element]Reals&&u>0,Integrate[(Cos[kx Rx]Cos[kz Rz])/(kx^2+ky^2+u*kz^2),{kz,-\[Infinity],\[Infinity]},{ky,-\[Infinity],\[Infinity]},{kx,-\[Infinity],\[Infinity]}]]

and run it I also get

enter image description here

instead of the original result. The calculation then takes much more time this way.

The program works well only if I run freshly copied formula provided by the answer's author. Any ideas why?

Patrycja
  • 55
  • 6
  • Please post v. – cvgmt Nov 08 '22 at 12:38
  • Edited to replace $v$ with a number, sorry – Patrycja Nov 08 '22 at 12:55
  • Note that $\int dk_x dk_y dk_z \frac{e^{-i(k_x x + k_y y + k_z z)}}{k_x^2 + k_y^2 + k_z^2} = \frac{2\pi^2}{\sqrt{x^2+y^2+z^2}}$ is a well-known Fourier integral, see this or this. You can reduce your integral to this case by scaling $k_z$ appropriately. All these integral do not actually converge absolutely, the problem being large $k_x,k_y,k_z$, not small $k_x,k_y,k_z$. – user293787 Nov 09 '22 at 03:59
  • Thank you for your input and valuable information. However, I want to keep this integral in as general form as I can because I'll be modifying it later on for different cases – Patrycja Nov 09 '22 at 08:57

1 Answers1

9

Analytic integration is much more stable than numerical integration, especially when infinite and/or multi-dimensional integrals are concerned:

f[u_, x_, z_] = Assuming[x \[Element] Reals && x != 0 && z \[Element] Reals && u > 0,
    Integrate[(Cos[-kx x] Cos[-kz z])/(kx^2 + ky^2 + u*kz^2),
        {kz, -∞, ∞}, {kx, -∞, ∞}, {ky, -∞, ∞}]]
(*    (2 π^2)/Sqrt[u x^2 + z^2]    *)

eA[t_] = 0.0579484f[0.000086, 3.2, 0.999957 t] ( 1.14386/Sqrt[0.00088064 + 0.999914 t^2] *)

Roman
  • 47,322
  • 2
  • 55
  • 121
  • The problem with the analytic integration is that it takes significantly longer to compute than with numerical integration even for small boundaries. I'm pretty sure I need to stick with NIntegrate – Patrycja Nov 08 '22 at 13:23
  • 6
    The analytic integration is done once-and-for-all (hence an immediate assignment was used) and every future evaluation of f or eA is instantaneous. Numerical integration must be done for every value of the parameters anew (hence you used a delayed assignment). So what you are saying is only true if you evaluate your eA once; but as you are evaluating it multiple times, analytic integration is much faster. – Roman Nov 08 '22 at 13:36
  • Thank you very much for your input, the provided solution worked. If by any chance you have time to look at the post again, where I added a problem appearing after applying the solution, it would be much appreciated. Either way, thanks :) – Patrycja Nov 09 '22 at 09:51
  • @Patrycja you interchanged the order of integration; if you go back to the order I suggest, it works. Try to integrate step by step (one dimension at a time) and fiddle with assumptions until it works. – Roman Nov 09 '22 at 10:56