Numerical integration#
%matplotlib widget
The dispersion integral of the phasespace factor cannot be solved analytically for higher angular momenta (\(\ell > 0\)). We therefore need to perform a numerical integration. However, since the integrand of the dispersion integral contains singularities, it is important to choose the numerical integration algorithm.
This notebook contains an interactive widget that shows the numerical stability and performance of different numerical integration algorithms when computing the dispersion integral along (close to) the real axis of the complex energy plane.
Tip
The conclusion is that Romberg’s method (quadax.romberg()) is the best choice for computing the dispersion integral close to the physical (real) axis. For computing the dispersion integral further away from the axis, the Gauss–Kronrod method (e.g. quadax.quadgk()) is accurate enough and faster than Romberg’s method.
Use
quadax.romberg()when computing the dispersion integral for an amplitude model fit (physical axis).Use
quadax.quadgk()when determining the pole positions of the amplitude model (complex plane).
Chew–Mandelstam dispersion integral#
The general form of the Chew–Mandelstam dispersion integral \(\Sigma_\ell(s)\) is an integral over the product \(\rho(s) \, n_\ell^2(s)\) of the phase space factor \(\rho(s)\) (PhaseSpaceFactor) and the square of the form factor \(n_\ell^2(s)\) (FormFactor). The required formulas are:
where we have used a split square root for a cleaner cut structure in the complex energy plane.
Here, \(i\epsilon\) indicates that \(\Sigma_\ell(s)\) with \(s\in\mathbb{R}\) is formulated just above the real axis in order to avoid \(s'-s=0\). However, as can be seen in the widget below, \(i\epsilon\) is not required when \(s\in\mathbb{C}\), giving us the general form:
The reason is that the function \(\rho(s')\,n_\ell^2(s')\) does not have a branch cut along the real axis above the \(s_\mathrm{thr}\) threshold, so there is no need to approach some contour around such a potential discontinuity. The form of the dispersion integral is explained and derived here.
When using this form of the dispersion integral to compute \(\Sigma_\ell(s)\) for \(s\in\mathbb{R}\), the caller should use the fact that \(\lim_{\epsilon\to 0^+} \Sigma_\ell(s + i\epsilon)\). In the numerical implementation, that means giving s + epsilon * 1j as input when s is a array with floats. The challenge is to find a value for \(\epsilon\): the smaller the value for \(\epsilon\), the closer we are to the physical axis, but the less accurate the numerical integration becomes. The widget below allows you to explore this trade-off for different numerical integration algorithms.
Numerical implementation#
In this notebook, we implement the formulas listed above numerical rather than lambdifying the symbolic expressions, so that we have full control over the numerical implementation and to make the implementation recognizable to pure array-oriented workflows.
In the case of \(S\)-waves (\(\ell=0\)), we can compare the result of the integration to the analytical solution to the integral: