MKZR:Symulacje procesów losowych dyskretnych

Z Skrypty dla studentów Ekonofizyki UPGOW

(Różnice między wersjami)
(Próby i schemat Bernoulliego)
(Proces urodzin i śmierci)
 
(Nie pokazano 43 wersji pomiędzy niniejszymi.)
Linia 1: Linia 1:
 +
[[Category:MKZR]]
==Próby i schemat Bernoulliego==
==Próby i schemat Bernoulliego==
Próbą Bernoulliego nazywamy dowolne doświadczenie losowe, w którym pytam tylko o dwa możliwe wyniki, będące zdarzeniami przeciwnymi. Prawdopodobieństwo tego, że w schemacie Bernoulliego o n próbach otrzymamy k razy sukces jest jest dane przez rozkład dwumianowy:  
Próbą Bernoulliego nazywamy dowolne doświadczenie losowe, w którym pytam tylko o dwa możliwe wyniki, będące zdarzeniami przeciwnymi. Prawdopodobieństwo tego, że w schemacie Bernoulliego o n próbach otrzymamy k razy sukces jest jest dane przez rozkład dwumianowy:  
-
<math>
 
-
p_n(k) = {n \choose k} \cdot p^k \cdot q^{n-k}  = \frac{n!}{k! (n-k)!} \cdot p^k \cdot q^{n-k}
 
-
</math>
 
-
Przeprowadzmy symulację komputerową takiego procesu dla schematu Bernoulliego składającego się z szesciu prób z prawdopodobieństwem sukcesu <math>p=0.6</math>. Dysponując jednorodnym  generatorem liczb losowych z przedziału (0,1), łatwo możemy wygenerować rezultat próby Bernouliego. Korzystamy z faktu, że prawdopodobieństwo P zdarzenia że taka liczba losowa z przedziałuy (0,1) jest wieksza od <math>0.6</math> wynosi dokładnie <math>p=0.6</math>. Ponieważ mamy sześć prób generujemy jednym poleceniem wektor:
+
$$
 +
p_n(k) = {n \choose k} \cdot p^k \cdot q^{n-k}  = \frac{n!}{k! (n-k)!} \cdot p^k \cdot q^{n-k}
 +
$$
 +
Przeprowadźmy symulację komputerową takiego procesu dla schematu Bernoulliego składającego się z sześciu prób z prawdopodobieństwem sukcesu <math>p=0.6</math>. Dysponując jednorodnym  generatorem liczb losowych z przedziału (0,1), łatwo możemy wygenerować rezultat próby Bernouliego. Korzystamy z faktu, że prawdopodobieństwo P zdarzenia że taka liczba losowa z przedziałuy (0,1) jest wieksza od <math>0.6</math> wynosi dokładnie <math>p=0.6</math>. Ponieważ mamy sześć prób generujemy jednym poleceniem wektor:
<source lang="matlab">
<source lang="matlab">
Linia 75: Linia 76:
</source>
</source>
 +
i okazuje się zę wynik wysymulowany zgadza się z dokładnym do trzech cyfr znaczących.
Na współczesnym komputerze, taka operacja nie powinna zająć wiecej niż jedna sekunda.
Na współczesnym komputerze, taka operacja nie powinna zająć wiecej niż jedna sekunda.
Linia 91: Linia 93:
plot(0:n,eksp,"*", 0:n,binopdf(0:n,n,p ),"o")
plot(0:n,eksp,"*", 0:n,binopdf(0:n,n,p ),"o")
</source>
</source>
-
 
-
== Szum dychotomiczny ==
 
== Proces Poissona ==
== Proces Poissona ==
-
== Ruch Browna ==
+
 
 +
Rozważamy przedział liczbowy  <math>[0, T]</math>. Z przedziału tego wybieram losowo  jeden punkt, jedną liczbę. Ponieważ wszystkie liczby są "równo rozłożone", więc prawdopodobieństwo tego, że punkt ten jest w przedziale <math>(t_1, t_2)\subset [0, T] </math> wynosi
 +
 
 +
$$P(A)= p = \frac{t_2 -t_1}{T}$$
 +
 
 +
 
 +
'''DEFINICJA'''
 +
 
 +
Procesem Poissona <math>N(t)</math> nazywamy proces stochastyczny o następujących wlasnościach:
 +
 
 +
# Przestrzenią stanów jest zbiór liczb całkowitych nieujemnych, <math>X=\{k\}_0^{\infty}\; = \{0, 1, 2, \dots \}</math>
 +
# <math>N(0) = 0 \;  </math>  (proces startujący z zera)
 +
# <math>N(t_2) - N(t_1)\; </math> jest liczbą punktów w przedziale <math>(t_1, t_2)</math>
 +
#<math>N(t)</math> ma stacjonarne i niezależne przyrosty na nieprzekrywających się przedziałach o rozkładzie prawdopodobieństwa
 +
 
 +
<equation id="eqn:8.4-equation">
 +
              $$Pr\{N(t_2) - N(t_1) =k\} =  e^{-\mu (t_2 - t_1)} \;
 +
\frac{[\mu (t_2 - t_1)]^k}{k!}$$
 +
</equation>
 +
 
 +
===Generowanie procesu Poissona===
 +
 
 +
[[Plik:poisson_proc1.png|thumb|360px|Realizacja procesu Poissona. ]]
 +
Ponieważ realizacja procesu  Poissona jest dana przez niezależne punkty jednorodnie położone na odcinku  <math>[0, T] </math>  to można wygenerować tę liczbe korzystając z rozkładu Poissona a następnie wygenerować położenie tych punktów na osi czasu zgodnie z rozkładem jednorodnym. Poniższy kod realizuje ten algorytm. Wykorzystana jest przy tym funkcja '''poissrnd''' wbudowana w system, która generuje punkty losowe  z rozkładu Poissona <math>  e^{-\lambda} \; \frac{\lambda ^k}{k!}</math>
 +
 
 +
<source lang="matlab">
 +
clear all
 +
T=15;
 +
mu=1.3;
 +
N=poissrnd(T*mu);
 +
t=sort(T*rand(1,N));
 +
x=1:(N);
 +
 
 +
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
 +
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 +
 
 +
plot(t,x,"o-")
 +
</source>
 +
 
 +
Proszę zwrócić uwagę na drugą i trzecią linie od końca skryptu, która służy wyłącznie do utworzenia wykresu schodkowego i dodaje "wewnętrzne" rogi schodków:
 +
 
 +
<source lang="matlab">
 +
octave:218> t=[1,2,3];
 +
octave:219> x=[5,6,7];
 +
octave:220> t=reshape([t;t],[2*length(t),1])(2:2*length(t))
 +
t =
 +
  1
 +
  2
 +
  2
 +
  3
 +
  3
 +
octave:221> x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1))
 +
x =
 +
 
 +
  5
 +
  5
 +
  6
 +
  6
 +
  7
 +
octave:223> [t,x]
 +
ans =
 +
 
 +
  1  5
 +
  2  5
 +
  2  6
 +
  3  6
 +
  3  7
 +
</source>
 +
 
 +
 
 +
Inną i częściej spotykaną w praktyce możliwością generacji procesu Poissona jest generacja kolejnych punktów na osi czasu. Kolejne zdarzenia na osi czasu są z definicji procesu Poissona od siebie niezależne. Rozkład czasów miedzy dwoma kolejnymi punktami jest eksponencjalny <math>  p(t_i) = -\mu \; e^{-\mu t_i}</math>. Możemy więc wygenerować liczby losowe o rozkładzie eksponencjalnym i ich sekwencja zdefiniuje nam process Poissona.
 +
 
 +
[[Plik:poisson_proc2.png|thumb|360px|Realizacja procesu Poissona]]
 +
<source lang="matlab">
 +
clear all
 +
mu=1.3;
 +
N=19;
 +
t=exprnd (mu,1,N);
 +
for i=2:N
 +
t(i)+=t(i-1);
 +
endfor
 +
