ELEC-C5210 Satunnaisprosessit tietoliikenteessä Harjoitus M1, 16.3.2017 1. Syntaksista, vektoreista ja matriiseista: Tehtävän eri kohdat on tehtävä järjestyksessä. Myöhemmissä kohdissa oletetaan, että aiemmin määritellyt muuttujat ovat yhä muistissa. a) Kokeile mitä seuraavat komennot tekevät: a = [1,2,3] b = [4;5;6] C = [1,2,3; 4,5,6; 7,8,9]; C.' d = [a; b.'; C].' d(:) Huomaa, että voit estää tuloksen näkymisen ruudulla lopettamalla komennon puolipisteeseen. Kokeile, mitä komennot length, size ja numel kertovat äsken määritellyistä vektoreista ja matriiseista (esim. length(a)). b) Tutkitaan erilaisia vektoreiden kertolaskuoperaatioita. Selvitä, mitä eroa on komennoilla: a*b b*a a.*b.' c) Esimerkkejä kompleksisten muuttujien käsittelystä: z = a(:)+1i*b(:) x = real(z) y = imag(z) Mitä eroa on seuraavilla komennoilla? z' z.' conj(z) d) Tutustu matriisin alkioihin viittaamiseen: C(:,1) C(2,:) C(3,3) C(4) diag(c) diag(c(:,1)) Matriisin alkioihin voi viitata myös niin kutsuttujen loogisten matriisien avulla. Kokeile ensin komentoja: 1
C>=5 D = C<6 & C =2 Yllä mainitut komennot generoivat loogisen matriisin. Koeta nyt viitata matriisin alkioihin käyttäen loogisia matriiseja: C(D) C(C>5 C==1) C(isprime(C)) Testaa, toimiiko seuraava viittaus: E = [1,0,1; 1,1,0; 0,0,0]; C(E) Mitä eroa on matriiseilla D ja E? Kokeile komentoja whos D ja whos E. e) Kokeile vielä seuraavia komentoja: clc zeros(2,3) ones(4,1) eye(3) linspace(0,10,6) v = 0:0.2:1.8 reshape(v,2,5) F = repmat(a,4,1) F - ones(4,1)*a Voit kutsua työmuistissa (Workspace) olevia muuttujia kirjoittamalla kyseisen muuttujan nimen. Viimeisimmän kohteettoman komennon tulos tallentuu ans nimiseen muuttujaan. Työmuistin voi tyhjentää clear komennolla. Voit kirjoittaa help komento tai doc komento saadaksesi tietoa komennon käytöstä. Kirjoittamalla komennon help? saat esiin hyödyllisen listan MATLABin eri operaattoreista sekä linkit niiden dokumentaatioihin. 2. Funktiot, skriptit ja kuvaajat: MATLAB-koodia voidaan suorittaa suoraan komentoriville kirjoittamalla. Suositeltavampaa on kuitenkin kirjoittaa koodi joko funktioksi tai skriptiksi tiedostoihin, jolloin koodia voi helposti muokata ja ajaa uudelleen. a) Avaa MATLABin tekstieditori komennolla edit. Kirjoita seuraava funktio, ja tallenna se rayleighpdf.m nimiseen tiedostoon: function rpdf = rayleighpdf(x,sigma) x(x<0) = 0; rpdf = (x/sigmaˆ2).*exp(-x.ˆ2/(2*sigmaˆ2)); Ajetaan funktio ja piirretään kuva antamalla seuraavat komennot: x = 0:0.01:10; y = rayleighpdf(x,2); plot(x,y); 2
b) Tutustutaan seuraavaksi muutamiin tapoihin, joilla edellisessä kohdassa tuotetun kuvan ulkoasua voidaan muokata. Komennolle plot voidaan antaa syötteinä esimerkiksi haluttu viivatyyli. Kokeile seuraavia vaihtoehtoja: plot(x,y,'r'); plot(x,y,':','color',[0,0.5,0]); plot(x,y,'b--','linewidth',2); hold on; plot(x(1:30:),y(1:30:),'bo','markersize',6,'linewidth',2); Komento grid lisää kuvan taustalle koordinaattiviivat. Kuva ja sen akselit voidaan otsikoida seuraavasti: title('rayleigh-jakauman tiheysfunktio (\sigma=2)'); xlabel('x'); ylabel('f(x)'); Akselien alku- ja loppupisteitä voidaan muuttaa muun muassa komennoilla xlim, ylim ja axis. Kokeile komentoa xlim([0,8]). c) Kirjoitetaan seuraavaksi skripti, joka hyödyntää aiemmin määriteltyä funktiota ja plottaa käyrän useammalla eri parametrin σ arvolla samaan kuvaan. Tallenna alla annettu skripti tiedostoon rayleighplot.m: clear all; sigma = [0.5,1:4]; x = 0:0.01:10; N = length(sigma); y = zeros(n,length(x)); sigma str = cell(n,1); solutaulukko kayrien selitteille Lasketaan kayrat eri parametrin arvoilla matriisiin y ja maaritetaan kayrien selitteet solutaulukkoon for k=1:n y(k,:) = rayleighpdf(x,sigma(k)); sigma str{k} = ['\sigma=',num2str(sigma(k))]; plot(x,y,'linewidth',2); grid; title('rayleigh-jakauman tiheysfunktio','fontsize',16); xlabel('x'); ylabel('f(x)'); h leg=leg(sigma str); set(h leg,'fontsize',20) Aja skripti painamalla F5-näppäintä. Käy skripti läpi siten, että ymmärrät kaikki siinä käytetyt komennot. Käytä komentoa help, jos tarvitset lisää tietoa jostain skriptin komennoista. Skriptissä on lisätty kuvaan käyrien selitteet komennolla leg. Tälle komennolle on annettu syötteenä solutaulukko. Yhteen solutaulukkoon voi tallentaa useampia erityyppisiä muuttujia. Se soveltuu hyvin esimerkiksi useampien eripituisten merkki- 3
jonojen kanssa käytettäväksi. Solutaulukon soluihin viitataan kuten matriisin alkioihinkin, mutta solujen sisältöön viitataan käyttäen aaltosulkeita. Tämän eron huomaa esimerkiksi komennoilla iscell(sigma str(1)) ja iscell(sigma str{1}). Voit koettaa komentoa ischar vastaavilla syötteillä. Käyrien selitteet voi asettaa myös komennolla: leg(merkkijono1,merkkijono2,merkkijono3,...); Yllä olevassa skriptissä käytetään myös for-silmukkaa. Muita silmukka- ja ehtorakenteita, joita voi hyödyntää skripteissä, ovat while, if ja switch. Näiden syntaksiin voi tutustua tarvittaessa tarkemmin dokumentaation avulla. Kaikki kurssin MATLAB-tehtävät kannattaa jatkossa tallentaa omiin tiedostoihinsa skripteinä. Kirjoittamasi funktiot kannattaa tallentaa yhteen hakemistoon. Funktioita voi myöhemmin kutsua työhakemistosta riippumatta, jos lisäät hakemiston MATLABin polkuun komennolla addpath hakemiston polku; Kirjoittaessasi koodia on järkevää kommentoida mahdollisimman tarkasti, mitä mikäkin rivi tekee. MATLABissa -merkillä saa kommentoitua loppurivin. Skripteissä kannattaa yleensä kirjoittaa ensimmäiseksi komennoksi clear all, joka poistaa muistista kaikki muuttujat. Tämä varmistaa sen, että skriptiä voi ajaa monta kertaa peräkkäin ilman ongelmia. 3. Satunnaisluvut ja tiheysfunktiot: MATLABissa on valmiina monia funktioita satunnaislukujen generointiin eri jakaumista. Tässä tehtävässä tutustutaan muutamaan yleisimmin tarvittaviin. Tiettyyn jakaumaan liittyviä funktioita voi etsiä kätevimmin komennon doc avulla. a) Komento rand(m,n) generoi M N-matriisin tasajakautuneita satunnaislukuja väliltä (0, 1) eli jakaumasta Tas(0, 1). Miten saat generoitua tasajakautuneita lukuja väliltä (0, 2)? Entä väliltä ( 1, 0) tai väliltä ( 2, 5)? b) Muita usein käytettyjä komentoja ovat randi, joka generoi tasajakautuneita kokonaislukuja, sekä randn, jolla tuotetaan satunnaislukuja standardi normaalijakaumasta eli N (0, 1) jakaumasta. Selvitä itsellesi, miten näitä komentoja käytetään. Miten saat generoitua normaalijakautuneita lukuja esimerkiksi odotusarvolla µ = 2 ja keskihajonnalla σ = 1.5? Tarkastele generoimiesi lukujen jakaumaa komennolla hist. c) Tutustu valmiiksi annetun funktion estpdf toimintaan. Funktion avulla voi estimoida ja piirtää empiirisen tiheys- tai kertymäfunktion annetulle datajoukolle. Funktiota tullaan käyttämään sekä tämän harjoituksen kotitehtävissä että myöhemmissä MATLABharjoituksissa. function [f,x] = estpdf(data,type,varargin) ESTPDF Empiirinen tiheys- ja kertymäfunktio [f,x] = estpdf(data) laskee empiirisen tiheysfunktion f havaintoaineistosta data siten, että laskennassa käytettävä jakoväli on 2*IQR*Nˆ(-1/3), missä N on havaintojen lukumäärä 4
ja IQR havaintojoukon kolmannen ja ensimmäisen kvartiilin erotus. Laskentavälien keskipisteet palautetaan vektorissa x. [f,x] = estpdf(data,type), jossa type on joko 'pdf' tai 'cdf' määrittää lasketaanko tiheysfunktio vai kertymäfunktio. [f,x] = estpdf(data,type,m) määrittää laskentavälien lukumääräksi M. estpdf(data,...) plottaa tiheys- tai kertymäfunktion. estpdf(data,type,style) tai estpdf(data,type,m,style) käyttää plottauksessa viivatyyliä style (oletusarvo: 'b-.'). Parametrin style tilalla tai sen jälkeen voidaan antaa vastaavia parametri/arvo -pareja kuin plot-komennollekin. Esimerkiksi estpdf(data,'cdf','r--','linewidth',2) plottaa empiirisen kertymäfunktion määrittäen itse sopivan laskentapisteiden määrän ja käyttäen punaista katkoviivaa leveydeltään 2. data = data(:); N = length(data); if nargin<2 type = 'pdf'; Määritetään laskentapisteiden lukumäärä if nargin>2 && ischar(varargin{1}) Nbins = varargin{1}; if nargin>3 varargin = varargin(2:); else Nbins = ceil(range(data)/(2*iqr(data)*nˆ(-1/3))); Lasketaan empiirinen jakauma (normalisoimaton) [pdf,x] = hist(data,nbins); Lasketaan pisteväli dx = x(2)-x(1); Normalisoidaan tiheysfunktio pdf = pdf/(n*dx); Lisätään alkuun ja loppuun pisteet, joissa tiheysfunktio on nolla. Myös kertymäfunktio saadaan näin alkamaan nollasta. x = [x(1)-dx,x,x()+dx]; pdf = [0,pdf,0]; Lasketaan kertymäfunktio cdf = cumsum(pdf)/sum(pdf); Valitaan palautetaanko tiheys- vai kertymäfunktio. Koska kumulatiivinen summa päättyy aina laskentavälin loppuun, mutta x sisältää välien keskipisteet, täytyy myös vektoria x siirtää. switch type case 'pdf' fnct = pdf; case 'cdf' fnct = cdf; 5
x = x+dx/2; Plotataan tai palautetaan laskettu funktio if nargout==0, if nargin<3 ischar(varargin{1}) varargin{1} = '-b.'; plot(x,fnct,varargin{:}); else f = fnct; 4. Generoi n = 10 000 satunnaislukua eksponenttijakaumasta Exp(λ = 1/µ) parametrilla µ = E[X] = 2. Käytä MATLAB-komentoa exprnd. Piirrä samaan kuvaan empiirinen tiheysfunktio, empiirinen kertymäfunktio, todellinen tiheysfunktio ja todellinen kertymäfunktio. Käytä valmiiksi annettua funktiota estpdf empiirisen tiheys- ja kertymäfunktion laskemiseen. Anna estpdf-funktion päättää jakauman tarkastelupisteiden lukumäärä. Älä käytä MATLABin valmiita funktioita (exppdf, expcdf) tiheys- ja kertymäfunktion laskemiseen vaan kirjoita koodi itse. Eksponenttijakauman tiheysfunktio on { 1 x µ f(x) = e µ, x 0 0, muulloin, missä µ > 0. Johda eksponenttijakauman kertymäfunktio tiheysfunktiosta integroimalla kynän ja paperin avulla. Plottaa kaikki käyrät samaan kuvaan (komento: hold) eri viivatyyleillä (ks. eri viivatyylit dokumentaatiosta: help plot). Lisää kuvaan otsikko ja x- ja y-akselien nimet (title, xlabel, ylabel). Lisää vielä lopuksi kuvaan selitteet, joista näkee, mitä kukin käyrä edustaa (leg). 5. Heitetään tasapuolista kolikkoa (H = kruuna ja T = klaava), kunnes saadaan ensimmäisen kerran tietty 3 heiton pituinen jono, esim. HT T. Tällöin esimerkiksi, jos kolikonheittosarja olisi HT HHT HHHT T, heittojen lukumäärä olisi 10. a) Simuloi 100000 yllä kuvattua satunnaiskoetta MATLAB:lla ja laske keskimääräinen heittojen lukumäärä, kunnes saadaan jono HT H. Yksittäinen satunnaiskoe siis loppuu, kun jono HT H esiintyy ensimmäisen kerran, minkä jälkeen aloitetaan uusi satunnaiskoe tyhjästä. Laske ja piirrä myös tarvittavien heittojen histogrammi. b) Simuloi 100000 yllä kuvattua satunnaiskoetta MATLAB:lla ja laske keskimääräinen heittojen lukumäärä, kunnes saadaan jono HT T. Laske ja piirrä myös tarvittavien heittojen histogrammi. 6