Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: intfuncinit Section: sums C-Name: intfuncinit0 Prototype: V=GGED0,L,p Help: intfuncinit(t=a,b,f,{m=0}): initialize tables for integrations from a to b using a weight f(t). For integral transforms such as Fourier or Mellin transforms. Wrapper: (,,G) Description: (gen,gen,gen,?small):gen:prec intfuncinit(${3 cookie}, ${3 wrapper}, $1, $2, $4, $prec) Doc: initialize tables for use with integral transforms (such as Fourier, Laplace or Mellin transforms) in order to compute $$ \int_a^b f(t) k(t,z) \, dt $$ for some kernel $k(t,z)$. The endpoints $a$ and $b$ are coded as in \kbd{intnum}, $f$ is the function to which the integral transform is to be applied and the nonnegative integer $m$ is as in \kbd{intnum}: multiply the number of sampling points roughly by $2^m$, hopefully increasing the accuracy. This function is particularly useful when the function $f$ is hard to compute, such as a gamma product. \misctitle{Limitation} The endpoints $a$ and $b$ must be at infinity, with the same asymptotic behavior. Oscillating types are not supported. This is easily overcome by integrating vectors of functions, see example below. \misctitle{Examples} \item numerical Fourier transform $$F(z) = \int_{-\infty}^{+\infty} f(t)e^{-2i\pi z t}\, dt. $$ First the easy case, assume that $f$ decrease exponentially: \bprog f(t) = exp(-t^2); A = [-oo,1]; B = [+oo,1]; \p200 T = intfuncinit(t = A,B , f(t)); F(z) = { my(a = -2*I*Pi*z); intnum(t = A,B, exp(a*t), T); } ? F(1) - sqrt(Pi)*exp(-Pi^2) %1 = -1.3... E-212 @eprog\noindent Now the harder case, $f$ decrease slowly: we must specify the oscillating behavior. Thus, we cannot precompute usefully since everything depends on the point we evaluate at: \bprog f(t) = 1 / (1+ abs(t)); \p200 \\ Fourier cosine transform FC(z) = { my(a = 2*Pi*z); intnum(t = [-oo, a*I], [+oo, a*I], cos(a*t)*f(t)); } FC(1) @eprog \item Fourier coefficients: we must integrate over a period, but \kbd{intfuncinit} does not support finite endpoints. The solution is to integrate a vector of functions ! \bprog FourierSin(f, T, k) = \\ first k sine Fourier coeffs { my (w = 2*Pi/T); my (v = vector(k+1)); intnum(t = -T/2, T/2, my (z = exp(I*w*t)); v[1] = z; for (j = 2, k, v[j] = v[j-1]*z); f(t) * imag(v)) * 2/T; } FourierSin(t->sin(2*t), 2*Pi, 10) @eprog\noindent The same technique can be used instead of \kbd{intfuncinit} to integrate $f(t) k(t,z)$ whenever the list of $z$-values is known beforehand. Note that the above code includes an unrelated optimization: the $\sin(j w t)$ are computed as imaginary parts of $\exp(i j w t)$ and the latter by successive multiplications. \item numerical Mellin inversion $$F(z) = (2i\pi)^{-1} \int_{c -i\infty}^{c+i\infty} f(s)z^{-s}\, ds = (2\pi)^{-1} \int_{-\infty}^{+\infty} f(c + i t)e^{-\log z(c + it)}\, dt. $$ We take $c = 2$ in the program below: \bprog f(s) = gamma(s)^3; \\ f(c+it) decrease as exp(-3Pi|t|/2) c = 2; \\ arbitrary A = [-oo,3*Pi/2]; B = [+oo,3*Pi/2]; T = intfuncinit(t=A,B, f(c + I*t)); F(z) = { my (a = -log(z)); intnum(t=A,B, exp(a*I*t), T)*exp(a*c) / (2*Pi); } @eprog \synt{intfuncinit}{void *E, GEN (*eval)(void*,GEN), GEN a,GEN b,long m, long prec}.