May 1, 2025, Thursday, 120

KADD laboratorium 7

From MJanik

(Difference between revisions)
Jump to: navigation, search
(Uwagi)
 
(2 intermediate revisions not shown)
Line 1: Line 1:
-
  {| align="right"
+
{| align="right"
-
  | __TOC__
+
| __TOC__
-
  |}
+
|}
== Zadanie ==
== Zadanie ==
 +
''Część pierwsza'': '''obliczanie liczby Pi''' (1 pkt.)
-
'''Metody Monte Carlo'''
+
Należy napisać '''funkcję''', która oblicza liczbę Pi '''metodą von Neumanna''' (jest sztandarowy przykład wykorzystania metody typu '''Monte Carlo'''). W tym celu losujemy z rozkładu jednorodnego na przedziale [0,1] dwie liczby x i y, i sprawdzamy, czy wylosowana para mieści się wewnątrz koła o promieniu 1. Następnie używając stosunku par zaakceptowanych (mieszczących się wewnątrz) do odrzuconych (tych, które leżą poza okręgiem) oraz wzoru na pole koła, należy obliczyć liczbę Pi. Ponadto, należy narysować wykres trafień leżących wewnątrz oraz na zewnątrz koła:
 +
* stworzyć dwa obiekty typu <code>TGraph</code> i jeden z nich wypełniać zaakceptowanymi parami (x,y), drugi zaś odrzuconymi. Oba wykresy narysować na jednym panelu,
 +
* dodatkowo można stworzyć obiekt <code>TH1D</code> i wypełnić go zaakceptowanymi wartościami x. Będzie dany rozkładem wyznaczonym ze wzoru na pole koła.
-
Należy napisać ''funkcję'' która oblicza liczbę Pi Metodą Monte Carlo. W tym celu losujemy dwie liczby z rozkładu jednorodnego [0,1], x i y, i sprawdzamy, czy wylosowana para mieści się wewnątrz koła o promieniu 1. Następnie używając stosunku par zaakceptowanych (mieszczących się wewnątrz) do odrzuconych (tych, które leżą poza okręgiem) oraz wzoru na pole koła należy obliczyć liczbę Pi. Ponadto należy narysować dwa wykresy.
+
''Część druga'': '''generowanie liczb pseudolosowych z dowolnego rozkładu metodą akceptacji i odrzucania von Neumanna''' (3 pkt.)
-
* Liczbami zaakceptowanymi (x) należy wypełnić histogram <code>TH1D</code> oraz go narysować.
+
-
* Stworzyć dwa obiekty typu <code>TGraph</code> i jeden z nich wypełniać zaakceptowanymi parami (x,y) a drugi odrzuconymi parami. Przydzielić im dwa różne kolory punktów. Następnie należy narysować oba te obiekty na jednym panelu.
+
 +
Wykorzystana tydzień temu metoda transformacji rozkładu jednorodnego z wykorzystaniem funkcji odwrotnej do dystrybuanty ma ograniczone zastosowanie. Jej zastosowanie jest możliwe tylko wtedy, gdy znana jest jawna postać dystrybuanty oraz można znaleźć funkcję do niej odwrotną. '''Metoda von Neumanna''' pozwala wygenerowanie liczb pseudolosowych, gdy znany jest tylko rozkład g(y). W ogólności metoda działa nawet wtedy, gdy funkcja g(y) ''nie jest'' rozkładem gęstości prawdopodobieństwa (całka z niej nie wynosi 1). Pozwala to na bardzo szerokie wykorzystanie metody von Neumanna - przede wszystkim do obliczania całek oznaczonych ze skomplikowanych funkcji, gdy ich analityczne scałkowanie jest niemożliwe. Metody tego typu noszą nazwę wspomnianych wcześniej '''metod Monte Carlo'''.
-
'''Metoda akceptacji i odrzucania von Neumana'''
+
Należy stworzyć trzy '''bardzo podobne''' funkcje przyjmujące obiekt typu <code>TF1</code>. Powinny one przyjmować funkcję g na przedziale [min,max]:
 +
* <code>double losujVonNeumann(TF1 *g, double min, double max)</code> - funkcja zwraca ''jedną'' liczbę pseudolosową z funkcji g(y),
 +
* <code>double wydajnoscVonNeumann(TF1 *g, double min, double max, int n)</code> - funkcja zwraca wydajność metody akceptacji i odrzucania von Neumanna dla danej funkcji g(y) oraz zadanej liczby losowań n,
 +
