#include <ModelMath.h>
Public Member Functions | |
~clModelMath () | |
Static Public Member Functions | |
static float | CalcPointValue (float fX, float fSlope, float fIntercept=0.0) |
Returns the value of a linear function. | |
static float | GetRand () |
Random number generator. | |
static float | CalculateBasalArea (float fDbh) |
Calculates basal area. | |
static float | Round (float fNumber, int iNumDigits) |
Rounds a number to a specified number of digits. | |
static int | RandomRound (float fNumber) |
Uses a random number to decide whether to round a number up or down to the next integer. | |
static float | CalculateWeibullFunction (float fDispersal, float fTheta, float fDistance) |
Calculates the exponential of the Weibull probability distribution function at a particular point. | |
static float | CalculateLognormalFunction (float fX0, float fXb, float fDistance) |
Calculates the exponential of the Lognormal probability distribution function at a particular point. | |
static int | PoissonRandomDraw (float fLambda) |
Returns a random Poisson-distributed number. | |
static float | LognormalRandomDraw (float fMean, float fStdDev) |
Returns a random lognormally-distributed number. | |
static float | NormalRandomDraw (float fStdDev) |
Returns a random normally-distributed number with mean zero and standard deviation sigma. | |
static int | NegBinomialRandomDraw (float fMean, float fClumping) |
Returns a random negative binomially-distributed number. | |
static float | AddBarkToDBH (float fDIB, float fA, float fB, float fC) |
Adds bark to a tree diameter. | |
static float | InverseGaussianRandomDraw (float fMu, float fLambda) |
Returns a random number over the inverse Gaussian distribution. | |
static void | SetRandomSeed (long iSeed) |
Sets the random seed. | |
Static Public Attributes | |
static gsl_rng * | randgen |
Random number generator. |
This library provides some model-specific math functions.
The random number generator is very important. To make sure that no one can mess with the seed, I put the seed and the seed setting function in the private portion. Then clSimManager is a friend class and is the only one that can change the seed.
This used to be a library of C-style functions. But it turns out that the random number generator doesn't work right unless the seed is a class member.
I have made some wrappers for GSL, for back-compatibility from before GSL was used. But I have also opened up the random number generator so that other classes can use the GSL functions directly if they wish.
Copyright 2005 Charles D. Canham.
clModelMath::~clModelMath | ( | ) | [inline] |
static float clModelMath::CalcPointValue | ( | float | fX, | |
float | fSlope, | |||
float | fIntercept = 0.0 | |||
) | [static] |
Returns the value of a linear function.
fX | Point for which to calculate the function. | |
fSlope | Slope of the function. | |
fIntercept | Intercept of the function. |
static float clModelMath::GetRand | ( | ) | [static] |
Random number generator.
This just wraps a call to GSL's uniform random number generator.
static float clModelMath::CalculateBasalArea | ( | float | fDbh | ) | [static] |
Calculates basal area.
fDbh | DBH in cm for which to calculate basal area. |
modelErr | if DBH is less than or equal to 0. |
static float clModelMath::Round | ( | float | fNumber, | |
int | iNumDigits | |||
) | [static] |
Rounds a number to a specified number of digits.
For this function, credit www.codeproject.com.
fNumber | Number to round. | |
iNumDigits | Number of digits to round the number to. If 0, the number is rounded to the nearest integer. |
static int clModelMath::RandomRound | ( | float | fNumber | ) | [static] |
Uses a random number to decide whether to round a number up or down to the next integer.
The number is split into integer and fractional parts. A random number is compared to the fractional part; if it is less than or equal to it, one is added to the integer part; otherwise the integer part is returned as-is.
fNumber | Number to round. |
static float clModelMath::CalculateWeibullFunction | ( | float | fDispersal, | |
float | fTheta, | |||
float | fDistance | |||
) | [static] |
Calculates the exponential of the Weibull probability distribution function at a particular point.
fDispersal | Value of dispersal variable | |
fTheta | Value of theta variable | |
fDistance | Distance, in meters, at which to calculate the function |
static float clModelMath::CalculateLognormalFunction | ( | float | fX0, | |
float | fXb, | |||
float | fDistance | |||
) | [static] |
Calculates the exponential of the Lognormal probability distribution function at a particular point.
fX0 | Value of X0 variable | |
fXb | Value of Xb variable | |
fDistance | Distance, in meters, at which to calculate the function |
modelErr | if fX0 or fDistance are not greater than 0, or if fXb is zero. |
static int clModelMath::PoissonRandomDraw | ( | float | fLambda | ) | [static] |
Returns a random Poisson-distributed number.
This just wraps the appropriate GSL function.
fLambda | Lambda (mean) of the Poisson function. |
static float clModelMath::LognormalRandomDraw | ( | float | fMean, | |
float | fStdDev | |||
) | [static] |
Returns a random lognormally-distributed number.
The lognormal distribution has the form
p(x) dx = 1/(x * sqrt(2 pi sigma2)) exp(-(ln(x) - zeta)2/2 sigma2) dx
for x > 0. Lognormal random numbers are the exponentials of gaussian random numbers.
This just wraps the appropriate GSL function.
fMean | Mean of the distribution, or zeta in the above formula. | |
fStdDev | Standard deviation of the distribution, or sigma in the above formula. |
static float clModelMath::NormalRandomDraw | ( | float | fStdDev | ) | [static] |
Returns a random normally-distributed number with mean zero and standard deviation sigma.
The probability distribution for normal random variates is, p(x) dx = {1 / sqrt{2 π σ2}} exp (-x2 / 2σ2) dx for x in the range -infty to +infty. Use the transformation z = mu + x on the numbers returned to obtain a normal distribution with mean mu.
This function just wraps the appropriate GSL function.
fStdDev | Standard deviation. |
static int clModelMath::NegBinomialRandomDraw | ( | float | fMean, | |
float | fClumping | |||
) | [static] |
Returns a random negative binomially-distributed number.
The form of the distribution is from Equation 3.103 from Hilborn and Mangel (The Ecological Detective). Charlie Canham created this code.
fMean | Function mean. | |
fClumping | Clumping parameter. |
static float clModelMath::AddBarkToDBH | ( | float | fDIB, | |
float | fA, | |||
float | fB, | |||
float | fC | |||
) | [static] |
Adds bark to a tree diameter.
The equation is:
fDIB | Diameter inside bark at 1.35 meters' height, in cm | |
fA | "a" term in equation above | |
fB | "b" term in equation above | |
fC | "c" term in equation above |
modelErr | if DIB is less than or equal to 0, or large enough to create float overflow. |
static float clModelMath::InverseGaussianRandomDraw | ( | float | fMu, | |
float | fLambda | |||
) | [static] |
Returns a random number over the inverse Gaussian distribution.
I got this code from http://www.cbr.washington.edu/papers/zabel/index.html, which is the dissertation "Spatial and Temporal Models of Migrating Juvenile Salmon with Applications", by Richard W. Zabel, University of Washington.
The inverse Gaussian PDF is: f(x; μ, λ) = [λ /(2πx3)]^(1/2) * exp[(-λ(x-μ)2 )/ (2 μ2x)]
fMu,: | mu. | |
fLambda,: | lambda. |
static void clModelMath::SetRandomSeed | ( | long | iSeed | ) | [inline, static] |
Sets the random seed.
This should always be a negative number.
iSeed | Seed to set. |
gsl_rng* clModelMath::randgen [static] |
Random number generator.
Currently set to the Mersenne Twister algorithm.