https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
14registerMooseObject("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
27Gamma::Gamma(const InputParameters & parameters)
28 : Distribution(parameters), _alpha(getParam<Real>("shape")), _theta(getParam<Real>("scale"))
29{
30}
31
32Real
33Gamma::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
42Real
43Gamma::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
51Real
52Gamma::quantile(const Real & p, const Real & alpha, const Real & beta)
53{
54 return incompleteGammaInv(alpha, p) / beta;
55}
56
57Real
58Gamma::pdf(const Real & x) const
59{
60 return pdf(x, _alpha, 1.0 / _theta);
61}
62
63Real
64Gamma::cdf(const Real & x) const
65{
66 return cdf(x, _alpha, 1.0 / _theta);
67}
68
69Real
70Gamma::quantile(const Real & p) const
71{
72 return quantile(p, _alpha, 1.0 / _theta);
73}
74
75Real
76Gamma::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
97Real
98Gamma::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}
Real f(Real x)
Test function for Brents method.
const double tol
const std::vector< double > x
registerMooseObject("StochasticToolsApp", Gamma)
const Real p
Real scale
static InputParameters validParams()
A class used to generate a Gamma distribution.
Definition Gamma.h:18
static Real incompleteGammaInv(const Real &a, const Real &p)
Inverse of lower incomplete gamma function.
Definition Gamma.C:98
virtual Real pdf(const Real &x) const override
Definition Gamma.C:58
static Real incompleteGamma(const Real &a, const Real &x)
Lower incomplete gamma function.
Definition Gamma.C:76
virtual Real quantile(const Real &p) const override
Definition Gamma.C:70
const Real & _alpha
Shape.
Definition Gamma.h:47
static InputParameters validParams()
Definition Gamma.C:17
virtual Real cdf(const Real &x) const override
Definition Gamma.C:64
const Real & _theta
Scaling.
Definition Gamma.h:49
Gamma(const InputParameters &parameters)
Definition Gamma.C:27
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
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)