Rachunek Prawdopodobieństwa Grupa wykładowa: środa g. 15.15 Prezentuje: Grupa w składzie: 1. Wojciech Nawracała 2. Paweł Gancarz 3. Michał Frysztacki 4. Paweł Trajdos 5. Jakub Bubin Ilustracja metody 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ą wujka hazardzisty 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; Generator liczb pseudoloswych. 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; 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; 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 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: doubl e f un3(double x, double y) if(y>=(x/2) && y<=2*x) return 1/((1+x+y)*(1+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 czwarta Kod funkcji: double fun4(double x, double y) if (y>=(x*x)) return ((exp(exp(sin(exp(x*y)))))); else return 0; Kod funkcji. Wykres prezentujący zbieżność wyniku analitycznego oraz wyników numerycznych w zależności od liczby prób.
Kod programu obliczającego całki int main() srand((unsigned)time(null)); Ilość losowanych liczb prób. 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"); Obliczanie i wyświetlanie Krótki opis zasady działania programu: wyników całkowania poszczególnych funkcji. 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.