diff --git a/mbtrack2/utilities/misc.py b/mbtrack2/utilities/misc.py
index c31af03d547338323c8ca1d98e886eefd02fe853..6addd0211d7f9344dcfd0a7d97c7737546b0f863 100644
--- a/mbtrack2/utilities/misc.py
+++ b/mbtrack2/utilities/misc.py
@@ -8,6 +8,7 @@ from pathlib import Path
 import numpy as np
 import pandas as pd
 from scipy.interpolate import interp1d
+from scipy.special import gamma, factorial, hyp2f1
 
 from mbtrack2.impedance.wakefield import Impedance
 from mbtrack2.utilities.spectrum import spectral_density
@@ -168,7 +169,6 @@ def tune_shift_from_effective_impedance(Zeff):
 def yokoya_elliptic(x_radius, y_radius):
     """
     Compute Yokoya factors for an elliptic beam pipe.
-    Function adapted from N. Mounet IW2D.
 
     Parameters
     ----------
@@ -189,38 +189,386 @@ def yokoya_elliptic(x_radius, y_radius):
         Yokoya factor for the quadrupolar horizontal impedance.
     yokyquad : float
         Yokoya factor for the quadrupolar vertical impedance.
+    
+    References
+    ----------
+    [1] : Phys. Rev. Accel. Beams 22, 121001 (2019)
+    [2] : Phys. Rev. E 47, 656 (1993)
+
     """
-    if y_radius < x_radius:
-        small_semiaxis = y_radius
-        large_semiaxis = x_radius
+    
+    if x_radius==0 or y_radius==0:
+        raise ValueError("Both radii must be non-zero values.")
+    elif x_radius==np.inf and y_radius==np.inf:
+        raise ValueError("Both radii have infinite values.")
+    elif x_radius==np.inf:
+        yoklong = 1
+        yokxdip = np.pi**2/24
+        yokydip = np.pi**2/12
+        yokxquad = -np.pi**2/24
+        yokyquad = np.pi**2/24
+    elif y_radius==np.inf:
+        yoklong = 1
+        yokxdip = np.pi**2/12
+        yokydip = np.pi**2/24
+        yokxquad = np.pi**2/24
+        yokyquad = -np.pi**2/24
     else:
