Uporaba metode Monte Carlo se omejuje na probleme, kjer imamo komplicirane robne pogoje in zahtevne funkcije, ki se ne dajo enostavno integrirati. Sama metoda je zelo enostavna vendar racunsko zelo potratna za zahtevano natancnost izracuna. Tako se za tak pristop k resevanju odlocamo le v skrajni sili, ko zelimo priblizno oceno in nimamo casa (znanje) za primernejse metode.
Oglejmo si primer resevanja povrsine kroga z radijem r = 1.
Analiticna resitev je seveda . Nas krog premera
d = 2 omejimo z najmanjsim pravokotnikom za katerega seveda znamo
izracunati povrsimo in v katerem se stoji krog;
torej
. Imejmo generator nakljucnih tock,
ki zagotavlja, da vsaka generirana tocka gotovo pade v pravokotnik.
Generator tako izbere recimo N tock . Za vsako izbrano
tocko pa lahko ugotovimo ali je tocka v notranjosti kroga ali
zunaj. Po razsipanju n tock smo tako ugotovili, da je sn tock
padlo znotraj kroga, ostale pa so padle zunaj kroga vendar se vedno
v kvadrat znanih dimenzij. Povrsino kroga laho tako brez poznavanja
stevila
ocenimo kot
Primer: Program je posejal 100000 tock v kvadrat in ugotovil, da jih je 78589 padlo v krog. Povrsina kroga je tako
Evidentno je, da z vecanjem stevila tock dosezemo tudi dovolj natancne rezultate, vendar je za pridobitev dodatne tocne cifre potrebno vsaj deset krat vec casa. Napako metode je mozno oceniti z
kjer puscicasti oklepaji predstavljajo aritmetico sredino preko N testnih tock.
Primer programa v jeziku Fortran je sledec
program Povrsina kroga n = 100000 a = 2.0 * 2.0 sn = 0.0 varn = 0.0 do 10 i = 1, n x = 2 * ran2(idum) - 1.0 y = 2 * ran2(idum) - 1.0 if ((x*x + y*y) .lt. 1.0) then sn = sn + 1 varn = varn + 1 endif 10 continue print *, 'Povrsina je kroga je:', sn/n*a print *, 'Ocenjena napaka je:', * a*sqrt((varn/n-(sn/n)**2)/n) end
V zanki 10 programa generirano z nakljucnim generatorjem
ran2() stevila v obsegu in jih z mnozenjem in
translacijo prestavimo v zeljeno obmocje
. Tako
generirane tocke
testiramo na robne pogoje (kroznica)
in ugotavljamo zadetek tocke v notranjst kroga. Istocasno racunamo
se oceno napake za izbrano stevilo tock.
Kot generator nakljucnih stevil lahko uporabimo funkcijo random, ce je ta prikjucena v jeziku Fortran ali pa uporabimo generator ran2(), ki deluje v vsaki izvedenki jezika:
function ran2(idum) parameter(m=714025, ia=1366) parameter(ic=150899, rm=1./m) dimension ir(97) if (idum.lt.0.or.iff.eq.0) then iff = 1 idum = mod(ic - idum, m) do 11 j = 1, 97 idum = mod(ia*idum + ic, m) ir(j) = idum 11 continue idum = mod(ia*idum + ic, m) iy = idum endif j = 1 + (97 * iy)/m if (j.gt.97.or.j.lt.1) pause iy = ir(j) ran2 = iy*rm idum = mod(ia*idum + ic, m) ir(j) = idum return end