Matlab modelowanie prostych eksperymentów losowych WYK.PAWEŁ DĘBEK ETI 9.1 Wykorzystanie funkcji rand - generatora liczb losowych, w który wyposaŝony jest MATLAB. WPROWADZENIE Najprościej mówiąc, wywołanie rand powoduje, Ŝe MATLAB "losuje" liczbę z przedzialu (0,1).» rand ans = 0.9501 Wywołanie rand(m,n) powoduje wylosowanie macierzy takich liczb:» rand(3,5) ans = 0.6068 0.7621 0.8214 0.7919 0.1763 0.4860 0.4565 0.4447 0.9218 0.4057 0.8913 0.0185 0.6154 0.7382 0.9355 1
Oczywiście wcale nie widać na pierwszy rzut oka, aby nasze liczby miały naprawdę jednostajny rozkład w przedziale (0,1). Spróbujmy to trochę zilustrować graficznie. Następujący fragment kodu generuje ciąg 100 liczb losowych z przedziału (0,1) i rysuje ten ciąg w układzie współrzędnych. (Oś OY zawiera wartości liczb losowych; wykres łączy kolejne punkty).» y = rand(1,100); x = [1:100]; plot(x,y) Oto wynik działania powyŝszego kodu Powtórzmy to samo dla 1000 wartości - wtedy lepiej zobaczymy efekt jednostajnego rozkładu» y = rand(1,1000); x = [1:1000]; plot(x,y) 2
Gdybyśmy chcieli nasze losowe wartości narysować naprawdę na odcinku (0,1) w postaci kółek, moglibyśmy uŝyć: x = rand(1,150); plot(x,ones(1,150),'o','markersize',6); ZASTOSOWANIE DO EKSPERYMENTÓW LOSOWYCH RZUT MONETĄ Wyobraźmy sobie, Ŝe chcemy przeprowadzić symulację serii rzutów monetą. Aby jakoś odnotowywać wyniki, przypiszmy zdarzeniu "wypadł orzeł" liczbę 1, a zdarzeniu "wypadła reszka" liczbę -1 (innymi słowy zdefiniowaliśmy zmienną losową o wartościach 1 i -1 przyjmowanych z równymi prawdopodobieństwami). ZałóŜmy, Ŝe chcemy symulować n rzutów. Wyniki odnotowywać będziemy w kolejnych współrzędnych wektora wierszowego x długości n. MoŜemy postąpić tak: jeśli w pojedynczym losowaniu funkcja rand zwróci liczbę większą od 1/2, uznamy, Ŝe wypadł orzeł. W przeciwnym wypadku uznamy, Ŝe wypadł orzeł. Rozkład jednostajny ma to do siebie, Ŝe prawdopodobieństwo wylosowania wybranej indywidualnej liczby jest równe zero, tak więc nie popełniamy tu Ŝadnego raŝącego błędu dzieląc przedział (0,1) na dwa podprzedziały, z których jeden jest otwarty, a drugi - półdomknięty. WaŜne, Ŝe oba przedziały mają tę samą długość równą 1/2. śeby trochę uatrakcyjnić zadanie, zaŝądajmy, aby MATLAB dodatkowo "wypisał" wszystkie orły i reszki w postaci ciągu liter O i R 3
%ilustracja 50 rzutów monetą n = 50; x = rand(1,n); for k = 1 : n if x(k)> 0.5 x(k) = 1; else x(k) = -1; end end %teraz jeszcze zilustrujmy to literkami O i R for k = 1:n if x(k) == 1 wyniki(k)='o'; else wyniki(k) = 'R'; end end disp(['liczba prób : ' num2str(n)]); disp(['liczba orłów: ' num2str(sum(x(x==1)))]); disp(['liczba reszek: ' num2str(-sum(x(x==-1)))]); disp(wyniki); A oto wyniki kilku wywołań naszego programu:» rzucmoneta Liczba prób : 50 Liczba orłów: 21 Liczba reszek: 29 RRRRRRRRRRORROOOORRROOORROROOOORORORRROOORORORRROR» rzucmoneta Liczba prób : 50 Liczba orłów: 31 Liczba reszek: 19 RROOOOOORORORROOROOOOROOOOOROORORRRROROROOROOOORRO» rzucmoneta Liczba prób : 50 Liczba orłów: 25 Liczba reszek: 25 RORROOROORORORORROORRRROROROOOROOOORROOORORRORRORR» rzucmoneta Liczba prób : 50 Liczba orłów: 29 Liczba reszek: 21 OROROOROORROOOOOORROOOOROOOOROORORORRRORRORRORROOR 4
LOSOWANIE Z URNY Wyobraźmy sobie, Ŝe urna zawiera 10 kul, podpisanych liczbami od 1 do 10 (tzn. pierwsza kula jest podpisana jako "1", druga jako "2" itd.). UŜyjemy funkcji rand do symulacji losowania ze zwracaniem pojedynczej kuli z urny. (Dlatego ze zwracaniem, Ŝe chcemy za chwilę zamodelować serię losowań z tymi samymi prawdopodobieństwami otrzymania poszczególnych kul). ZauwaŜmy, Ŝe moŝemy w prosty sposób "przerobić" wynik zwracany przez funkcję rand na liczbę naturalną z zakresu [1..10] tak, aby wylosowanie kaŝdej z takich liczb miało prawdopodobieństwo 1/10: jeśli jeśli 0<x<1, to część całkowita liczby y=1+10x jest liczbą naturalną z wymaganego zakresu. MoŜna łatwo uzasadnić, Ŝe jeśli x ma rozkład jednostajny w (0,1), to y przyjmuje wartości ze zbioru {1,,10} z jednakowymi prawdopodobieństwami. Tak więc nasze losowanie kuli moŝna zakodować tak:» x = rand x = 0.1703 EDU» y = fix(1+10*x) y = 2 Oczywiście moŝna to samo zrobić inaczej, np. pisząc zagnieŝdŝoną instrukcję if itp. Jednak opisane wyŝej rozwiązanie jest najprostsze. Jeśli mamy dokonać np. 50 losowań ze zwracaniem, wystarczy zapamiętywać wylosowane wartości w kolejnych współrzędnych wektora, tak jak przy rzucie monetą. Wyobraźmy sobie teraz, Ŝe po kaŝdorazowym wylosowaniu kuli z urny otrzymujemy kwotę złotych równą liczbie napisanej na kuli. Wobec tego moŝemy w kaŝdym losowaniu otrzymać od 1 do 10 złotych (na liście zadań dodatkowo masz załoŝenie, Ŝe trzeba płacić za kaŝde losowanie!). Zobaczmy, jak wyglądałby wykres naszej wygranej w grze złoŝonej ze 100 losowań (oczywiście będzie to krzywa rosnąca). 5
%losowanie jednej z 10 kul z urny; kule są ponumerowane od 1 do 10 %po kaŝdym losowaniu otrzymujemy kwotę w zł = liczbie na kuli %wykresy obrazują wygraną w kaŝdej z 50 prób %oraz łączną wygraną n = 100; x = [1:n]; r = fix(1+10*rand(1,n)); %funkcja cumsum podaje sumy częściowe wektora %np. jeśli y = [2 3 4 9], to cumsum(y) = [2 5 9 18] lacznawygrana = cumsum(r); subplot(2,1,1); plot(x,r,'ro:','linewidth',0.5,'markersize',3); title('losowanie ze zwracaniem jednej z 10 kul z urny'); xlabel('nr losowania');ylabel('wynik losowania'); axis([1 n 0 11]); subplot(2,1,2); plot(x,lacznawygrana,'b-','linewidth',2); xlabel('liczba losowań');ylabel('suma liczb od początku'); axis([1 n 0 11*n]); shg; 6
PRZYKŁAD 1 Prosta symulacja rzutów monetą (rand) WYNIK >> Liczba prób : 50 Liczba orłów: 24 Liczba reszek: 26 OROROORROROOOORROORORRORRRRORRRORORROOROOROROOORRR >> 7
PRZYKŁAD 2 URNA Graficzna ilustracja losowania ze zwracaniem (rand, plot) WYNIK GRAFICZNY 8
9