-        small_semiaxis = x_radius
-        large_semiaxis = y_radius
-
-    path_to_file = Path(__file__).parent
-    file = path_to_file / "data" / "Yokoya_elliptic_from_Elias_USPAS.csv"
-
-    # read Yokoya factors interpolation file
-    # BEWARE: columns are ratio, dipy, dipx, quady, quadx
-    yokoya_file = pd.read_csv(file)
-    ratio_col = yokoya_file["x"]
-    # compute semi-axes ratio (first column of this file)
-    ratio = (large_semiaxis-small_semiaxis) / (large_semiaxis+small_semiaxis)
-
-    # interpolate Yokoya file at the correct ratio
-    yoklong = 1
-
-    if y_radius < x_radius:
-        yokydip = np.interp(ratio, ratio_col, yokoya_file["dipy"])
-        yokxdip = np.interp(ratio, ratio_col, yokoya_file["dipx"])
-        yokyquad = np.interp(ratio, ratio_col, yokoya_file["quady"])
-        yokxquad = np.interp(ratio, ratio_col, yokoya_file["quadx"])
-    else:
-        yokxdip = np.interp(ratio, ratio_col, yokoya_file["dipy"])
-        yokydip = np.interp(ratio, ratio_col, yokoya_file["dipx"])
-        yokxquad = np.interp(ratio, ratio_col, yokoya_file["quady"])
-        yokyquad = np.interp(ratio, ratio_col, yokoya_file["quadx"])
+        if y_radius < x_radius:
+            small_semiaxis = y_radius
+            large_semiaxis = x_radius
+        else:
+            small_semiaxis = x_radius
+            large_semiaxis = y_radius
+
+        # Our equations are approximately valid only for qr (ratio) values less than or equal to 0.9.
+        qr_th = 0.9
+        F = np.sqrt(large_semiaxis**2 - small_semiaxis**2)
+        mu_b = np.arccosh(large_semiaxis/F)
+        qr = (large_semiaxis - small_semiaxis) / (large_semiaxis + small_semiaxis)
+
+        if qr == 0:
+            yoklong = 1
+            yokxdip = 1
+            yokydip = 1
+            yokxquad = 0
+            yokyquad = 0
+
+        # Beyond this threshold, they are not valid (they can even diverge),
+        # but should converge to Yokoya form factors of parallel plates.
+        # Fortunately, beyond this threshold, they show asymptotic behavior,
+        # so we perform linear interpolation.
+        elif qr > qr_th:
+            if y_radius < x_radius:
+                yoklong_pp = 1
+                yokxdip_pp = np.pi**2/24
+                yokydip_pp = np.pi**2/12
+                yokxquad_pp = -np.pi**2/24
+                yokyquad_pp = np.pi**2/24
+            else:
+                yoklong_pp = 1
+                yokxdip_pp = np.pi**2/12
+                yokydip_pp = np.pi**2/24
+                yokxquad_pp = np.pi**2/24
+                yokyquad_pp = -np.pi**2/24
+
+            small_semiaxis_th = large_semiaxis*(1-qr_th)/(1+qr_th)
+            F_th = np.sqrt(large_semiaxis**2 - small_semiaxis_th**2)
+            mu_b_th = np.arccosh(large_semiaxis/F_th)
+
+            yoklong_th = 0
+            yokxdip_th = 0
+            yokydip_th = 0
+            yokxquad_th = 0
+        
+            if y_radius < x_radius:
+                for ip in range(50):
+                    for il in range(50):
+                        if (ip==0) and (il==0):
+                            yoklong_th += ( np.sqrt(2)*small_semiaxis_th/(2*np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)
+                                           *(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        elif (ip==0 and il!=0) or (ip!=0 and il==0):
+                            yoklong_th += ( np.sqrt(2)*small_semiaxis_th/(np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)
+                                           *(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        else:
+                            yoklong_th += ( 2*np.sqrt(2)*small_semiaxis_th/(np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)
+                                           *(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        yokxdip_th += ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                       *(-1)**ip*(2*ip+1)/np.cosh((2*ip+1)*mu_b_th)
+                                       *(-1)**il*(2*il+1)/np.cosh((2*il+1)*mu_b_th)
+                                       * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                       *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                       *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                       + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b_th)
+                                       *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                       *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b_th)) ) )
+                        yokydip_th += ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                       *(-1)**ip*(2*ip+1)/np.sinh((2*ip+1)*mu_b_th)
+                                       *(-1)**il*(2*il+1)/np.sinh((2*il+1)*mu_b_th)
+                                       * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                       *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                       *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                       - np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b_th)
+                                       *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                       *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b_th)) ) )
+                        if (il==0):
+                            yokxquad_th -= ( np.sqrt(2)*small_semiaxis_th**3/(2*np.pi*F_th**3)
+                                            *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b_th)
+                                            *(-1)**il/np.cosh(2*il*mu_b_th)
+                                            * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                            *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                            *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                            + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                            *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                            *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        else:
+                            yokxquad_th -= ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                            *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b_th)
+                                            *(-1)**il/np.cosh(2*il*mu_b_th)
+                                            * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                            *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                            *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                            + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                            *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                            *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                yokyquad_th = -yokxquad_th
+            else:
+                for ip in range(50):
+                    for il in range(50):
+                        if (ip==0) and (il==0):
+                            yoklong_th += ( np.sqrt(2)*small_semiaxis_th/(2*np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)
+                                           *(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        elif (ip==0 and il!=0) or (ip!=0 and il==0):
+                            yoklong_th += ( np.sqrt(2)*small_semiaxis_th/(np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)
+                                           *(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        else:
+                            yoklong_th += ( 2*np.sqrt(2)*small_semiaxis_th/(np.pi*F_th)
+                                           *(-1)**ip/np.cosh(2*ip*mu_b_th)*(-1)**il/np.cosh(2*il*mu_b_th)
+                                           * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                           *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                           *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                           + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                           *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                           *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        yokydip_th += ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                       *(-1)**ip*(2*ip+1)/np.cosh((2*ip+1)*mu_b_th)
+                                       *(-1)**il*(2*il+1)/np.cosh((2*il+1)*mu_b_th)
+                                       * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                       *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                       *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                       + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b_th)
+                                       *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                       *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b_th)) ) )
+                        yokxdip_th += ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                       *(-1)**ip*(2*ip+1)/np.sinh((2*ip+1)*mu_b_th)
+                                       *(-1)**il*(2*il+1)/np.sinh((2*il+1)*mu_b_th)
+                                       * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                       *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                       *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                       - np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b_th)
+                                       *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                       *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b_th)) ) )
+                        if (il==0):
+                            yokyquad_th -= ( np.sqrt(2)*small_semiaxis_th**3/(2*np.pi*F_th**3)
+                                            *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b_th)
+                                            *(-1)**il/np.cosh(2*il*mu_b_th)
+                                            * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                            *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                            *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                            + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                            *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                            *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                        else:
+                            yokyquad_th -= ( np.sqrt(2)*small_semiaxis_th**3/(np.pi*F_th**3)
+                                            *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b_th)
+                                            *(-1)**il/np.cosh(2*il*mu_b_th)
+                                            * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b_th)
+                                            *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                            *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b_th))
+                                            + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b_th)
+                                            *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                            *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b_th)) ) )
+                yokxquad_th = -yokyquad_th
+
+            qr_array = np.array([qr_th, 1])
+            yoklong_array = np.array([yoklong_th, yoklong_pp])
+            yokxdip_array = np.array([yokxdip_th, yokxdip_pp])
+            yokydip_array = np.array([yokydip_th, yokydip_pp])
+            yokxquad_array = np.array([yokxquad_th, yokxquad_pp])
+            yokyquad_array = np.array([yokyquad_th, yokyquad_pp])
+
+            yoklong = np.interp(qr, qr_array, yoklong_array)
+            yokxdip = np.interp(qr, qr_array, yokxdip_array)
+            yokydip = np.interp(qr, qr_array, yokydip_array)
+            yokxquad = np.interp(qr, qr_array, yokxquad_array)
+            yokyquad = np.interp(qr, qr_array, yokyquad_array)
 