x=1:(N);
 +
 
 +
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
 +
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 +
 
 +
plot(t,x,"o-")
 +
</source>
 +
 
 +
 
 +
===Funkcja korelacyjna procesu Poissona ===
 +
 
 +
Proces Poissona jest procesem skorelowanym o funkcji korelacji danej wzorem:
 +
 
 +
$$R(t_2, t_1) = \langle N(t_2) N(t_1)\rangle = \mu^2 \;t_2 \;t_1 + \mu \; \mbox{min}(t_2, t_1)
 +
$$
 +
 
 +
 
 +
Funkcję korelacyjną można wyznaczyć bezpośrednio z definicji, dysponując wieloma realizacjami procesu losowego.
 +
 
 +
$$\langle N(t_2) N(t_1)\rangle = \frac{1}{N_r} \sum_{i=1}^{N_r}  N(t_2) N(t_1)
 +
$$
 +
 
 +
 
 +
Dla danych czasów <math>t_1,t_2</math> obliczamy wartość danej realizacji procesu Poissona
 +
 
 +
<source lang="matlab">
 +
clear all
 +
T=8;
 +
mu=1.3;
 +
Nr=2220;
 +
 
 +
t1=4;
 +
t2=6.5;
 +
corr=0;
 +
for ii=1:Nr
 +
  N=poissrnd(T*mu);
 +
  t=[0,sort(T*rand(1,N)) ];
 +
  corr+=(max(find(t<t1)) - 1) * ( max(find(t<t2))  -1 );
 +
endfor
 +
  corr/=Nr;
 +
 
 +
corr
 +
mu^2*t1*t2+mu*min(t1,t2)
 +
 
 +
 
 +
</source>
 +
 
 +
==Proces urodzin i śmierci==
 +
 
 +
 
 +
W procesie urodzin, liczba osobników nie maleje. W rzeczywistości zachodzą też procesy śmierci, czyli ubytek osobników.
 +
Proces ten można uwględnić w  relacji  w następujący sposób:
 +
 
 +
 
 +
$$N(t) = N(0) + \sum_{i} \xi_i \theta (t-t_i)\;$$
 +
 
 +
 
 +
gdzie zmienne losowe <math>\xi_i=\{1, -1\}</math> są niezależne między sobą i są o identycznych rozkładach prawdopodobieństa:
 +
 
 +
$$P(\xi_i = 1) = p, \; \; \; P(\xi_i = -1) = q, \; \; \; p+q=1$$
 +
 
 +
[[Plik:death_birth.png|thumb|360px|Realizacja procesu urodzin i śmierci. ]]
 +
<source lang="matlab">
 +
clear all
 +
mu=1.3;
 +
N=60;
 +
p=0.5;
 +
t=exprnd (mu,1,N);
 +
x(1)=0;
 +
for i=2:N
 +
t(i)+=t(i-1);
 +
x(i)=x(i-1)+((rand(1)>0.5)*2-1);
 +
endfor
 +
 
 +
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
 +
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 +
 
 +
plot(t,x,"o-")
 +
</source>
 +
 
 +
== Błądzenie przypadkowe ==
 +
 
 +
Błądzenie przypadkowego to proces losowy zdefiniowany w następujący sposób:
 +
 
 +
Rozważmy nieskończoną jednowymiarową sieć (łańcuch) o strukturze periodycznej, o okresie <math>L</math>. Węzły sieci oznaczymy liczbami całkowitymi <math>\{\dots, -2, -1, 0, 1, 2, \dots \}</math>. Odległość między węzłami wynosi <math>L</math>.  Niech cząstka w chwili początkowej <math>t=0</math>  znajduje się w węźle oznaczonym umownie <math>r=0</math>. Cząstka co pewien ustalony czas <math>T</math> wykonuje krok albo w prawo (zdarzenie <math>A_1</math>) albo w lewo  (zdarzenie <math>A_2</math>). Niech
 +
