230 likes | 636 Views
Monte Carlo Methods. “Monte Carlo”?. Any problem-solving technique that uses random numbers is called a Monte Carlo method, used in: Games Simulations Many scientific applications Named after the famous country that enshrines games of chance for the wealthy
E N D
“Monte Carlo”? • Any problem-solving technique that uses random numbers is called a Monte Carlo method, used in: • Games • Simulations • Many scientific applications • Named after the famous country that enshrines games of chance for the wealthy • Can be used to adequately approximate the solution of difficult problems
Random Numbers • The key to Monte Carlo methods is a good random number generator • The ones that come in standard libraries aren’t all that good • There are statistical tests to evaluate random number generators • For uniformity • Are they sufficiently “spread out” (coverage) • For randomness • Do they avoid gratuitous runs of repetitions or other patterns? • It is difficult to achieve both simultaneously
Properties of RNGs • Deterministic • They aren’t really “random” • After all, we use formulas! • We call the numbers produced, “pseudo-random” • Reproducible • You should be able to get the same sequence of pseudo-random numbers on request • This is important for comparing experiments • Periodic • You get the next number in the sequence by applying a formula to the last one • Eventually, the sequence repeats
Uniform Generators • Generate a nicely spread-out sequence of numbers on some interval (usually (0, m)) • e.g., std::rand( ) evenly covers (0, RAND_MAX) • As opposed to Normal, Poisson or other distributions • If you use more than RAND_MAX calls to rand, you’ll start repeating the sequence • RAND_MAX = 32767 is unacceptable • It may even start repeating sooner • We want a large period for Monte Carlo methods
Linear Congruential Generators • Of the form: • The constants a, c, and m must be chosen carefully • The period is <= m, but we want to maximize it • There is an entire body of literature based on number theory for this • Some generators combine LCGs with other kinds
A Quick and Dirty RNG • Very fast • And pretty doggone good! • Period is not as large as others, though(?) • See qadrng.h
UNI • A uniform RNG from the 80s • In file uni.h, uni.cpp • Uses a lagged Fibonacci approach • Uses different samples from a LCG with a=1, c = -7654321, m = 224 • xn+1 = xn-17 – xn-5 • Must call ustart( ) to seed
The Mersenne Twister • Has a very large period • 219937-1 (!!!) • Written by Makoto Matsumoto • http://www.math.sci.hiroshima-u.ac.jp/~m-mat/eindex.html • Uses Mersenne primes and other tricks as a modification to a linear congruential method • We won’t look any more into the theory • We’ll just use it!
Using the Mersenne Twister • In file mersenne.c • Pass a long to init_genrand( ) to seed • Can use std::time( ) to get a random seed • Call genrand_int32( ) for numbers in the interval [0, 232) • Call genrand_real3( ) for numbers in the interval (0, 1) • You can use math to transform to other intervals • Don’t forget to include a prototype for the functions you call
Interval mapping formulas • Most RNGs give reals in the range (0,1) or integers in the range (0, m) • You can map to and from these ranges with simple algebraic transformations • Well, they’re simple to me
Open vs. Closed intervals • Closed intervals are often used for integers • Not for reals, since the endpoints might not be representable • The formulas on the previous slide don’t work! • i.e., when converting from open (real) to closed (integer) intervals • Example: • (0, 1) => integers on [10, 20] • Since 1 is never reached, 20 won’t be with the formulas on the previous slide • Instead: Use int(11*x) + 10
Mapping from Open (real) to Closed (integer) Intervals • Start with w in (0,1) • Transform it if necessary: • To map w to [k,n]: • Multiply w by n-k+1, • Truncate, • Add k:
Monte Carlo MethodsExample: Computing Pi • Monte Carlo methods use random numbers to solve numeric problems • For example, generate uniform random x-y points in the unit square • Generate x and y independently in the range [0,1] • The number of points should be >= 10,000 • Determine if x2 + y2 < 1 or not • The ratio of points inside the circle = π/4 • See pi.cpp • pi = 3.141592;
Monte Carlo Integration • Uses RNGs to approximate areas under curves, surfaces • Two approaches • Average function value • Throwing darts (what we did with pi)
Monte Carlo IntegrationAverage Function Value Approach • Approximate the average function value on the interval (a,b) • Just take the average of a large random sample of f(xi) (watch for overflow!) • Multiply this by (b-a) • The result ≈ area: • See average.cpp
Monte Carlo IntegrationDart-Throwing Approach • Obtain many random points, (xi,yi) in region of interest • The area of the region is known, i.e., a rectangle with width (b-a) containing the curve • Count the number of yi that are less than f(xi) • The percentage of “hits” (count / n) is the proportion of your region that represents an approximation of the sought-for area below the curve f(x) • See darts.cpp
When to use Monte Carlo • Not for simple integrals like these • They’re handy for multiple integrals • Or for calculating volumes defined by constraints • See the homework!