* <code>double calkaVonNeumann(TF1 *g, double min, double max, int n)</code> - funkcja zwraca całkę oznaczoną (pole powierzchni pod krzywą) z funkcji g(y) na przedzialne [min,max] przy liczbie losowań n.
-
Standardowa metoda generacji liczb losowych przez funkcję odwrotną
+
''Część trzecia:'' '''metoda akceptacji i odrzucania von Neumanna z funkcją pomocniczą''' (1 pkt.)
-
ma ograniczone zastosowanie. Można jej uzywać tylko w przypadku,
+
-
gdy dystrybuanta jest znana i możliwe jest znalezienie jej funkcji
+
-
odwrotnej.
+
-
Gdy znana jest tylko gęstość prawdopodobieństwa <code>g(y)</code> stosujemy metodę von Neumanna.
+
W celu zwiększenia wydajności metody von Neumanna, można posłużyć się ograniczeniem przedziału losowania w postacji zadanej funkcji pomocniczej. W tej części zaimplementować funkcję, która oblicza całkę z funkcji g(y) metodą akceptacji i odrzucania von Neumanna z funkcją pomocniczą s(y):
 +
* <code>double calkaVonNeumannZPomoc(TF1 *g, TF1 *s, double min, double max, int n, double &wydajnosc)</code> - zwraca całkę na przedziale [min,max] oraz dla zadanej liczby losowań n. Ponadto, funkcja powinna zwrócić '''przez referencję''' (ponieważ w języku C/C++ funkcja nie może zwrócić dwóch wartości) wydajność tej metody.
-
* Należy zaimplementować funkcję, która generuje liczby losowe z dowolnego rozkładu reprezentowanego przez obiekt TF1.  
+
Funkcję s(y) dobieramy tak, by '''zawsze''' znajdowała się powyżej funkcji g(y) i można z niej było łatwo wygenerować liczbę pseudolosową (na przykład metodą transformacji rozkładu jednorodnego z wykorzystaniem odwrotności dystrybuanty; na wykładzie przykład z funkcją liniową).
-
Losowanie  należy wykonać za pomocą metody akceptacji i odrzucania.  Funkcja powinna losować punkt z rozkladu reprezentowanego przez obiekt f, w granicach od min do max:
+
-
<code> double losujVonNeuman(TF1 *f, int min, int max);</code>
+
Wszystkie obliczenia należy wykonać dla funkcji typu:
 +
[[File:Lab07_funkcja2.png]]
-
* Należy zaimplementować funkcję, która oblicza wydajność metody von neumanna dla zadanej funkcji f, w granicach od min do max, dla losowej próbki n punktów.
+
== Uwagi ==
 +
* Funkcja kwadratowa i jej odwrotność:
-
<code> double wydajnoscVonNeuman(TF1 *f, int min, int max, int n);</code>
+
[[File:Odwracanie_kwadratowej.png]]
 +