prawdopodobieństwo kroku w prawo wynosi  <math>p</math>, a kroku w lewo <math>q</math>, czyli<math>P(A_1) =p, \; \; \; \; \;\;\;\;\; P(A_2)  = q, \; \;\;\;\;\; \; \;p+q=1</math>,
 +
 
 +
[[Plik:bladzenie.png|thumb|360px|Realizacja procesu błądzenia przypadkowego. ]]
 +
<source lang="matlab">
 +
 
 +
clear all
 +
N=32;
 +
p=0.5;
 +
T=1.0;
 +
x(1)=0;
 +
t(1)=0;
 +
for i=2:N
 +
t(i)=t(i-1)+T;
 +
x(i)=x(i-1)+((rand(1)>p)*2-1);
 +
endfor
 +
 
 +
 
 +
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
 +
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 +
 
 +
plot(t,x,"-")
 +
</source>

Aktualna wersja na dzień 12:51, 17 mar 2011

Spis treści

Próby i schemat Bernoulliego

Próbą Bernoulliego nazywamy dowolne doświadczenie losowe, w którym pytam tylko o dwa możliwe wyniki, będące zdarzeniami przeciwnymi. Prawdopodobieństwo tego, że w schemacie Bernoulliego o n próbach otrzymamy k razy sukces jest jest dane przez rozkład dwumianowy:


$$ p_n(k) = {n \choose k} \cdot p^k \cdot q^{n-k} = \frac{n!}{k! (n-k)!} \cdot p^k \cdot q^{n-k} $$ Przeprowadźmy symulację komputerową takiego procesu dla schematu Bernoulliego składającego się z sześciu prób z prawdopodobieństwem sukcesu \(p=0.6\). Dysponując jednorodnym generatorem liczb losowych z przedziału (0,1), łatwo możemy wygenerować rezultat próby Bernouliego. Korzystamy z faktu, że prawdopodobieństwo P zdarzenia że taka liczba losowa z przedziałuy (0,1) jest wieksza od \(0.6\) wynosi dokładnie \(p=0.6\). Ponieważ mamy sześć prób generujemy jednym poleceniem wektor:

rand(6,1)

a następnie wykonujemy na nim operację logiczną

rand(6,1)<0.6

i w wyniku otrzymujemy wektor zer i jedynek, przy czym jedynka odpowiada sukcesowi z prawdopodopieństwem 0.6 w jednej próbie. Eksperyment powtarzamy wiele razy, więc możemy wykorzystać drugi wskaźnik:

octave:87>  rand(6,10)<0.5 
ans =
 
   0   1   0   0   1   0   1   0   1   0
   0   0   1   1   0   1   0   1   0   0
   0   0   1   1   1   0   1   1   0   1
   1   1   1   0   1   0   1   1   0   0
   0   0   0   1   0   1   0   0   1   1
   1   1   0   1   1   1   1   0   0   0

Każda kolumna powyższej macierzy odpowiada jednemu eksperymentowi składającemu się z 6 zdarzeń

Chcemy wyliczyć prawdopodobieństwo z jakim sukces zajdzie dokładnie 3 razy, czyli częstość z jaką kolumna powyższej macierzy będzie zawierała dokładnie trzy jedynki. Można to zrobić sumując wszystkie rzędy tej macierzy wektora:

octave:88> sum(  rand(6,10)<0.5  )
ans =
 
   1   2   5   1   2   2   0   4   3   2

a następnie wykonując operację logiczną:

octave:89> sum(  rand(6,10)<0.5  )==3
ans =
 
   0   0   0   0   0   0   0   0   1   1

By obliczyć częstość musimy znowu zsumować powyższe "jedynki" i podzielić przez 10

octave:105> sum((sum(  rand(6,10)<0.5  )==3))/10
ans =  0.20000

Otrzymany wynik jest średnia z 10 eksperymentów i jego dokładność nie jest duża. Dokładną wartość prawdopodobieństwa możemy oszacować z rozkładu dwumianowego, który jest w systemie Octave/Matlab zdefiniowany jako funkcja binopdf:

octave:106> binopdf(3,6,0.6 )
ans =  0.27648

