The calculation of the 3-point vertex $V_3$ involves a two-dimensional integral over Feynman parameters [1] \begin{equation*} V_3(s) = g - g\ \alpha \int_0^1\hspace{-0.5em} dx_1 \int_0^{1 - x_1}\hspace{-2em} dx_2\ \log \left( D_3(s) / m^2 \right) \end{equation*} with \begin{equation*} D_3(s) = - x_1 x_2 s + [ 1 - (x_1 + x_2) x_3 ] m^2 \end{equation*} Here, $g$ is the coupling constant, $s$ is a Mandelstam variable, $m$ is the mass of the particles, $\alpha = g^2/(4 \pi)^3$ and $x_1 + x_2 + x_3 = 1$. The branch cut of the logarithm is such that $\log(z) = \log(|z| ) - i \pi$ for $z< 0$.
I implement $V_3$ in Mathematica as
V3Naive[s_,g_]:= g ( 1 - 1 /2 \[Alpha][g] 2 NIntegrate[mylog[D3[x1,x2,1 - x1-x2,s]/m^2],{x1,0.,1.},{x2,0.,1.-x1}])
with
mylog[z_] /; z \[Element] Reals := If[z > 0, Log[z], If[z < 0, Log[Abs[z]] - I Pi]]
When calculating the integral naively, Mathematica warns about numerical issues. I illustrate this in the following graph, which is a picture of $V_3$ as function of $s$, calculated with
V3Naive
. If there are numerical problems the points are plotted in red. If there are no numerical problems, the points are plotted in green. All Mathematica code can be found at the bottom of this post.
Fig 1. $V_3$ as function of $s$, calculated with V3Naive $g=1$ and $m=1$ |
Fig 2. Integration points chosen in V3Naive $s = 16$, $m=1$ |
The documentation of NIntegrate [2] explains that splitting the integration domain along the singular curve helps the algorithm. Better code is therefore
V3Better[s_,g_]:= g ( 1 - 1 /2 \[Alpha][g] 2 (NIntegrate[mylog[D3[x1,x2,1 - x1-x2,s]/m^2]*Boole[- x1 x2 s + ( 1 - ( x1 +x2) (1 - (x1+x2)))m^2<0],{x1,0.,1.},{x2,0.,1.-x1}] +NIntegrate[mylog[D3[x1,x2,1 - x1-x2,s]/m^2]*Boole[- x1 x2 s + ( 1 - ( x1 +x2) (1 - (x1+x2)))m^2>0],{x1,0.,1.},{x2,0.,1.-x1}] ))
In this case Mathematica allocates many, but not extremely many, points around the singular curve, see next picture
Fig 3. Integration points chosen in V3Better
The red (blue) points are where $D_3$ is negative (positive). |
V3Better
instead of V3Naive
Fig 4. $V_3$ as function of $s$, calculated with V3Better |
References
[1] Mark Srednicki, Quantum Field Theory, pages 124-125
[2] NIntegrate Integration Strategies
[3] J. Calmet, A. Visconti, Computing Methods in Quantum Electrodynamics, Chapter in Field Theory, Quantization and Statistical Physics Volume 6 of the series Mathematical Physics and Applied Mathematics pp 33-57
[4] Vladimir Smirnov, Feynman Integral Calculus
The code that produces figure 1
(* inelegant code *)
tt =Table[s,{s,-50,100,1}];
For [i=1,i<= Length[tt],i++,
s = tt[[i]];
result= Check[tmp = V3Naive[s,1];"nowarning","warning"];
tt[[i]] = If[result === "nowarning", {s,Re[tmp],Green},{s,Re[tmp],Red}]
]
Graphics[{#3, PointSize[0.01], Point[{#1, #2}]} & @@@ tt, Axes -> True, AspectRatio -> Full, PlotRange -> All]
The last bit of code was inspired by a question on Mathematica Stack Exchange.The code that produces figure 2
I found the following code at the documentation of NIntegrate [2]
ss = (2 2)^2
gr={Red,Point/@N@Reap[NIntegrate[mylog[D3[x1,x2,1 - x1-x2,ss]/m^2],{x1,0.,1.},{x2,0.,1.-x1},EvaluationMonitor:>Sow[{x1,x2}]]][[2,1]]};
Graphics[{PointSize[0.006],gr},Axes->True,AxesOrigin->{0,0}]
The code that produces figure 3
I found this code again at [2].
gr1={Red,Point/@N@Reap[NIntegrate[mylog[D3[x1,x2,1 - x1-x2,ss]/m^2]*Boole[- x1 x2 ss + ( 1 - ( x1 +x2) (1 - (x1+x2)))m^2<0],{x1,0.,1.},{x2,0.,1.-x1},EvaluationMonitor:>Sow[{x1,x2}]]][[2,1]]};
gr2={Blue,Point/@N@Reap[NIntegrate[mylog[D3[x1,x2,1 - x1-x2,ss]/m^2]*Boole[- x1 x2 ss + ( 1 - ( x1 +x2) (1 - (x1+x2)))m^2>0],{x1,0.,1.},{x2,0.,1.-x1},EvaluationMonitor:>Sow[{x1,x2}]]][[2,1]]};
Graphics[{PointSize[0.006],gr1,gr2},Axes->True,AxesOrigin->{0,0}]
No comments:
Post a Comment