Matlab-perusteet Harjoitustehtävien ratkaisut Osa 1 Tehtävä: Määrittele muuttujat a ja b, anna niille vaikkapa arvot 3 ja 2 ja kokeile peruslaskutoimituksia niillä. >>a=1;b=2; >>a+b 3 >>a-b -1 >>a*b 2 >>a/b 0.5000 Tehtävä: Kokeile korottaa pelkkä vakio i tai j toiseen potenssiin. Mikä on tulos? >>i*i -1 >>j.^2-1 Tehtävä: Laske luvun z=3+4i liittoluku, itseisarvo, reaaliosa, imaginääriosa ja vaihekulma. >>z=3+4i z = 3.0000 + 4.0000i >>conj(z) 3.0000-4.0000i >>abs(z) 5 >>angle(z) 0.9273
>>real(z) 3 >>imag(z) 4 Tehtävä: Tee vektori x, joka sisältää kokonaisluvut 1-5 ja vektori y, joka sisältää luvut 6 10. Kokeile yhteen-, vähennys, kerto- ja jakolaskuja. Mitä tapahtui? >>x=[1:5] x = 1 2 3 4 5 >>y=[6:10] y = 6 7 8 9 10 >>x+y 7 9 11 13 15 >>x-y -5-5 -5-5 -5 >>x*y??? Error using ==> mtimes Inner matrix dimensions must agree. >>x/y 0.3939 >>x\y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2000 1.4000 1.6000 1.8000 2.0000 >>x.*y 6 14 24 36 50 >>x./y 0.1667 0.2857 0.3750 0.4444 0.5000 Tehtävä: Selitä, mitä seuraavat operaatiot tekevät: x*y x *y >>x*y' 130 >>x'*y 6 7 8 9 10 12 14 16 18 20
18 21 24 27 30 24 28 32 36 40 30 35 40 45 50 Tehtävä: Tee Matlabilla vektorit, jossa on alkiot a) 2, 4, 6, 8,..., 20 b) 10, 8, 6, 4, 2, 0, -2, -4,..., -10 c) 1, 1/2, 1/3, 1/4, 1/5,..., 1/10 d) 0, 1/2, 2/3, 3/4, 4/5,..., 9/10 >>[2:2:20]; >>[10:-2:-10]; >>1./[1:10]; >>[0:9]./[1:10] Tehtävä: Käytä edellä määriteltyä matriisia a. Tee myös vaakavektori b, joka sisältää luvut 1, 2 ja 3. Mitä laskutoimituksia a:n ja b:n välillä voi tehdä? >>a=[1 2 3;4 5 6;7 8 9] a = 1 2 3 4 5 6 7 8 9 >>b=[1 2 3] b = 1 2 3 >>a+b??? Error using ==> plus Matrix dimensions must agree. >>a*b??? Error using ==> mtimes Inner matrix dimensions must agree. >>a/b 1.0000 2.2857 3.5714 >>a\b??? Error using ==> mldivide Matrix dimensions must agree. >>a*b' 14 32 50 >>a'*b??? Error using ==> mtimes Inner matrix dimensions must agree. >>b*a 30 36 42
>>b'*a??? Error using ==> mtimes Inner matrix dimensions must agree. Tehtävä: Matlabissa on valmiina joukko komentoja, joilla voidaan tehdä tiettyjä erikoismatriiseja. Tällaisia on esimerkiksi ones(n), zeros(n), eye(n), magic(n) jne. Mitä nämä komennot tekevät? Kirjaimen n tilalla on oltava positiivinen kokonaisluku. >>ones(3) 1 1 1 1 1 1 1 1 1 >>zeros(3) 0 0 0 0 0 0 0 0 0 >>eye(3) 1 0 0 0 1 0 0 0 1 >>magic(3) 8 1 6 3 5 7 4 9 2 Tehtävä: Ratkaise Matlabilla yhtälöryhmä x 1 + x 2 + x 3 = 10 0.45x 1 + 0.55x 2 + 0.7x 3 = 6.45 0.35x 1 + 0.3x 2 + 0.2x 3 = 2.35 >>A=[1 1 1;0.45 0.55 0.7;0.35 0.3 0.2] A = 1.0000 1.0000 1.0000 0.4500 0.5500 0.7000 0.3500 0.3000 0.2000 >>x=[10 6.45 2.35]' x = 10.0000 6.4500 2.3500 >>A\x 1.0000 2.0000 7.0000
Tehtävä: Maalifirmalla on ylijäämä neljää erilaista vihreän sävyn maalia, joissa on neljää pigmenttiä prosentteina seuraavasti: Maali 1 Maali 2 Maali 3 Maali 4 Pigmentti 1 80 0 30 10 Pigmentti 2 0 80 10 10 Pigmentti 3 16 20 60 72 Pigmentti 4 4 0 0 8 >>A=[80 0 30 10;0 80 10 10;16 20 60 72;4 0 0 8] A = 80 0 30 10 0 80 10 10 16 20 60 72 4 0 0 8 x=[40 27 31 2]' x = 40 27 31 2 >>A\x 0.4000 0.3000 0.2500 0.0500 Osa 2 Tehtävä: Tee 4x4-kokoinen satunnaislukumatriisi X, joka sisältää kokonaislukuarvoja väliltä 0 100. >>round(rand(4)*100) 95 89 82 92 23 76 44 74 61 46 62 18 49 2 79 41 Tehtävä: Laske edellisen tehtävän matriisin X alkioitten summa a) Riveittäin b) Sarakkeittain c) Koko matriisin alkioiden summa >>X=ans;
>>sum(x) 228 213 267 225 >>sum(x,2) 358 217 187 171 >>sum(sum(x)) 933 Tehtävä: Talleta matriisin X alkiot 16 alkion mittaiseen vaakavektoriin Y ja lajittele alkiot järjestykseen suurimmasta pienimpään. >>Y=reshape(X,1,16); Tehtävä: Talleta matriisin X alkiot 16 alkion mittaiseen vaakavektoriin Y ja lajittele alkiot järjestykseen suurimmasta pienimpään. >>sort(y,'descend') Columns 1 through 13 95 92 89 82 79 76 74 62 61 49 46 44 41 Columns 14 through 16 23 18 2 Tehtävä: Laske positiivisen kokonaisluvun n kertoma n!=1*2*3*4*..n >>x=[1:5];prod(x) 120 Tehtävä: Muuta piin likiarvo merkkijonoksi.käyttämällä Matlabin sisäistä vakiota pi ja määritä tuloksena saadun merkkijonon pituus. >>length(num2str(pi)) 6 Tehtävä: Vektori X sisältää alkiot -10 5 0 2 8 4 3 9-5. Laske vektorin positiivisten ja negatiivisten alkioiden summat >>X=[-10 5 0 2 8 4 3 9-5] X = -10 5 0 2 8 4 3 9-5 >>sum(x(x>0))
31 >>sum(x(x<0)) -15 Tehtävä: Täytä vektori sadalla satunnaislukuarvoilla väliltä 0 1. Laske niiden lukujen määrä jotka ovat välillä 0.3 0.7. >>x=rand(1,100); >>sum(x>=0.3 & x<=0.7) 47 Tehtävä: Piirrä seuraavien funktioiden kuvaajat omiin ikkunoihinsa. a. exp(-x²) b. ln(x²+x+1) c. x sin(2x²+1) d. exp(sin(3x)) - 1 >>x=[-10:.1:10]; >>plot(x,exp(-x.^2)) >>plot(x,log(x.*x+x+1)); >>plot(x,x.*sin(2*x.^2+1)); >>plot(x,x.*sin(3*x)-1); Tehtävä: Oheisessa taulukossa on luokan HYV6SN Olio-ohjelmoinnin kurssin arvosanat. Piirrä arvosanojen jakauma käyttäen Matlabin histogrammia. Lisää histogrammiin otsikko ja nimeä akselit.. Arvosanat: 4 4 3 3 0 1 0 3 0 4 2 1 0 5 4 1 4 1 2 0 >>arvosana=[4 4 3 3 0 1 0 3 0 4 2 1 0 5 4 1 4 1 2 0]; >>hist(arvosana,[0:5]) Osa 3 Tehtävä: Luo satunnaislukuja sisältävä 4x4-matriisi ja oman nimesi sisältävä merkkijono. Tallenna muuttujat tiedostoon binäärimuodossa. Tyhjennä kaikki käytössä olevat muuttujat ja lataa ne takaisin tiedostosta. >>X=rand(4); >>s='helmut recknagel'; >>save Saving to: matlab.mat >>clear
>>load Loading from: matlab.mat Tehtävä: Lataa kurssin kotisivulta edellä esitetty data ja tallenna se Matlabin työhakemistoon (oltava kirjoitusoikeudet!). Kopioi data kahteen erilliseen vektoriin vuosi ja co2. Piirrä edellä esitetty kuvaaja. Tehtävä: Kuinka paljon pitoisuus on noussut 1700 luvun alusta 2000-luvun lopulle prosenteissa? Tehtävä: Laske havaintojen lukumäärät ja keskimääräiset hiilidioksidipitoisuudet 50 vuoden aikavälein lähtien vuodesta 1800. Tehtävä: Milloin CO2-pitoisuus on laskenut eniten kahden peräkkäisen mittauksen välillä? Kuinka paljon tämä lasku oli? Tehtävä: Mikä on suurin CO2-pitoisuuden nousu prosenteissa kahden peräkkäisen mittauksen välillä? Tehtävä: Tallenna muuttujat vuosi ja co2 erillisiin tiedostoihin tekstimuodossa. Tarkista tallennuksen onnistuminen tutkimalla tiedostojen sisältöä jollain tekstieditorilla (Notepad ). >>load carb_dio.txt >>vuosi=carb_dio(:,1); >>co2=carb_dio(:,2); >>plot(vuosi,co2,'.') >>title('hiilidioksin määrä ilmakehässä') >>xlabel('vuosi') >>ylabel('co2 (ppm)') >>(co2(end)-co2(1))/co2(1)*100 30.3578 >>sum(vuosi>=1800 & vuosi < 1850) 4 >>mean(co2(vuosi>=1800 & vuosi < 1850)) 285.2750 >>%jne... >>erotus=diff(co2); >>min(erotus) -1 >>vuosi(erotus==min(erotus)) 1899
Tehtävä: Sovellusohjelmat-kurssin kokeessa opiskelijat saivat pisteitä seuraavasti: Ankka Aku 7 Ankka Roope 14 Hiiri Mikki 18 Hopo Hessu 3 >>fid=fopen('tulokset.xls','w') >>fprintf(fid,'%s %d','ankka Aku',7); >>fprintf(fid,'%s %d','ankka Roope',14); >>fprintf(fid,'%s %d','hiiri Mikki',18); >>fprintf(fid,'%s %d','hopo Hessu',3); >>fclose(fid) Tehtävä: Lue tekemäsi tulokset.txt-tiedoston sisältö käyttäen textscan-funktiota. Laske arvosanojen keskiarvo >>fid=fopen('tulokset.xls','r'); >>tulokset=textscan(fid,'%s %s %d',-1) tulokset = {4x1 cell} {4x1 cell} [4x1 int32] >>mean(tulokset{:,3}) 10.5000 >>fclose(fid); Tehtävä: Henry Cavendish mittasi maapallon keskimääräisen tiheyden vuonna 1798 torsioheilurin avulla. Kurssin sivulta löytyvässä tiedostossa density_tab.txt on listattu Cavendishin mittaustulokset (29 kpl) yksiköissä g/cm 3. Piirrä mittaustuloksista histogrammi. Mille tiheysvälille sijoittuu suurin osa mittaustuloksista ja kuinka monta arvoa kyseiselle välille osuu? >>fid=fopen('density_tab.txt','r') >>data=textscan(fid,'%f',-1,'headerlines',3) data = [29x1 double] >>hist(data{:,1}) >>mean(data{:,1}) 5.4197 >>std(data{:,1})/2 0.1694 >>fclose(fid); Tehtävä: Tallenna tulokset.txt-tiedosto tulokset.xls-tiedostoksi. Tutki Excelillä, onnistuiko tiedoston tallennus. >>fid=fopen('tulokset.xls','r'); >>tulokset=textscan(fid,'%s %s %d',-1) tulokset = {4x1 cell} {4x1 cell} [4x1 int32] >>xlswrite('tulokset.xls',tulokset{:,1},'a1:a4') >>xlswrite('tulokset.xls',tulokset{:,2},'b1:b4') >>xlswrite('tulokset.xls',tulokset{:,3},'c1:c4')