https://mooseframework.inl.gov
Gamma.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "Gamma.h"
11 #include "math.h"
12 #include "libmesh/utility.h"
13 
14 registerMooseObject("StochasticToolsApp", Gamma);
15 
18 {
20  params.addClassDescription("Gamma distribution");
21  params.addRequiredRangeCheckedParam<Real>("shape", "shape > 0", "Shape parameter (k or alpha).");
22  params.addRangeCheckedParam<Real>(
23  "scale", 1.0, "scale > 0", "Scale parameter (theta or 1/beta).");
24  return params;
25 }
26 
27 Gamma::Gamma(const InputParameters & parameters)
28  : Distribution(parameters), _alpha(getParam<Real>("shape")), _theta(getParam<Real>("scale"))
29 {
30 }
31 
32 Real
33 Gamma::pdf(const Real & x, const Real & alpha, const Real & beta)
34 {
35  if (x <= 0.0)
36  return 0.0;
37  else
38  return std::pow(beta, alpha) * std::pow(x, alpha - 1.0) * std::exp(-beta * x) /
39  std::tgamma(alpha);
40 }
41 
42 Real
43 Gamma::cdf(const Real & x, const Real & alpha, const Real & beta)
44 {
45  if (x <= 0.0)
46  return 0.0;
47  else
48  return incompleteGamma(alpha, beta * x);
49 }
50 
51 Real
52 Gamma::quantile(const Real & p, const Real & alpha, const Real & beta)
53 {
54  return incompleteGammaInv(alpha, p) / beta;
55 }
56 
57 Real
58 Gamma::pdf(const Real & x) const
59 {
60  return pdf(x, _alpha, 1.0 / _theta);
61 }
62 
63 Real
64 Gamma::cdf(const Real & x) const
65 {
66  return cdf(x, _alpha, 1.0 / _theta);
67 }
68 
69 Real
70 Gamma::quantile(const Real & p) const
71 {
72  return quantile(p, _alpha, 1.0 / _theta);
73 }
74 
75 Real
76 Gamma::incompleteGamma(const Real & a, const Real & x)
77 {
78  const Real tol = 1e-14;
79  const unsigned int max_iter = 1e6;
80  const Real coef = std::pow(x, a) * std::exp(-x) / std::tgamma(a + 1.0);
81  Real cn = 1.0;
82  Real an = a;
83  Real val = 1.0;
84  for (unsigned int i = 0; i < max_iter; ++i)
85  {
86  an += 1.0;
87  cn *= x / an;
88  val += cn;
89  if (std::abs(cn / val) < tol)
90  return coef * val;
91  }
92 
93  mooseAssert(false, "Could not compute incomplete gamma function.");
94  return coef * val;
95 }
96 
97 Real
98 Gamma::incompleteGammaInv(const Real & a, const Real & p)
99 {
100  Real x = a > 1.0 ? a : std::pow(p * std::tgamma(a + 1.0), 1.0 / a);
101  const Real scale = std::tgamma(a);
102  const Real tol = 1e-14;
103  const unsigned int max_iter = 1e6;
104  Real f;
105  Real df;
106  for (unsigned int i = 0; i < max_iter; ++i)
107  {
108  f = incompleteGamma(a, x) - p;
109  if (std::abs(f) < tol)
110  return x;
111  df = std::pow(x, a - 1.0) * std::exp(-x) / scale;
112  x -= f / df;
113  }
114 
115  mooseAssert(false, "Could not find inverse of incomplete gamma function.");
116  return x;
117 }
Gamma(const InputParameters &parameters)
Definition: Gamma.C:27
static InputParameters validParams()
Definition: Gamma.C:17
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
A class used to generate a Gamma distribution.
Definition: Gamma.h:17
virtual Real cdf(const Real &x) const override
Definition: Gamma.C:64
const Real & _alpha
Shape.
Definition: Gamma.h:47
void scale(MeshBase &mesh, const Real xs, const Real ys=0., const Real zs=0.)
const double tol
virtual Real pdf(const Real &x) const override
Definition: Gamma.C:58
registerMooseObject("StochasticToolsApp", Gamma)
const std::vector< double > x
Real f(Real x)
Test function for Brents method.
const Real & _theta
Scaling.
Definition: Gamma.h:49
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real quantile(const Real &p) const override
Definition: Gamma.C:70
static const std::string alpha
Definition: NS.h:134
static InputParameters validParams()
void addClassDescription(const std::string &doc_string)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
static Real incompleteGammaInv(const Real &a, const Real &p)
Inverse of lower incomplete gamma function.
Definition: Gamma.C:98
static Real incompleteGamma(const Real &a, const Real &x)
Lower incomplete gamma function.
Definition: Gamma.C:76
MooseUnits pow(const MooseUnits &, int)