By otrzymać lepszy wynik możemy powtórzyć nie 10 ale np. 1000000 razy nasz eksperyment:


octave:107> sum((sum(  rand(6,1000000)<0.6  )==3))/1000000
ans =  0.27658

i okazuje się zę wynik wysymulowany zgadza się z dokładnym do trzech cyfr znaczących. Na współczesnym komputerze, taka operacja nie powinna zająć wiecej niż jedna sekunda.

Eksperyment z 61 próbami Bernouliego, punkty połączone linią ciągła sa wynikiem dokładnym a niebieskie punkty są średnią z 1000 eksperymentów.

Dysponując powyższymi narzędziami można narysować rozkład dwumianowy jako średnia z np. 1000 eksperymentów. Poniższy program ilustruje taką procedurę:

clear all;
N=1000
p=0.6
n=61
tic;
for k=0:n; 
  eksp(k+1)=sum((sum(  rand(n,N)<p  )==k))/N; 
endfor  
toc
plot(0:n,eksp,"*", 0:n,binopdf(0:n,n,p ),"o")

Proces Poissona

Rozważamy przedział liczbowy \([0, T]\). Z przedziału tego wybieram losowo jeden punkt, jedną liczbę. Ponieważ wszystkie liczby są "równo rozłożone", więc prawdopodobieństwo tego, że punkt ten jest w przedziale \((t_1, t_2)\subset [0, T] \) wynosi

$$P(A)= p = \frac{t_2 -t_1}{T}$$


DEFINICJA

Procesem Poissona \(N(t)\) nazywamy proces stochastyczny o następujących wlasnościach:

  1. Przestrzenią stanów jest zbiór liczb całkowitych nieujemnych, \(X=\{k\}_0^{\infty}\; = \{0, 1, 2, \dots \}\)
  2. \(N(0) = 0 \; \) (proces startujący z zera)
  3. \(N(t_2) - N(t_1)\; \) jest liczbą punktów w przedziale \((t_1, t_2)\)
  4. \(N(t)\) ma stacjonarne i niezależne przyrosty na nieprzekrywających się przedziałach o rozkładzie prawdopodobieństwa
(1)$$Pr\{N(t_2) - N(t_1) =k\} = e^{-\mu (t_2 - t_1)} \; \frac{[\mu (t_2 - t_1)]^k}{k!}$$

Generowanie procesu Poissona

Realizacja procesu Poissona.

Ponieważ realizacja procesu Poissona jest dana przez niezależne punkty jednorodnie położone na odcinku \([0, T] \) to można wygenerować tę liczbe korzystając z rozkładu Poissona a następnie wygenerować położenie tych punktów na osi czasu zgodnie z rozkładem jednorodnym. Poniższy kod realizuje ten algorytm. Wykorzystana jest przy tym funkcja poissrnd wbudowana w system, która generuje punkty losowe z rozkładu Poissona \( e^{-\lambda} \; \frac{\lambda ^k}{k!}\)

clear all
T=15;
mu=1.3;
N=poissrnd(T*mu);
t=sort(T*rand(1,N));
x=1:(N);
 
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 
plot(t,x,"o-")

Proszę zwrócić uwagę na drugą i trzecią linie od końca skryptu, która służy wyłącznie do utworzenia wykresu schodkowego i dodaje "wewnętrzne" rogi schodków:

octave:218> t=[1,2,3];
octave:219> x=[5,6,7];
octave:220> t=reshape([t;t],[2*length(t),1])(2:2*length(t))
t =
   1
   2
   2
   3
   3
octave:221> x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1))
x =
 
   5
   5
   6
   6
   7
octave:223> [t,x]
ans =
 
   1   5
   2   5
   2   6
   3   6
   3   7


Inną i częściej spotykaną w praktyce możliwością generacji procesu Poissona jest generacja kolejnych punktów na osi czasu. Kolejne zdarzenia na osi czasu są z definicji procesu Poissona od siebie niezależne. Rozkład czasów miedzy dwoma kolejnymi punktami jest eksponencjalny \( p(t_i) = -\mu \; e^{-\mu t_i}\). Możemy więc wygenerować liczby losowe o rozkładzie eksponencjalnym i ich sekwencja zdefiniuje nam process Poissona.

