next up previous
Naprej: Vztrajnostni moment kroga Gor: Laboratorijske vaje pri predmetu Nazaj: Naloga

Metoda Monte Carlo

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




Leon Kos
Mon Oct 9 07:40:12 GMT+0100 1995