Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Izracunavanje broja PI preko Monte Carlo metode

[es] :: Art of Programming :: Izracunavanje broja PI preko Monte Carlo metode

[ Pregleda: 6170 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

osmania
Panet

Član broj: 26316
Poruke: 773
*.20.11.vie.surfer.at.



+7 Profil

icon Izracunavanje broja PI preko Monte Carlo metode29.10.2007. u 21:18 - pre 199 meseci
treba mi pomoc da li neko od vas ima kakav primjer kako se izracunava pi preko monte carlo metodom. U biti treba mi za c++ ali nasao sam dosta stvari na googlu i puno toga mi je nejasno...

koliko sam shvatio treba da se generisu x i y kordinate (slucajni brojevi) i treba da se ispitaju da li ti brojevi nalaze u krugu ili van kruga koji senalazi u jednom kvadratu.
i ako se nalazi u krugu ok ako ne ne dolazi u obzir. a sluscajnoi borjevi ce se generisati od nule do A. Broj A je duzina stranice kvadrata ili...

u biti fomula je pi = (broj pogodata xy u krug / broj svih pokusaja)

eh sada tu se nekako radi preko pitagorine teoreme ono
mislim ljudi nista ne kontam.. ako imate kakav primjer ili code jos bolje kako se to izracunava... znaci treba da teoretski svatima jos i program napisati...
hvala vam puno....
 
Odgovor na temu

misk0
.: Lugano :. _.: CH :.

SuperModerator
Član broj: 634
Poruke: 2824
*.adsl.ticino.com.

ICQ: 46802502


+49 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 08:43 - pre 199 meseci
Nisam cuo za to ime metode ali se sjecam nacina racunanja.
Da, duzina stranice kvadrata je A, a 2r kruga je takodje A. Znaci tebe interesuje koliko tacaka zavrsi u krugu a koliko van njega u uglovima kvadrata.


:: Nemoj se svadjati sa budalom, ljudi cesto nece primjetiti razliku ::
Prikačeni fajlovi
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2789 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 10:11 - pre 199 meseci
Citat:
osmania: u biti fomula je pi = (broj pogodata xy u krug / broj svih pokusaja)

Taj količnik treba da pomnožiti sa 4.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 13:35 - pre 199 meseci
verovatnoca da ce slucajno izabrana tacka pasti u krug odnosno kvadrat je proporcionalna njihovim povrsinama.

na tome se zasniva monte karlo metoda.

Ako uzmemo da je povrsina kvadrata jedinicna za ovaj slucaj i u smislu povrsine i verovatnoce (znaci gledas random tacke koje
se uvek nalaze u kvadratu)

onda mozes da dobijes sledecu formulu:

KrBroj - broj onih tacaka koje su pale u krug (a dobijas vrlo jednostavno preko pitagorine teoreme i toga da su udaljeni
od centra kruga manje ili jednako poluprecniku)

KvBroj - broj "bacanja" tacaka, odnosno broj tacaka palih u kvadrat - a to su sve ...

formula se moze izvesti:

KrBroj:KvBroj = PovrsinaKruga:PovrsinaKvadrata (PovrsinaKvadrata - ovde je najbolje uzeti 1 odnosno kvadrat 1x1)


PovrsinaKruga = PovrsinaKvadrata*KrBroj/KvBroj

0.5^2*pi = 1*KrBroj/UkupnoBacanja (r kruga je za kvadrat povrsine 1 = 0.5)

odnosno

pi = 4*KrBroj/UkupnoBacanja ...

Eto ti formule, malo teorije i kako to napraviti :

pseudo code:

Code:

total = 0;
krug = 0;

for i=0 to MaxBacanja {
  x = rand;  // random broj u intervalu 0,1
  y = rand; // random broj u intervalu 0,1
  if ((x*x)+(y*y))<=0.25 then
    krug = krug +1;
  total = total + 1;
}

pi = 4*krug/total;



Sto je veci MaxBacanja, to je pi preciznije izracunat ...

Postoji nacin i da se odredi greska ali je to dosta matematike i ... :)
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
217.169.209.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 14:14 - pre 199 meseci
Hm... Zar nije:

Code:
...
  if ((x*x)+(y*y))>=0.25 then
...;
 
Odgovor na temu

osmania
Panet

Član broj: 26316
Poruke: 773
*.20.11.vie.surfer.at.



+7 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 15:50 - pre 199 meseci
Citat:
Burgos: Hm... Zar nije:

Code:
...
  if ((x*x)+(y*y))>=0.25 then
...;
zasto 0.25

i jos nesto ja treba da stavim -1, 1 interval (kako to definisati??)
srand (-1)
a= rand() % 2 ; ili???

hvala puno
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.ADSL.neobee.net.



+1 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode30.10.2007. u 21:23 - pre 199 meseci
Citat:
Burgos: Hm... Zar nije:

Code:
...
  if ((x*x)+(y*y))>=0.25 then
...;


U slucaju da ti treba vece od 0.25 sto je 0.5^2 onda gledas tacke koje su "dalje" od centra kruga u odnosu
na njegov precnik, a samim tim i van kruga zato je <