Realizacja procesu Poissona
clear all
mu=1.3;
N=19;
t=exprnd (mu,1,N);
for i=2:N
 t(i)+=t(i-1);
endfor
x=1:(N);
 
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 
plot(t,x,"o-")


Funkcja korelacyjna procesu Poissona

Proces Poissona jest procesem skorelowanym o funkcji korelacji danej wzorem:

$$R(t_2, t_1) = \langle N(t_2) N(t_1)\rangle = \mu^2 \;t_2 \;t_1 + \mu \; \mbox{min}(t_2, t_1) $$


Funkcję korelacyjną można wyznaczyć bezpośrednio z definicji, dysponując wieloma realizacjami procesu losowego.

$$\langle N(t_2) N(t_1)\rangle = \frac{1}{N_r} \sum_{i=1}^{N_r} N(t_2) N(t_1) $$


Dla danych czasów \(t_1,t_2\) obliczamy wartość danej realizacji procesu Poissona

clear all
T=8;
mu=1.3;
Nr=2220;
 
t1=4;
t2=6.5;
corr=0;
for ii=1:Nr
  N=poissrnd(T*mu);
  t=[0,sort(T*rand(1,N)) ];
  corr+=(max(find(t<t1)) - 1) * ( max(find(t<t2))  -1 );
endfor
  corr/=Nr;
 
corr
mu^2*t1*t2+mu*min(t1,t2)

Proces urodzin i śmierci

W procesie urodzin, liczba osobników nie maleje. W rzeczywistości zachodzą też procesy śmierci, czyli ubytek osobników. Proces ten można uwględnić w relacji w następujący sposób:


$$N(t) = N(0) + \sum_{i} \xi_i \theta (t-t_i)\;$$


gdzie zmienne losowe \(\xi_i=\{1, -1\}\) są niezależne między sobą i są o identycznych rozkładach prawdopodobieństa:

$$P(\xi_i = 1) = p, \; \; \; P(\xi_i = -1) = q, \; \; \; p+q=1$$

Realizacja procesu urodzin i śmierci.
clear all
mu=1.3;
N=60;
p=0.5;
t=exprnd (mu,1,N);
x(1)=0;
for i=2:N
 t(i)+=t(i-1);
 x(i)=x(i-1)+((rand(1)>0.5)*2-1);
endfor
 
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 
plot(t,x,"o-")

Błądzenie przypadkowe

Błądzenie przypadkowego to proces losowy zdefiniowany w następujący sposób:

Rozważmy nieskończoną jednowymiarową sieć (łańcuch) o strukturze periodycznej, o okresie \(L\). Węzły sieci oznaczymy liczbami całkowitymi \(\{\dots, -2, -1, 0, 1, 2, \dots \}\). Odległość między węzłami wynosi \(L\). Niech cząstka w chwili początkowej \(t=0\) znajduje się w węźle oznaczonym umownie \(r=0\). Cząstka co pewien ustalony czas \(T\) wykonuje krok albo w prawo (zdarzenie \(A_1\)) albo w lewo (zdarzenie \(A_2\)). Niech prawdopodobieństwo kroku w prawo wynosi \(p\), a kroku w lewo \(q\), czyli\(P(A_1) =p, \; \; \; \; \;\;\;\;\; P(A_2) = q, \; \;\;\;\;\; \; \;p+q=1\),

Realizacja procesu błądzenia przypadkowego.
clear all
N=32;
p=0.5;
T=1.0;
x(1)=0;
t(1)=0;
for i=2:N
 t(i)=t(i-1)+T;
 x(i)=x(i-1)+((rand(1)>p)*2-1);
endfor
 
 
t=reshape([t;t],[2*length(t),1])(2:2*length(t));
x=reshape([x;x],[2*length(x),1])(1:(2*length(x)-1));
 
plot(t,x,"-")