20 #include <gsl/gsl_sf_erf.h>
21 #include <gsl/gsl_sf_expint.h>
22 #include <gsl/gsl_sf_trig.h>
33 return std::exp(-x * x / 2.0) / std::sqrt(
M_TWOPI);
43 double normalized_x = (x - average) / std_dev;
44 static double root2 = std::sqrt(2.0);
45 return (gsl_sf_erf(normalized_x / root2) + 1.0) / 2.0;
55 return gsl_sf_sinc(x /
M_PI);
66 return std::sin(z) / z;
71 if (std::abs(z) < std::numeric_limits<double>::epsilon())
73 return std::tanh(z) / z;
78 static const double SQRT6DOUBLE_EPS = std::sqrt(6.0 * std::numeric_limits<double>::epsilon());
79 auto nd =
static_cast<double>(N);
80 if (std::abs(nd * x) < SQRT6DOUBLE_EPS)
82 double num = std::sin(nd * x);
83 double den = std::sin(x);
90 throw std::runtime_error(
"Error in Math::erf: negative argument is not allowed");
93 return gsl_sf_erf(arg);
126 static_cast<unsigned>(std::chrono::system_clock::now().time_since_epoch().count());
127 std::default_random_engine generator(seed);
130 if (average < 1000.0) {
131 std::poisson_distribution<int> distribution(average);
132 int sample = distribution(generator);
133 return (
double)sample;
135 std::normal_distribution<double> distribution(average, std::sqrt(average));
136 double sample = distribution(generator);
137 return std::max(0.0, sample);
std::complex< double > complex_t
Defines M_PI and some more mathematical constants.
Defines functions in namespace Math.
double sinc(double x)
sinc function:
double Gaussian(double x, double average, double std_dev)
complex_t tanhc(const complex_t z)
Complex tanhc function: .
double erf(double arg)
Error function of real-valued argument.
double GeneratePoissonRandom(double average)
double IntegratedGaussian(double x, double average, double std_dev)
double cot(double x)
cotangent function:
double StandardNormal(double x)
double Laue(const double x, size_t N)
Real Laue function: .