@osmania

Ako stavljas da ti je interval -1,1

onda moras da ispocetka odradis matematiku od gore ...

KrBroj:KvBroj = PovrsinaKruga:PovrsinaKvadrata

Povrsina kruga je r^2*pi u ovom slucaju ce biti samo PI a povrsina kvadrata je
2*2 odnosno 4.

Znaci imas istu formulu kao ranije samo sto menjas uslov za proveru unutar kruga

(x*x+y*y)<1 (1 na kvadrat je 1, crva nije ni bilo :) )

i postaras se da ti rand funkcija vraca brojeve u intervalu -1,1.

Ovo obicno postizes sa 2*rand-1 (ukoliko ti rand vraca 0,1 interval)
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2789 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode31.10.2007. u 11:53 - pre 199 meseci
Program

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    double MaxBacanja  = 100000, i;
    double total = 0;
    double krug = 0;
    double x, y;

    for (i=0; i<MaxBacanja; i++)
    {
        x = 1.0*rand()/RAND_MAX;  // random broj u intervalu 0,1
        y = 1.0*rand()/RAND_MAX; // random broj u intervalu 0,1

        if ((x*x)+(y*y)<=0.25)
            krug = krug +1;

        total = total + 1;
    }

    double pi = 4*krug/total;
    cout << pi << endl;
    system("PAUSE");

    return EXIT_SUCCESS;
}


na izlazu daje rezultat približno jednak Da biste dobili ono što želite, ili 4 zamenite sa 16 ili 0.25 zamenite sa 1.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

osmania
Panet

Član broj: 26316
Poruke: 773
*.20.11.vie.surfer.at.



+7 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode31.10.2007. u 14:50 - pre 199 meseci
hvala ekipa na pomoci oko zadatka ali imam par pitanja sto mi je nejasno inace da te upozorim pocetnik sam pa mi je sve nejasno....

Nejasno mi je ovaj program sto si mi dao u biti on izbaciva priblizno pi cetvrtina pomnozim sa 4 (u biti izbrisem cetvorku onu i ne izbaci mi priblizno pi).

Sada sta ti znaci ono RAND_MAX nije se nigdje definisala a koristis je.
I kako da da uvrstim interval -1 do 1
pokusavao sam na razne nacine jedan je ovaj:

rand()/double(RAND_MAX)*2-1;

nece da radi. Ne znam ali fakat me zadatak buni pravo ono...
Druga stvar sto mi je nejasna....
oko ovoga rand() kako odrediti koliko je interval. jer sam isao uvjek preko rand() % 10+1 znaci od 1 do 10 generise...
zasto nema generatora srand u programu.
Googlo sam nisam uspjesan bio...
hvala puno
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode31.10.2007. u 15:14 - pre 199 meseci
:) Eto greske ...

Sad bas gledam zasto treba jos 4 kad formula lepo kaze ...

Kad vidim da nije doslo do pretvaranja koordinata x,y 0,1 , 0,1 u interval za radius -0.5, 0.5 a time je i radius duplo manji ...

Elem, da ne bude zabune Nedeljkov kod koji uzima koordinate -1,1 i daje pi na kraju je:

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    double MaxBacanja  = 100000, i;
    double total = 0;
    double krug = 0;
    double x, y;

    for (i=0; i<MaxBacanja; i++)
    {
        x = 2.0*rand()/RAND_MAX -1;  // random broj u intervalu -1,1
        y = 2.0*rand()/RAND_MAX -1;  // random broj u intervalu -1,1

        if ((x*x)+(y*y)<=1.0)
            krug = krug +1;

        total = total + 1;
    }

    double pi = 4*krug/total;
    cout << pi << endl;
    system("PAUSE");

    return EXIT_SUCCESS;
}



sto se tice rand funkcije i RAND_MAX radi se o tome da rand funkcija vraca broj u intervalu 0..RAND_MAX (obicno izmedju 0 i 0xFFFFFFFF)
pa onda kada podelis sa RAND_MAX dobijes interval 0..1

Inace RAND_MAX u stdlib.h borland c++ builder 6.0

Citat:

/* Maximum value returned by "rand" function
*/
#define RAND_MAX 0x7FFFU
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2789 Profil

icon Re: Izracunavanje broja PI preko Monte Carlo metode31.10.2007. u 16:10 - pre 199 meseci
@osmania

RAND_MAX je konstanta definisana u zaklavlju cstdlib. Slučajno generisani broj je ceo broj u rasponu od 0 do RAND_MAX-1. Ako si baš hteo da ga konvertuješ u double, to se postiže sa (double) RAND_MAX, mada ne znam zašto ne bi jednostavno napisao rand()*2-RAND_MAX.

@vlaiv

Tvoja procedura meri odnos površine jedne četvrtine kruga (prvi kvadrant) poluprečnika 0.5 i jediničnog kvadrata, koji iznosi a potom se dobijeni rezultat množi sa 4.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Izracunavanje broja PI preko Monte Carlo metode

[ Pregleda: 6170 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.