Rachunek Prawdopodobieństwa
Grupa wykładowa: środa g. 15.15
Grupa w składzie:
1. Wojciech Nawracała
2. Paweł Gancarz
3. Michał Frysztacki
4. Paweł Trajdos
5. Jakub Bubin
Prezentuje
:
Ilustracja metody
Monte Carlo
Monte Carlo
obliczania całek podwójnych
Spis treści:
Treść zadania
Kilka słów o metodzie Monte Carlo
Algorytm obliczania całek podwójnych metodą
Monte Carlo
Przykłady rozwiązań, tabele zbiorcze
Treść zadania:
Kilka słów o metodzie Monte Carlo
Metoda opracowana została przez polskiego matematyka, Stanisława Ulama,
nazwa wzięła się ze skojarzenia jej z osobą wujkahazardzisty tegoż
matematyka. Metoda ta wykorzystywana jest nie tylko do obliczania całek, ale
ogólnie rzecz biorąc, do modelowania procesów matematycznych i fizycznych
zbyt złożonych do obliczeń analitycznych.
Na czym polega metoda MC obliczania całek podwójnych?
1. Na obszarze całkowania opisywany jest prostokąt, i za pomocą generatora
liczb pseudolosowych generuje się zadaną wcześniej jako ilość prób liczbę
punktów tego prostokąta.
2. W każdej próbie sprawdzane jest, czy współrzędne
wylosowanego punktu zawierają się w polu obszaru całkowania czy też nie.
3. Wynik to stosunek sumy wartości całkowanej funkcji w punktach trafionych
w obszar całkowania do ilości wszystkich prób, pomnożony przez pole
prostokąta
Algorytm Monte Carlo jako kod języka c++
inline double gen()
{
int MAX=1000;
return ((double)(rand()%MAX))/MAX;
}
double calkaMonteCarlo(double a, double b,double c,double d,
double(*ptr)(double,double),unsigned int n)
{
double w; int j=0; double sum=0,xk,yk,temp;
if(a>b){temp=a;a=b;b=temp;}
for(unsigned int i=0;i<n;i++)
{
xk=a+(b-a)*gen();
yk=c+(d-c)*gen();
sum+=ptr(xk,yk);
w=n/76; j++;
if(j==abs(w))
{
printf ("|"); j=0;
}
}
return ((b-a)*(d-c)/n)*sum;}
Generator liczb
pseudoloswych.
Kod “liczący” pole całki
sprawdza, czy
wylosowana liczba
mieści się w polu
określonym przez funkcję
podcałkową.
Funkcja pierwsza
Kod funkcji:
double fun1(double x, double y)
{
if(y>=0&&y<=sqrt(1-(x*x)))
return x; else return 0;
}
Wykres prezentujący
zbieżność wyniku
analitycznego oraz
wyników numerycznych
W zależności od
liczby prób.
Kod funkcji
I
wykres funkcji.
Funkcja druga
Kod funkcji:
double fun2(double x, double y)
{
if(y<=(1/x)) return exp(x*y);
else return 0;
}
Kod funkcji
I
wykres funkcji.
Wykres prezentujący
zbieżność wyniku
analitycznego oraz
wyników numerycznych
w zależności od
liczby prób .
Funkcja trzecia
Kod funkcji:
double fun3(double x, double y)
{
if(y>=(x/2) && y<=2*x)
return 1/((1+x+y)*(1+x+y));
else return 0;
}
Wykres prezentujący
zbieżność wyniku
analitycznego oraz
wyników numerycznych
w zależności od
liczby prób.
Kod funkcji
I
wykres funkcji.
Funkcja czwarta
Kod funkcji:
double fun4(double x, double y)
{
if (y>=(x*x))
return
((exp(exp(sin(exp(x*y))))));
else return 0;
}
Wykres prezentujący
zbieżność wyniku
analitycznego oraz
wyników numerycznych
w zależności od
liczby prób.
Kod funkcji.
Kod programu obliczającego całki
int main()
{
srand((unsigned)time(NULL));
int N=1000000; // ilo
prób
ść
double t; t=exp(1.0);
a,b,c,d
printf("\n%f\n",calkaMonteCarlo(0,1,0,1,fun1,N));
printf("\n%f\n",calkaMonteCarlo(1,t,0,1,fun2,N));
printf("\n%f\n",calkaMonteCarlo(0,2,0,4,fun3,N));
printf("\n%f\n",calkaMonteCarlo(0,2,0,3,fun4,N));
system("pause");
}
Ilość losowanych
liczb prób.
Obliczanie i
wyświetlanie
wyników całkowania
poszczególnych funkcji.
Krótki opis zasady działania programu:
1. Na obszarze całkowania opisywany jest prostokąt, oraz
Ustalamy liczbę prób – liczb pseudolosowych generowanych przez generator.
2. W każdej próbie sprawdzane jest, czy współrzędne wylosowanej liczby zawierają się
w przedziale całkowania.
3. Wynik, to stosunek sumy prób trafionych w obszar całkowania do ilości wszystkich
prób wymnożony przez pole prostokąta.
Podsumowanie wyników obliczeń
Jak widać wyniki obliczenia
numeryczne zbiegają do
większej dokładności przy
większej liczbie prób.
Dla każdej funkcji należy więc
dobrać optymalną liczbę liczb.
Pamiętać należy jednak o tym,
że metoda Monte Carlo zwana
też inżynierską służy do
szybkiego otrzymania wyników.
Dokładnosć wyniku schodzi na
drugi plan.