+        else:
+            yoklong = 0
+            yokxdip = 0
+            yokydip = 0
+            yokxquad = 0
+
+            if y_radius < x_radius:
+                for ip in range(50):
+                    for il in range(50):
+                        if (ip==0) and (il==0):
+                            yoklong += ( np.sqrt(2)*small_semiaxis/(2*np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        elif (ip==0 and il!=0) or (ip!=0 and il==0):
+                            yoklong += ( np.sqrt(2)*small_semiaxis/(np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        else:
+                            yoklong += ( 2*np.sqrt(2)*small_semiaxis/(np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        yokxdip += ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                    *(-1)**ip*(2*ip+1)/np.cosh((2*ip+1)*mu_b)
+                                    *(-1)**il*(2*il+1)/np.cosh((2*il+1)*mu_b)
+                                    * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                    *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                    *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                    + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b)
+                                    *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                    *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b)) ) )
+                        yokydip += ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                    *(-1)**ip*(2*ip+1)/np.sinh((2*ip+1)*mu_b)
+                                    *(-1)**il*(2*il+1)/np.sinh((2*il+1)*mu_b)
+                                    * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                    *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                    *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                    - np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b)
+                                    *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                    *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b)) ) )
+                        if (il==0):
+                            yokxquad -= ( np.sqrt(2)*small_semiaxis**3/(2*np.pi*F**3)
+                                         *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b)
+                                         *(-1)**il/np.cosh(2*il*mu_b)
+                                         * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                         *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                         *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                         + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                         *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                         *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        else:
+                            yokxquad -= ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                         *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b)
+                                         *(-1)**il/np.cosh(2*il*mu_b)
+                                         * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                         *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                         *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                         + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                         *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                         *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                yokyquad = -yokxquad
+            else:
+                for ip in range(50):
+                    for il in range(50):
+                        if (ip==0) and (il==0):
+                            yoklong += ( np.sqrt(2)*small_semiaxis/(2*np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        elif (ip==0 and il!=0) or (ip!=0 and il==0):
+                            yoklong += ( np.sqrt(2)*small_semiaxis/(np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        else:
+                            yoklong += ( 2*np.sqrt(2)*small_semiaxis/(np.pi*F)
+                                        *(-1)**ip/np.cosh(2*ip*mu_b)
+                                        *(-1)**il/np.cosh(2*il*mu_b)
+                                        * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                        *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                        *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                        + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                        *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                        *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        yokydip += ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                    *(-1)**ip*(2*ip+1)/np.cosh((2*ip+1)*mu_b)
+                                    *(-1)**il*(2*il+1)/np.cosh((2*il+1)*mu_b)
+                                    * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                    *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                    *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                    + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b)
+                                    *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                    *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b)) ) )
+                        yokxdip += ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                    *(-1)**ip*(2*ip+1)/np.sinh((2*ip+1)*mu_b)
+                                    *(-1)**il*(2*il+1)/np.sinh((2*il+1)*mu_b)
+                                    * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                    *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                    *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                    - np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+3)*mu_b)
+                                    *gamma(1.5+ip+il)/(gamma(0.5)*factorial(ip+il+1))
+                                    *hyp2f1(0.5, ip+il+1.5, ip+il+2, np.exp(-4*mu_b)) ) )
+                        if (il==0):
+                            yokyquad -= ( np.sqrt(2)*small_semiaxis**3/(2*np.pi*F**3)
+                                         *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b)
+                                         *(-1)**il/np.cosh(2*il*mu_b)
+                                         * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                         *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                         *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                         + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                         *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                         *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                        else:
+                            yokyquad -= ( np.sqrt(2)*small_semiaxis**3/(np.pi*F**3)
+                                         *(-1)**ip*(2*ip)**2/np.cosh(2*ip*mu_b)
+                                         *(-1)**il/np.cosh(2*il*mu_b)
+                                         * ( np.sqrt(2)*np.pi*np.exp(-(2*abs(ip-il)+1)*mu_b)
+                                         *gamma(0.5+abs(ip-il))/(gamma(0.5)*factorial(abs(ip-il)))
+                                         *hyp2f1(0.5, abs(ip-il)+0.5, abs(ip-il)+1, np.exp(-4*mu_b))
+                                         + np.sqrt(2)*np.pi*np.exp(-(2*ip+2*il+1)*mu_b)
+                                         *gamma(0.5+ip+il)/(gamma(0.5)*factorial(ip+il))
+                                         *hyp2f1(0.5, ip+il+0.5, ip+il+1, np.exp(-4*mu_b)) ) )
+                yokxquad = -yokyquad
+    
     return (yoklong, yokxdip, yokydip, yokxquad, yokyquad)