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