Author(s): F. James | Library: MATHLIB |
Submitter: | Submitted: 22.02.1996 |
Language: Fortran | Revised: |
FUNLUX generates random numbers distributed according to any (one-dimensional) distribution f(x). The distribution is supplied by the user in the form of a FUNCTION subprogram. If the distribution is known as a histogram only, HISRAN (V150) should be used instead.
Structure:
SUBROUTINE subprograms
User Entry Names: FUNLUX, FUNLXP
Internal Entry Names: FUNPCT, FUNLZ
Files Referenced: Printer
External References: RADAPT, RANLUX,
user-supplied FUNCTION subprogram
COMMON Block Names and Lengths: /FUNINT/ 1
Usage:
CALL FUNLXP(F,FSPACE,XLOW,XHIGH) | (once for each function) | ||
CALL FUNLUX(FSPACE,XRAN,LEN) | (for each vector of random numbers) |
Method:
In FUNLXP, the 100 percentiles of the integral of are calculated using a combination of trapezoidal and Gaussian integration to a rather high accuracy, which is printed out by FUNLXP. Then both the left-hand and right-hand 2 percentiles are expanded to 50 percentiles each in order to cater for functions with long tails. If the desired accuracy is not obtained, a warning is printed in addition.
Subroutine FUNLUX finds the desired random number by calling RANLUX (V115) and doing a 4-point interpolation on FSPACE to transform the uniform random number to the distribution specified. This method produces quite accurately distributed numbers even when the function F is badly skew or spiked as long as the width of a spike is not less than 1/1000 of the total range.
Error handling:
An error message is printed
Notes:
Some additional information which may be of use is contained in
COMMON / FUNINT/ FINTAfter a call to FUNLXP, FINT contains the integral of F from XLOW to XHIGH.
After a call to FUNLUX, FINT contains the integral of
F from XLOW to XRAN(LEN), divided by the total integral
to XHIGH (i.e., it will be a number uniformly distributed
between zero and one).