SOFTSUSY
4.1
|
numerical routines - differential equation solver, differentiator and function minimiser for instance More...
#include "utils.h"
#include "mycomplex.h"
#include "def.h"
#include <iostream>
#include <cmath>
#include <cfloat>
#include <limits>
#include "linalg.h"
#include "dilogwrap.h"
Go to the source code of this file.
Macros | |
#define | SIGN(a, b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) |
sign of inputs | |
Functions | |
int | cubicRoots (double a, double b, double c, double d, DoubleVector &ans) |
int | cubicRootsInside (double a, double b, double c, DoubleVector &ans) |
cubic roots for x^3 + a*x + b*x^2 + c*x^4 = 0 More... | |
double | dgauss (double(*f)(double x), double a, double b, double eps) |
double | dgauss (double(*f)(double x, const DoubleVector &v), const DoubleVector &v, double a, double b, double eps) |
double | accurateSqrt1Plusx (double x) |
calculate root(1+x), where x<<1 accurately More... | |
void | rungeKuttaStep (const DoubleVector &y, const DoubleVector &dydx, double x, double h, DoubleVector &yout, DoubleVector &yerr, DoubleVector(*derivs)(double, const DoubleVector &)) |
int | odeStepper (DoubleVector &y, const DoubleVector &dydx, double *x, double htry, double eps, DoubleVector &yscal, double *hdid, double *hnext, DoubleVector(*derivs)(double, const DoubleVector &)) |
organises the variable step-size for Runge-Kutta evolution | |
double | lnLPoisson (unsigned k, double lambda) |
double | LPoisson (unsigned k, double lambda) |
int | integrateOdes (DoubleVector &ystart, double x1, double x2, double eps, double h1, double hmin, DoubleVector(*derivs)(double, const DoubleVector &), int(*rkqs)(DoubleVector &y, const DoubleVector &dydx, double *x, double htry, double eps, DoubleVector &yscal, double *hdid, double *hnext, DoubleVector(*derivs)(double, const DoubleVector &))) |
Organises integration of 1st order system of ODEs. | |
double | calcDerivative (double(*func)(double), double x, double h, double *err) |
double | calcDerivative (double(*func)(double, void *), double x, double h, double *err, void *params=NULL) |
double | findMinimum (double ax, double bx, double cx, double(*f)(double), double tol, double &xmin) |
void | shft2 (double &a, double &b, double &c) |
void | shft3 (double &a, double &b, double &c, double &d) |
a=b, b=c and c=d | |
double | integrandThreshbn (double x) |
For calculation of PV functions. | |
double | bIntegral (int n, double p, double m1, double m2, double mt) |
Returns real part of b function, less accurate than analytic expressions. | |
DoubleVector | dd (double x, const DoubleVector &y) |
double | b0 (double p, double m1, double m2, double q) |
Passarino-Veltman function definition: real part. More... | |
double | b1 (double p, double m1, double m2, double q) |
Passarino-Veltman function definition: real part. More... | |
double | b22 (double p, double m1, double m2, double q) |
Passarino-Veltman function definition: real part. More... | |
double | c0 (double m1, double m2, double m3) |
Passarino-Veltman function definition: real part. | |
double | d27 (double m1, double m2, double m3, double m4) |
Passarino-Veltman function definition: real part. | |
double | d0 (double m1, double m2, double m3, double m4) |
Passarino-Veltman function definition: real part. | |
double | a0 (double m, double q) |
inlined PV functions: real part | |
double | ffn (double p, double m1, double m2, double q) |
inlined PV functions: real part | |
double | gfn (double p, double m1, double m2, double q) |
inlined PV functions: real part | |
double | hfn (double p, double m1, double m2, double q) |
inlined PV functions: real part | |
double | b22bar (double p, double m1, double m2, double q) |
inlined PV functions: real part | |
Complex | b0c (double p, double m1, double m2, double q) |
Complex | b1c (double p, double m1, double m2, double q) |
Passarino-Veltman function definition: complex answer. More... | |
Complex | b22c (double p, double m1, double m2, double q) |
Passarino-Veltman function definition: complex answer. More... | |
Complex | ffnc (double p, double m1, double m2, double q) |
Complex | gfnc (double p, double m1, double m2, double q) |
inlined PV functions: complex answer | |
Complex | hfnc (double p, double m1, double m2, double q) |
inlined PV functions: complex answer | |
Complex | b22barc (double p, double m1, double m2, double q) |
inlined PV functions: complex answer | |
double | fB (const Complex &x) |
Complex | fBc (const Complex &x) |
double | dilogarg (double t) |
double | dilog (double x) |
double | integrandThreshbnr (double x) |
Complex | fnfn (double x) |
double | gasdev (long &idum) |
double | truncGaussWidthHalf (long &idum) |
double | ran1 (long &idum) |
double | cauchyRan (long &idum) |
int | bin (double data, double start, double end, int numBins) |
double | logOfSum (double a, double b) |
Adds logs of two numbers in a more careful way that avoids underflow. | |
DoubleVector | getRandomDirection (int n, int &numChanged, long &idum) |
returns a random direction: total number of dimensions=n | |
double | calcCL (double cl, const DoubleVector &l) |
double | calc1dFraction (double y, const DoubleVector &l) |
double | fps (double z) |
double | fs (double z) |
double | ffbar (double z) |
Complex | dilog (const Complex &x) |
std::complex< long double > | dilogcl (const std::complex< long double > &) |
Complex dilogarithm \(\mathrm{Li}_2(z)\). More... | |
double | trapzd (double(*func)(double), double a, double b, int n, double tol=1.0e-3) |
Trapezoidal function integration to accuracy tol. | |
double | qtrap (double(*func)(double), double a, double b, double tol) |
Driver for integration. | |
double | midpnt (double(*func)(double), double a, double b, int n) |
Mid point function integration. | |
double | qromb (double(*func)(double), double a, double b, double EPS) |
double | qromb2 (double(*func)(double), double a, double b, double EPS) |
Identical copy to facilitate double integral. | |
double | sumOfExp (double a, double b) |
void | polint (const DoubleVector &xa, const DoubleVector &ya, double x, double &y, double &dy) |
DoubleMatrix | display3x3RealMixing (double theta12, double theta13, double theta23, double d) |
void | getAngles (const DoubleMatrix &v, double &t12, double &t13, double &t23, double &d) |
Given a matrix v, determines which angles gave it. | |
bool | midPtStep (DoubleVector &xi, DoubleVector(*derivs)(double t, const DoubleVector &v), double tInitial, double tStep) |
bool | integrateReversibly (DoubleVector &xi, DoubleVector(*derivs)(double t, const DoubleVector &v), double tInitial, double tFinal, int numSteps) |
double | fin (double mm1, double mm2) |
useful for 2-loop mb/mt corrections | |
double | den (double a, int b) |
double | log1minusx (double x) |
This function DOESNT WORK YET!!! More... | |
double | zriddr (double(*func)(double), double x1, double x2, double xacc) |
void | fdjac (int n, DoubleVector x, const DoubleVector &fvec, DoubleMatrix &df, int(*vecfunc)(const DoubleVector &, void *, DoubleVector &), void *params=NULL) |
bool | lnsrch (const DoubleVector &xold, double fold, const DoubleVector &g, DoubleVector &p, DoubleVector &x, double &f, double stpmax, int(*vecfunc)(const DoubleVector &, void *, DoubleVector &), DoubleVector &fvec, void *params=NULL) |
int * | ivector (long nl, long nh) |
void | free_ivector (int *v, long nl, long nh) |
void | lubksb (const DoubleMatrix &a, int n, int *indx, DoubleVector &b) |
Get rid of int n. | |
bool | newt (DoubleVector &x, int(*vecfunc)(const DoubleVector &, void *, DoubleVector &), void *params=NULL) |
More work can be done on this: get rid of int n and in subfunctions too. More... | |
void | load (float x, const DoubleVector &v, DoubleVector &y) |
calculates the n-vector y, given freely specifiable values v(1..n2) at x1 | |
void | score (float x, const DoubleVector &y, DoubleVector &f) |
void | qrdcmp (DoubleMatrix &a, int n, DoubleVector &c, DoubleVector &d, int &sing) |
void | qrupdt (DoubleMatrix &r, DoubleMatrix &qt, int n, DoubleVector &u, DoubleVector &v) |
void | rotate (DoubleMatrix &r, DoubleMatrix &qt, int n, int i, float a, float b) |
void | rsolv (const DoubleMatrix &a, int n, const DoubleVector &d, DoubleVector &b) |
double | ccbSqrt (double f) |
returns the square root of the absolute value of the argument | |
double | signedSqrt (double f) |
returns the square root of the absolute value of the argument | |
double | signedSqr (double f) |
returns f * f * sign(f) | |
double | kinFn (double m1, double m2, double m3) |
double | lambda (double a, double b, double c) |
numerical routines - differential equation solver, differentiator and function minimiser for instance
double accurateSqrt1Plusx | ( | double | x | ) |
calculate root(1+x), where x<<1 accurately
calculate approximate number of terms we're going to need to get 16 digit precision
double b0 | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Passarino-Veltman function definition: real part.
Avoids IR infinities
Try to increase the accuracy of s
Decides level at which one switches to p=0 limit of calculations
p is not 0
alternative form: should be more accurate
Complex b0c | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Avoids IR infinities
Try to increase the accuracy of s
Decides level at which one switches to p=0 limit of calculations
p is not 0
alternative form: should be more accurate
double b1 | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Passarino-Veltman function definition: real part.
Passarino-Veltman function definition: real part.
Decides level at which one switches to p=0 limit of calculations
< checked
Complex b1c | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Passarino-Veltman function definition: complex answer.
Passarino-Veltman function definition: complex answer.
Decides level at which one switches to p=0 limit of calculations
< checked
< checked
double b22 | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Passarino-Veltman function definition: real part.
Decides level at which one switches to p=0 limit of calculations
This zero p limit is good
Complex b22c | ( | double | p, |
double | m1, | ||
double | m2, | ||
double | q | ||
) |
Passarino-Veltman function definition: complex answer.
Decides level at which one switches to p=0 limit of calculations
This zero p limit is good
int bin | ( | double | data, |
double | start, | ||
double | end, | ||
int | numBins | ||
) |
Returns the number of a bin that the data is in: from 1 to numBins in the range (bins other than this range are also possible - you must deal with them outside the function...)
double calc1dFraction | ( | double | y, |
const DoubleVector & | l | ||
) |
given a normalised binned likelihood vector l, calculates the fraction of bins with likelihood less than or equal to y as a % of maximum: approximates area OUTSIDE confidence level y
double calcCL | ( | double | cl, |
const DoubleVector & | l | ||
) |
Calculates the vertical level of confidence level required to contain a fraction cl of area of the histogrammed binned likelihood l. If err is true, a satisfactory answer could not be found for some reason.
double calcDerivative | ( | double(*)(double) | func, |
double | x, | ||
double | h, | ||
double * | err | ||
) |
func is user-supplied, h is an estimate of what step-size to start with and err returns error flags
double calcDerivative | ( | double(*)(double, void *) | func, |
double | x, | ||
double | h, | ||
double * | err, | ||
void * | params = NULL |
||
) |
DH: overloaded version allowing to pass additional parameters to the function
double cauchyRan | ( | long & | idum | ) |
Cauchy distribution ie 1 / [ pi gamma (1 + x^2/gamma^2) ]. For a width, you must multiply the x coming out by the width.
int cubicRoots | ( | double | a, |
double | b, | ||
double | c, | ||
double | d, | ||
DoubleVector & | ans | ||
) |
gives DoubleVector ans with all n real roots (returned) in increasing absolute order for: a x^3 + b x^2 + c x + d=0. Needs an upgrade to include complex roots
order the roots in increasing absolute order
It's a linear equation
it's a quadratic really
int cubicRootsInside | ( | double | a, |
double | b, | ||
double | c, | ||
DoubleVector & | ans | ||
) |
cubic roots for x^3 + a*x + b*x^2 + c*x^4 = 0
Three real roots
only one real root
double dgauss | ( | double(*)(double x) | f, |
double | a, | ||
double | b, | ||
double | eps | ||
) |
adaptive Gaussian one dimensional integration of f(x) between a and b to precision eps
set the initial values if they are uninitialised
double dgauss | ( | double(*)(double x, const DoubleVector &v) | f, |
const DoubleVector & | v, | ||
double | a, | ||
double | b, | ||
double | eps | ||
) |
adaptive Gaussian one dimensional integration of f(x) between a and b to precision eps with user - given parameters in DoubleVector & v
set the initial values if they are uninitialised
std::complex<long double> dilogcl | ( | const std::complex< long double > & | z | ) |
Complex dilogarithm \(\mathrm{Li}_2(z)\).
z | complex argument |
DoubleMatrix display3x3RealMixing | ( | double | theta12, |
double | theta13, | ||
double | theta23, | ||
double | d | ||
) |
Returns a 3 by 3 real mixing matrix. Input angles are standard CKM parameterisation. If the phase d is not zero, the result is only an approximation to the full complex matrix: see SOFTSUSY manual for details.
phase factor e^i delta: we'll set it to + or - 1 depending on the sign of s13
double fB | ( | const Complex & | x | ) |
First, special cases at problematic points
void fdjac | ( | int | n, |
DoubleVector | x, | ||
const DoubleVector & | fvec, | ||
DoubleMatrix & | df, | ||
int(*)(const DoubleVector &, void *, DoubleVector &) | vecfunc, | ||
void * | params = NULL |
||
) |
Forward difference approximation to Jacobian matrix. On input, x is the point to be evaluated, fvec is the vector of function values at the point, and vecfunc(n, x, f) is the Jacobian array
|
inline |
Passarino-Veltman function definition: complex answer inlined PV functions: complex answer
double findMinimum | ( | double | ax, |
double | bx, | ||
double | cx, | ||
double(*)(double) | f, | ||
double | tol, | ||
double & | xmin | ||
) |
f is user-defined function, minimum value returned in xmin. Based on a golden section search
double fps | ( | double | z | ) |
These three functions are for the calculation of 2-loop log pieces of g-2 of the muon
answer should always be real
double gasdev | ( | long & | idum | ) |
Gaussian deviated random number, mean 0 variance 1. Don't re-set idum once you've initially set it. Initialise with a NEGATIVE integer
bool integrateReversibly | ( | DoubleVector & | xi, |
DoubleVector(*)(double t, const DoubleVector &v) | derivs, | ||
double | tInitial, | ||
double | tFinal, | ||
int | numSteps | ||
) |
Reversible integrate with numSteps steps between tInitial and tFinal. Returns true if there's an error
Do a fixed number of steps of approximately reversible integration: hoping it will help convergence in difficult cases. It is really slow though.
double kinFn | ( | double | m1, |
double | m2, | ||
double | m3 | ||
) |
Kinematic mass function - differs from the pure one in PDG by a root and factor \( f(m_1,m_2,m_3)=\frac{\sqrt{(m_1^2-(m_2^2+m_3^2))(m_1^2-(m_2^2-m_3^2))}}{2 m_1}\).
double lnLPoisson | ( | unsigned | k, |
double | lambda | ||
) |
Calculates log likelihood of a Poisson with k observed events, expecting lambda>0.
bool lnsrch | ( | const DoubleVector & | xold, |
double | fold, | ||
const DoubleVector & | g, | ||
DoubleVector & | p, | ||
DoubleVector & | x, | ||
double & | f, | ||
double | stpmax, | ||
int(*)(const DoubleVector &, void *, DoubleVector &) | vecfunc, | ||
DoubleVector & | fvec, | ||
void * | params = NULL |
||
) |
These are experimental things for trying the shooting method - returns F.F/2 evaluated at x. Boolean value on return is error flag
double log1minusx | ( | double | x | ) |
This function DOESNT WORK YET!!!
1/a^b
Find largest power that we need from the expansion
double LPoisson | ( | unsigned | k, |
double | lambda | ||
) |
Calculates likelihood of a Poisson with k observed events, expecting lambda>0.
bool midPtStep | ( | DoubleVector & | xi, |
DoubleVector(*)(double t, const DoubleVector &v) | derivs, | ||
double | tInitial, | ||
double | tStep | ||
) |
Evolves the dependent variables xi by one reversible mid-point step of length tStep. Returns true if there is an error.
initial guess
difference between iterations
bool newt | ( | DoubleVector & | x, |
int(*)(const DoubleVector &, void *, DoubleVector &) | vecfunc, | ||
void * | params = NULL |
||
) |
More work can be done on this: get rid of int n and in subfunctions too.
Multi-dimensional globally convergent multi-dimensional root solver for n variables. adjusts x so that f(x)=0, where f is the last function provided by vecfunc, given vector input x. If false on output, there is no error. If returns 1, a local minimum or saddle-point has been found (df/dx=0). The length of x should be equal to the number of parameters to vary AND the number of constraints ie the length of the vector in vecfunc.
< max iterations
< convergence on function values
< spurious convergence to min of fmin
< maximum dx convergence criterion
< maximum step length allowed in line searches
Check points aren't getting too close together
void polint | ( | const DoubleVector & | xa, |
const DoubleVector & | ya, | ||
double | x, | ||
double & | y, | ||
double & | dy | ||
) |
Returns a value of the polynomial (y) and an error estimate (dy), given a bunch of points (xa) and their y values (ya).
void qrdcmp | ( | DoubleMatrix & | a, |
int | n, | ||
DoubleVector & | c, | ||
DoubleVector & | d, | ||
int & | sing | ||
) |
Function that integrates ODEs: to be passed to Newton's method for solving the 2-boundary value problem. Given v[1..n2], it sets all the boundary conditions at the initial scale and calculates f[1..n2] - a score for how well the boundary condition at the high scale is satisfied. Then you should be able to find the solutions for the unknown numbers.
QR decomposition of the matrix a. A = Q.R. Upper triangular matrix R is returned in upper triangle of a, except for diagonal elements which are returned in d. Orthog matrix Q is given as a product of n-1 Houselholder matrices $Q_1 \ldots Q_{n-1}$ where $Q_j=1-u_j \otimes u_j/c_j$. sing returns true (1) if singularity is encountered (but decomposition is still completed) otherwise false (0).
double qromb | ( | double(*)(double) | func, |
double | a, | ||
double | b, | ||
double | EPS | ||
) |
Integrate a function *func which is analytic to precision EPS between a and b
double ran1 | ( | long & | idum | ) |
Normally distributed random number between 0 and 1. Don't re-set idum once you've initially set it. Initialise with a NEGATIVE integer
void rotate | ( | DoubleMatrix & | r, |
DoubleMatrix & | qt, | ||
int | n, | ||
int | i, | ||
float | a, | ||
float | b | ||
) |
Given r and qt, carry out a Jacobi rotation on rows i and i+1 of each matrix. a and b are parameters of the rotation: $\cos \theta=a/\sqrt{a^2+b^2}, \sin \theta = b / \sqrt{a^2 + b^2}$.
void rungeKuttaStep | ( | const DoubleVector & | y, |
const DoubleVector & | dydx, | ||
double | x, | ||
double | h, | ||
DoubleVector & | yout, | ||
DoubleVector & | yerr, | ||
DoubleVector(*)(double, const DoubleVector &) | derivs | ||
) |
A single step of Runge Kutta (5th order), input: y and dydx (derivative of y), x is independent variable. yout is value after step. derivs is a user-supplied function
void score | ( | float | x, |
const DoubleVector & | y, | ||
DoubleVector & | f | ||
) |
Gives a discrepancy vector f[1..n2] from ending boundary conditions at endpoint x2 given values for y there
void shft2 | ( | double & | a, |
double & | b, | ||
double & | c | ||
) |
a=b and b=c
double sumOfExp | ( | double | a, |
double | b | ||
) |
This sums two exponentials nof the arguments in a way that tries to avoid underflows.
this underflow determines whether it's actually worth adding the two figures... any more than 15 digits and it's just going to be the maximum one.
double truncGaussWidthHalf | ( | long & | idum | ) |
Gives 1/2 chance of being between 0 and 1 (flat), otherwise, a decreasing Gaussian
double zriddr | ( | double(*)(double) | func, |
double | x1, | ||
double | x2, | ||
double | xacc | ||
) |
returns a root of function func between x1 and x2 to accuracy xacc (x1 and x2 MUST bracket a root)