Moyal.cc
Go to the documentation of this file.
1 #include <limits>
2 #include <utl/Math.h>
3 #include <utl/Moyal.h>
4 #include <utl/ErrorLogger.h>
5 
6 using namespace std;
7 
8 
9 namespace utl {
10 
14  template<int branch>
15  inline
16  double
18  {
19  const double p = branch * sqrt(2*(y-1));
20  const double p2 = Sqr(p);
21  return p + (1./6)*p2 + (1./36)*p*p2 + (1./270)*p2*p2;
22  }
23 
24 
28  template<int branch>
29  inline
30  double
31  InverseMoyalApproximation(const double y)
32  {
33  if (branch == 1)
34  return (y > 4.2) ? y : InverseMoyalBranchPointExpansion<branch>(y);
35  else
36  return (y > 32.) ? -log(y) : InverseMoyalBranchPointExpansion<branch>(y);
37  }
38 
39 
49  template<int branch>
50  double
51  InverseMoyal(const double y, const double epsilon)
52  {
53  if (y <= 0)
54  return numeric_limits<double>::quiet_NaN();
55  const double yy = -2*log(y);
56  if (yy < 1)
57  return numeric_limits<double>::quiet_NaN();
58  double x = InverseMoyalApproximation<branch>(yy);
59  const double eps = branch*epsilon;
60  for (int i = 0; i < 30; ++i) {
61  const double expmx = exp(-x);
62  const double delta = (x + expmx - yy)/(1 - expmx);
63  x -= delta;
64  if (fabs(delta) < eps*x)
65  return x;
66  }
67  WARNING("convergence not reached.");
68  return x;
69  }
70 
71 
72  // instantiate branch +1 and -1
73 
74  template double InverseMoyal<+1>(const double y, const double eps);
75  template double InverseMoyal<-1>(const double y, const double eps);
76 
77 }
constexpr T Sqr(const T &x)
double InverseMoyalApproximation(const double y)
Definition: Moyal.cc:31
double InverseMoyalBranchPointExpansion(const double y)
Definition: Moyal.cc:17
template double InverseMoyal<+1 >(const double y, const double eps)
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
double eps
double InverseMoyal(const double y, const double epsilon)
Inverse of the Moyal function.
Definition: Moyal.cc:51

, generated on Tue Sep 26 2023.