* [http://pl.wikipedia.org/wiki/Metoda_Monte_Carlo Metoda Monte Carlo] - Wikipedia.
 +
* [http://www.if.pw.edu.pl/~kisiel/kadd/Wyklad5.pdf Wykład 5] z KADD dr hab. inż. Adama Kisiela.
-
* Należy zaimplementować funkcję, która oblicza całkę z funkcji f przy użyciu metody von neumanna, w granicach od min do max, dla losowej próbki n punktów.
+
== Wynik ==
 +
''Część pierwsza''
-
<code> double calkaVonNeuman(TF1 *f, int min, int max, int n);</code>
+
[[File:Lab07_dist.png]]
 +
Output:
 +
  Liczba Pi wynosi: 3.14392
-
'''Metoda akceptacji i odrzucania von Neumana z funkcją pomocniczą'''
+
''Części druga i trzecia''
-
* Należy zaimplementować funkcję, która oblicza całkę z funkcji f przy użyciu metody von neumanna z funkcją pomocniczą g, w granicach od min do max, dla losowej próbki n punktów. Ponadto zwraca wydajność tego ogliczenia.
+
-
 
+
-
<code> double VonNeumanzPomoc(TF1 *f, TF1 *g, int min, int max, double wydajnosc);</code>
+
-
 
+
-
== Uwagi ==
+
-
 
+
-
Odwracanie funkcji kwadratowej:
+
-
[[File:odwracanie_kwadratowej.png]]
+
-
[http://pl.wikipedia.org/wiki/Metoda_Monte_Carlo Wikipedia Metoda Monte Carlo]
+
[[File:lab07_kolo2.png]]
-
[http://www.if.pw.edu.pl/~kisiel/kadd/Wyklad5.pdf KADD Wykład 5 A. Kisiel]
+
Output:
 +
Calka: 0.199
 +
Wydajnosc: 0.2072
 +
Calka (metoda z funkcja pomocnicza): 0.198745
 +
Wydajnosc (metoda z funkcja pomocnicza): 0.39749
 +
Calka liczona metoda  Integral: 0.198652

Latest revision as of 10:07, 11 April 2012

Contents


Zadanie

Część pierwsza: obliczanie liczby Pi (1 pkt.)

Należy napisać funkcję, która oblicza liczbę Pi metodą von Neumanna (jest sztandarowy przykład wykorzystania metody typu Monte Carlo). W tym celu losujemy z rozkładu jednorodnego na przedziale [0,1] dwie liczby x i y, i sprawdzamy, czy wylosowana para mieści się wewnątrz koła o promieniu 1. Następnie używając stosunku par zaakceptowanych (mieszczących się wewnątrz) do odrzuconych (tych, które leżą poza okręgiem) oraz wzoru na pole koła, należy obliczyć liczbę Pi. Ponadto, należy narysować wykres trafień leżących wewnątrz oraz na zewnątrz koła:

  • stworzyć dwa obiekty typu TGraph i jeden z nich wypełniać zaakceptowanymi parami (x,y), drugi zaś odrzuconymi. Oba wykresy narysować na jednym panelu,
  • dodatkowo można stworzyć obiekt TH1D i wypełnić go zaakceptowanymi wartościami x. Będzie dany rozkładem wyznaczonym ze wzoru na pole koła.

Część druga: generowanie liczb pseudolosowych z dowolnego rozkładu metodą akceptacji i odrzucania von Neumanna (3 pkt.)

Wykorzystana tydzień temu metoda transformacji rozkładu jednorodnego z wykorzystaniem funkcji odwrotnej do dystrybuanty ma ograniczone zastosowanie. Jej zastosowanie jest możliwe tylko wtedy, gdy znana jest jawna postać dystrybuanty oraz można znaleźć funkcję do niej odwrotną. Metoda von Neumanna pozwala wygenerowanie liczb pseudolosowych, gdy znany jest tylko rozkład g(y). W ogólności metoda działa nawet wtedy, gdy funkcja g(y) nie jest rozkładem gęstości prawdopodobieństwa (całka z niej nie wynosi 1). Pozwala to na bardzo szerokie wykorzystanie metody von Neumanna - przede wszystkim do obliczania całek oznaczonych ze skomplikowanych funkcji, gdy ich analityczne scałkowanie jest niemożliwe. Metody tego typu noszą nazwę wspomnianych wcześniej metod Monte Carlo.

Należy stworzyć trzy bardzo podobne funkcje przyjmujące obiekt typu TF1. Powinny one przyjmować funkcję g na przedziale [min,max]:

  • double losujVonNeumann(TF1 *g, double min, double max) - funkcja zwraca jedną liczbę pseudolosową z funkcji g(y),
  • double wydajnoscVonNeumann(TF1 *g, double min, double max, int n) - funkcja zwraca wydajność metody akceptacji i odrzucania von Neumanna dla danej funkcji g(y) oraz zadanej liczby losowań n,
  • double calkaVonNeumann(TF1 *g, double min, double max, int n) - funkcja zwraca całkę oznaczoną (pole powierzchni pod krzywą) z funkcji g(y) na przedzialne [min,max] przy liczbie losowań n.

Część trzecia: metoda akceptacji i odrzucania von Neumanna z funkcją pomocniczą (1 pkt.)

W celu zwiększenia wydajności metody von Neumanna, można posłużyć się ograniczeniem przedziału losowania w postacji zadanej funkcji pomocniczej. W tej części zaimplementować funkcję, która oblicza całkę z funkcji g(y) metodą akceptacji i odrzucania von Neumanna z funkcją pomocniczą s(y):

  • double calkaVonNeumannZPomoc(TF1 *g, TF1 *s, double min, double max, int n, double &wydajnosc) - zwraca całkę na przedziale [min,max] oraz dla zadanej liczby losowań n. Ponadto, funkcja powinna zwrócić przez referencję (ponieważ w języku C/C++ funkcja nie może zwrócić dwóch wartości) wydajność tej metody.

Funkcję s(y) dobieramy tak, by zawsze znajdowała się powyżej funkcji g(y) i można z niej było łatwo wygenerować liczbę pseudolosową (na przykład metodą transformacji rozkładu jednorodnego z wykorzystaniem odwrotności dystrybuanty; na wykładzie przykład z funkcją liniową).

Wszystkie obliczenia należy wykonać dla funkcji typu: Lab07 funkcja2.png

Uwagi

  • Funkcja kwadratowa i jej odwrotność:

Odwracanie kwadratowej.png

Wynik

Część pierwsza

Lab07 dist.png

Output:

 Liczba Pi wynosi: 3.14392

Części druga i trzecia

Lab07 kolo2.png

Output:

Calka: 0.199
Wydajnosc: 0.2072
Calka (metoda z funkcja pomocnicza): 0.198745
Wydajnosc (metoda z funkcja pomocnicza): 0.39749
Calka liczona metoda  Integral: 0.198652