Symulacje i kwantyle (simulation, quantiles)

MetodaDeklaracja metodyPrzykład wywołaniaOpis działania
Deklaracja obiektu symulacjesimulation()simulation sTworzony jest pusty obiekt symulacje.
Deklaracja obiektu z parametrami histogramusimulation(double hist_min,double hist_max,int his_num=20)simulation s(-4.0,4.0,50)Tworzony jest pusty obiekt symulacje. Zdefiniowane zostają parametry histogramu: minimalna wartość (hist_min), maksymalna wartość (hist_max) i liczba przedziałów (hist_num). Domyślnie jest 20 przedziałów histogramu.
Resetowanie symulacjivoid reset()s.reset()Resetowanie symulacji. Obiekt symulacji jest przywracany do stanu początkowego, gdy liczba obserwacji wynosi 0.
Dodawanie obserwacjivoid add(double e)s.add(normal_sample(0.0,1.0,seed))Do symulacji dodawana jest jedna obserwacja. W podanym przykładzie jest to liczba z rozkładu normalnego N(0,1). Funkcje losujące liczby z różnych rozkładów są dostępne w biblitece prob.hpp. Punkt startowy generatora losowego (tzw. ziarno) można zadeklarować tak:
int seed[1]={10};
lub
int seed[1]={time(0)};
W pierwszym przypadku ziarno jest deterministyczne (równe 10), w drugim przypadku zależy od czasu uruchomienia programu.
Wczytanie obiektuvoid load(Text name)s.load("symul.dat")Obiekt symulacje jest wczytywany z pliku o podanej nazwie.
Zapisanie obiektuvoid save(Text name)s.save("symul.dat")Obiekt symulacje jest zapisywany do pliku o podanej nazwie.
Kumulowanie symulacjivoid operator +=(const simulation &s)s+=s2;Symulacje z dwóch obiektów są sumowane w pierwszym z nich. W podanym przykładzie do obiektu 's' są dodawane wszystkie symulacje zgromadzone w obiekcie 's2'.
Liczba symulacjilong length()s.length()Zwracana jest liczna wykonanych symulacji.
Najmniejsza wartośćdouble min()s.min()Zwracana jest wartość najmniejsza.
Największa wartośćdouble max()s.max()Zwracana jest wartość największa.
Zakresdouble range()s.range()Zwracany jest zakres wartości (tj. maksimum - minimum).
Sumadouble sum()s.sum()Zwracana jest suma wartości.
Średnia arytmetycznadouble mean()s.mean()Zwracana jest średnia arytmetyczna.
Średnia geometrycznadouble gmean()s.gmean()Zwracana jest średnia geometryczna wartości dodatnich.
Średnia harmonicznadouble hmean()s.hmean()Zwracana jest średnia harmoniczna wartości różnych od 0.
Dominantadouble mode()s.mode()Zwracana jest wartość najczęstsza.
Wariancjadouble var()s.var()Zwracana jest variancja rozkładu.
Odchylenie standardowedouble stdev()s.stdev()Zwracane jest odchylenie standardowe.
Skośnośćdouble skewness()s.skewness()Zwracana jest skośność.
Kurtozadouble kurtosis()s.kurtosis()Zwracana jest kurtoza.
Histogrammatrix hist()s.hist()Zwracana jest macierz z histogramem rozkładu.
Deklaracja obiektu kwantylequantiles(double p=0.5)quantiles q(0.3)Deklarowana jest obiekt kwantyle. Obliczany będzie kwantyl 'p' (domyślnie kwantyl 0.5, czyli mediana).
W podanym przykładzie obiekt będzie obliczał kwantyl 0.3.
Resetowanie obiektuvoid reset(double p)q.reset(0.4)Resetowanie symulacji służących do wyliczenia kwantyla. Obiekt 'kwantyle' jest przywracany do stanu początkowego, gdy liczba obserwacji wynosi 0. Wymagane jest podanie, jaki kwantyl będzie następnie obliczany (parametr 'p').
Dodawanie obserwacjivoid add(double e)q.add(normal_sample(0.0,1.0,seed))Do symulacji dodawana jest jedna obserwacja. W podanym przykładzie jest to liczba z rozkładu normalnego N(0,1). Więcej informacji patrz: funkcja add w obiekcie „simulation”.
Wynikdouble result()q.result()Obliczany jest kwantyl rozkładu.
Dystrybuantadouble cdf(double x)q.cdf(0.0)Obliczana jest wartość dystrybuanty w zadanym punkcie położonym w pobliżu wyznaczonego kwantyla. Obiekt kwantyle nie gromadzi wszystkich obserwacji, a tylko te w pobliżu szukanego wyniku. Jeżeli wartość x będzie odległa od wyniku, to pojawi się komunikat ostrzegawczy, że wartości dystrybuanty nie można wyznaczyć. Ta funkcja może służyć np. do sprawdzenia, czy wynik otrzymany funkcją result() jest prawidłowy:

int seed[1]={1};

quantiles q(0.5);
for (long n=1; n<=1000000; n++) q.add(normal_sample(0.0,1.0,seed));

double mediana=q.result();
cout<<"mediana="< cout<<"cdf(mediana)="<
Oczekiwany wynik działania programu przy dużej liczbie symulacji to:

mediana=0.0
cdf(mediana)=0.5

Funkcja jest wykorzystywana przez obiekt „quantiles2”, kumulujący obiekty „quantiles” (patrz poniżej).
Wczytanie obiektuvoid load(Text name)q.load("kwantyl1.dat")Obiekt kwantyle jest wczytywany z pliku o podanej nazwie.
Zapisanie obiektuvoid save(Text name)q.save("kwantyl1.dat")Obiekt kwantyle jest zapisywany do pliku o podanej nazwie.
Deklaracja obiektu sumującego zestawy symulacjiquantiles2(int max_size=10)quantiles2 qq(2)Tworzony jest obiekt, w którym można zsumować, wiele obiektów kwantylowych (typu quantiles). Parametr max_size określa, ile maksymalnie obiektów będzie zsumowanych.
Resetowanie obiektuvoid reset(int max_size=10)qq.reset()Resetowanie obiektu. Obiekt 'kwantyle2' jest przywracany do stanu początkowego, gdy nie zawiera, żadnych danych. Można zmienić maksymalną liczbę obiektów składowych (parametr 'max_size').
Kumulowanie symulacjivoid operator +=(const quantiles &q)qq+=qSymulacje z obiektów „kwantyle” są sumowane w obiekcie „kwantyle2”. W podanym przykładzie do obiektu 'qq' są dodawane wszystkie symulacje zgromadzone w obiekcie 'q'.
Wynikdouble result()qq.result()Obliczany jest kwantyl rozkładu.
Dystrybuantadouble cdf(double x)qq.cdf()Obliczana jest wartość dystrybuanty w zadanym punkcie położonym w pobliżu wyznaczonego kwantyla. Jeżeli wartość x będzie odległa od wyniku, to pojawi się komunikat ostrzegawczy, że wartości dystrybuanty nie można wyznaczyć.
Liczba wszystkich symulacjilong simulations_all()qq.simulation_all()Liczba wszystkich symulacji w kumulowanych obiektach kwantylowych.
Liczba użytych symulacjilong simulations_used()qq.simulation_used()Liczba symulacji w kumulowanych obiektach kwantylowych użytych do obliczania wyników (najczęściej równa liczbie wszystkich symulacji).