138 3 37MB
Serbian Pages [390] Year 2022
Prof. dr Igor Đurović
MATLAB - SMETOVI
Podgorica 2023
PREDGOVOR PRIJE PREDGOVORA Danas, već davne, 1998.me godine izdali smo veoma dobro prihavećeni udžbenik “MATLAB for windows”. Ideja je bila da se udžbenik unaprijeđuje kako se unaprijeđuje odnosni programski alat. Mijenjane su i dopisivane pojedinje glave ovoga udžbenika. Međutim, kako to često biva, brzina promjene MATLAB-a, te druge obaveze spriječile su nas da priredimo i objavimo nova izdanja ove knjige. Ipak, tokom vremena za držanje različitih kurseva (Digitalna obrada slike, Teorija informacija i kodova, Matematički programski alati, Multimedije, itd.) dopisivani su korisni materijali. Stoga sam odlučio da u formi nekomercijalnog, nerecenziranog materijala predam ovaj udžbenik čitaocima. Najveći dio je preuzet iz prethodnog udžbenika (sa neophodnim promjenama), dodati su djelovi koji su napisani za edukaciju u gore pomenitih kursevima, dopisano je nekoliko poglavlja, nekoliko poglavlja je preuzeto prilagođeno iz MATLAB-ove dokumentacije, drugih tekstova i knjige. Grubo govoreći oko 90% materijala je autorsko djelo dok 10% nije. Premda ne smatram da ću raditi na dopunama i ispravkama ovoga materijala svi čitaoci su slobodni da me kontaktiraju na email [email protected]. Napominjem da su svi kodovi testirani ali u varijantama MATALAB-a koje smo imali na raspolaganju u datom momentu a taj momenat se prostro na gotovo 25 godina pa postoji mogućnost da nešto od ovoga neće raditi kod čitaoca. Konačno termin “SMET” u naslovu ovog materijala podrazumijeva sniježni nanos a u ovom slučaju nanos materijala u MATLAB-u koji se prikupio za 25 godina i koji možda nije na pravi način sistematizovan. Autor/Priređivač Igor Đurović
SADRŽAJ SADRŽAJ ......................................................................................................................i UMJESTO PREDGOVORA ..................................................................................................................... 1 KAKO POČETI RAD U MATLABU ......................................................................................................... 2 GLAVA PRVA OSNOVNE FUNKCIONALNOSTI MATLABA ....................................................................................... 4 1.1. UNOŠENJE PODATAKA .............................................................................................................. 4 1.2. FORMIRANJE MATRICA SPECIJALNE STRUKTURE ............................................................ 5 1.3. FUNKCIJE OPŠTE NAMJENE...................................................................................................... 6 1.3.1. OPERATORI ZA POMOĆ U RADU ............................................................................................. 6 1.3.2. INFORMACIJE O VARIJABLAMA I FAJLOVIMA ................................................................... 7 1.3.3. ČUVANJE I BRISANJE PODATAKA .......................................................................................... 9 1.3.4. INFORMACIJE O SISTEMU ....................................................................................................... 10 1.4. ISKAZI I VARIJABLE ................................................................................................................. 11 1.5. BROJEVI I ARITMETIČKI IZRAZI ........................................................................................... 12 1.6. KOMPLEKSNI BROJEVI I MATRICE ....................................................................................... 12 1.7. IZLAZNI FORMAT ................................................................................................................... 14 1.8. GENERISANJE VEKTORA POMOĆU OPERATORA : (DVIJE TAČKE) .............................. 15 1.9. INDEKSI I MANIPULACIJA VRSTAMA I KOLONAMA ....................................................... 17 GLAVA DRUGA ELEMENTARNE OPERACIJE SA MATRICAMA I POLJIMA BROJEVA ........................................ 21 2.1. TRANSPONOVANJE ................................................................................................................... 21 2.2. SABIRANJE I ODUZIMANJE ..................................................................................................... 22 2.3. MNOŽENJE MATRICA ............................................................................................................... 23 2.4. MNOŽENJE POLJA BROJEVA .................................................................................................. 24 2.5. DETERMINANTA I INVERZNA MATRICA ............................................................................ 24 2.6. “DILJENJE” MATRICA ............................................................................................................... 25 2.7. DIJELJENJE POLJA BROJEVA .................................................................................................. 26 2.8. STEPENOVANJE MATRICA ...................................................................................................... 27 2.9. STEPENOVANJE POLJA BROJEVA ......................................................................................... 28 2.10. ELEMENTARNE MATEMATIČKE FUNKCIJE ....................................................................... 29 2.10.1. FUNKCIJE ABS, ANGLE, REAL, IMAG, CONJ I INWRAP .................................................... 30 2.10.2. FUNKCIJE ZA ZAOKRUŽIVANJE ............................................................................................ 31 2.10.3. EKSPONECIJALNA, LOGARITAMSKA, STEPENA I FUNKCIJA KVADRATNOG KORJENA............................................................... 32 2.10.4. TRIGONOMETRIJSKE, HIPERBOLNE I NJIMA INVERZNE FUNKCIJE ............................ 34 2.10.5. BESSELOVE, BETA, GAMA I FUNKCIJE GREŠKE ............................................................... 35 2.10.6. SPECIFIČNE NUMERIČKE FUNKCIJE .................................................................................... 37 2.11. FUNKCIJE ZA MANIPULACIJU MATRICAMA ...................................................................... 38 GLAVA TREĆA GRAFIKA ................................................................................................................... 40 3.1. GRAFIČKO PREDSTAVLJANJE VEKTORA, MATRICA I FUNKCIJA JEDNE PROMJENLJIVE ................................................................... 40 3.1.1. OSNOVNI OBLIK ................................................................................................................... 40 3.1.2. VIŠE FUNKCIJA NA JEDNOM GRAFIKU ............................................................................... 41 3.1.3. VRSTE LINIJA I OZNAKA ......................................................................................................... 43 3.1.4. OZNAČAVANJE OSA I GRAFIK ............................................................................................... 44 3.1.5. GRAFICI KOMPLEKSNIH FUNKCIJA ..................................................................................... 45 3.1.6 SKALIRANJE OSA ................................................................................................................... 45 i
3.1.7. GRAFICI POLARNIH FUNKCIJA .............................................................................................. 46 3.1.8. GRAFICI SA LOGARITAMSKOM PODJELOM ....................................................................... 47 3.1.9. STEPENASTI (BAR) GRAFICI ................................................................................................... 48 3.1.10. PRIKAZ DISKRETNIH VELIČINA ............................................................................................ 48 3.1.11. POPUNJENI CRTEŽI ................................................................................................................... 49 3.1.12. GRAFICI KOMPLEKSNIH VELIČINA ...................................................................................... 49 3.1.13. GRAFICI SA POKRETNIM KRAJEM ........................................................................................ 50 3.2. GRAFIČKO PREDSTAVLJANJE FUNKCIJA DVIJE PROMJENLJIVE I MATRICA ........... 50 3.2.1. TRODIMENZIONI LINIJSKI CRTEŽ ......................................................................................... 50 3.2.2. TRODIMENZIONI GRAFICI MREŽASTIH POVRŠI ............................................................... 51 3.2.3. GRAFICI OBOJENIH POVRŠI.................................................................................................... 52 3.2.4. KONTURNI GRAFICI ................................................................................................................. 53 3.2.5. PRIKAZIVANJE FUNKCIJA POMOĆU KOLORNIH MAPA .................................................. 55 3.2.6. PRIKAZIVANJE CILINDARA I SFERA .................................................................................... 56 3.3. GRAFIČKI PRIKAZ FUNKCIJA TRI PROMJENLJIVE ........................................................... 56 3.4. PROMJENA DIMENZIJA GRAFIKA (VIŠE GRAFIKA U GRAFIČKOM PROZORU) ......... 57 3.5. RAD SA VIŠE OTVORENIH GRAFIČKIH PROZORA ............................................................ 58 3.6. NAREDBE ZA ELEMENTARNU KONTROLU BOJA ............................................................. 58 3.7. GRAFIČKE KOMANDE .............................................................................................................. 60 3.7.1. ŠTAMPANJE I MEMORISANJE GRAFIKA .............................................................................. 60 3.8. POKRETNE SLIKE – FILMOVI ................................................................................................. 61 GLAVA ČETVRTA ANALIZA PODATAKA ................................................................................................................... 63 4.1. MAKSIMALNA I MINIMALNA VRIJEDNOST ....................................................................... 63 4.2. UREĐIVANJE PODATAKA, SREDNJA VRIJEDNOST I MEDIANA .................................... 64 4.3. STANDARDNO ODSTUPANJE, VARIJANSA, KOVARIJANSA I KORELACIJA ............... 65 4.4. SUMA I PROIZVOD ELEMENATA ........................................................................................... 65 4.5. PRIMJENA SUM I CUMSUM ZA RAČUNANJE INTEGRALA .............................................. 67 4.6. RAZLIKA ELEMENATA I PRIBLIŽNO DIFERENCIRANJE FUNKCIJA ............................. 69 4.7. OSNOVNE INTERPOLACIONE STRATEGIJE ........................................................................ 70 GLAVA PETA PROGRAMIRANJE I M FAJLOVI .......................................................................................................... 73 5.1 EDITOR M FAJLOVA ................................................................................................................. 73 5.2 UPRAVLJANJE TOKOM PROGRAMA ..................................................................................... 75 5.2.1 INTERAKCIJA SA KORISNIKOM ............................................................................................. 75 5.2.2 FOR PETLJA ................................................................................................................... 76 5.2.3 WHILE PETLJA ................................................................................................................... 77 5.2.4 IF SELEKCIJA ................................................................................................................... 78 5.2.5 SWITCH SELEKCIJA .................................................................................................................. 79 5.2.6 GRAFIČKI MENI ................................................................................................................... 80 5.2.7 BREAK I CONTINUE .................................................................................................................. 80 5.2.8 ERROR ................................................................................................................... 80 5.2.9 NAREDBE VEZANE ZA LOGIČKE OPERACIJE .................................................................... 81 5.3 FUNKCIJSKI FAJLOVI ............................................................................................................... 81 5.4 TEKSTUALNI PROMJENLJIVE (STRINGOVI) ....................................................................... 84 5.5 FUNKCIJE ČIJI SU ARGUMENTI DRUGE FUNKCIJE ........................................................... 87 5.6 OBRADA IZUZETAKA U MATLAB-U ..................................................................................... 90 5.7 PCODE ................................................................................................................... 91 5.8 DEBUG-OVANJE PROGRAMA ................................................................................................. 91
ii
GLAVA ŠESTA GRAFIČKI OBJEKTI ................................................................................................................... 93 6.1 KOMANDNI PROZOR (ROOT) .................................................................................................. 93 6.2 GRAFIČKI PROZOR (FIGURE).................................................................................................. 95 6.3 KONTROLA OSA ................................................................................................................... 97 6.4 GRAFIČKI OBJEKTI OD KOJIH SE SASTOJI GRAFIK ........................................................ 100 6.4.1 LINIJE - LINE ................................................................................................................. 101 6.4.2 KONTURA - CONTOUR ........................................................................................................... 102 6.4.3 POPUNJENI POLIGON – PATCH ............................................................................................ 102 6.4.4 POVRŠ – SURFACE ................................................................................................................. 103 6.4.5 SLIKA – IMAGE ................................................................................................................. 104 6.4.6 OSVJETLJENJE – LIGHT.......................................................................................................... 104 6.4.7. ANIMIRANA LINIJA – ANIMATEDLINE .............................................................................. 105 6.4.8. OBLAST - AREA ................................................................................................................. 106 6.4.9. NEKI DODATNI OBJEKTI U NOVIJIM VERZIJAMA MATLABA...................................... 106 6.4.10. TEKSTUALNI OBJEKTI – TEXT ............................................................................................. 108 6.5. GRAFIČKE KONTROLE ........................................................................................................... 108 6.5.1. FRAME KONTROLA................................................................................................................. 109 6.5.2. TEXT KONTROLA ................................................................................................................. 109 6.5.3. EDIT KONTROLA ................................................................................................................. 110 6.5.4. POPUPMENU KONTROLA ...................................................................................................... 111 6.5.5. RADIO KONTROLA ................................................................................................................. 111 6.5.6. CHECKBOX KONTROLA ........................................................................................................ 112 6.5.7. SLIDE KONTROLA – KLIZAČ ................................................................................................ 112 6.5.8. PUSHBUTTON KONTROLA .................................................................................................... 113 6.5.9. LISTBOX KONTROLA ............................................................................................................. 113 6.5.10. TOGGLEBUTTON KONTROLA .............................................................................................. 113 6.5.11. NEKE VAŽNIJE OSOBINE UICONTROL-A........................................................................... 114 6.6. UIMENU ................................................................................................................. 114 6.7. UICONTEXTMENU ................................................................................................................. 115 6.8. UITOOLBAR, UIPUSHTOOL I UITOGGLETOOL ................................................................. 116 6.9. INTERAKTIVNI PROGRAM ZA CRTANJE 2-D CRTEŽA ................................................... 117 6.9.1. PROGRAM D2CRTEZ.M .......................................................................................................... 117 6.9.2. PROGRAM ZA PRORAČUN I CRTANJE – CRTANJE.M ..................................................... 120 6.9.3. POMOĆNI PROGRAM – POMOCNI.M ................................................................................... 121 6.9.4. POTPROGRAM FUNK.ME ....................................................................................................... 122 6.10. GUIDE ................................................................................................................. 122 6.10.1. LAYOUT EDITOR ................................................................................................................. 122 6.10.2. M-FILE EDITOR ................................................................................................................. 125 6.10.3. PRIMJER KREIRANJA GUI-a .................................................................................................. 125 6.10.3.1. UNOS OBJEKATA U LAYOUT EDITOR-U................................................................ 126 6.10.3.2. PROGRAMIRANJE CALLBACK FUNKCIJA ............................................................. 129 6.10.3.3. MENU EDITOR .............................................................................................................. 132 6.10.3.4. EXPORT ................................................................................................................. 133 6.10.4. KREIRANJE GUI-a SA DVIJE OSE.......................................................................................... 133 6.10.5. KOD FAJLA PRIMJER.M .......................................................................................................... 134 6.10.6. KOD FAJLA CRTANJE.M......................................................................................................... 137 GLAVA SEDMA POLINOMI ................................................................................................................. 139 7.1. DEFINISANJE POLINOMA ...................................................................................................... 139 7.2. KARAKTERISTIČKI POLINOM I SOPSTVENE VRIJEDNOSTI MATRICE....................... 140 7.3. MNOŽENJE POLINOMA .......................................................................................................... 140 iii
7.4. 7.5. 7.6. 7.7.
IZRAČUNAVANJE POLINOMA .............................................................................................. 140 DIJELJENJE POLINOMA .......................................................................................................... 141 RAZVOJ U RACIONALNE RAZLOMKE ................................................................................ 141 INTERPOLACIJA POLINOMOM ............................................................................................. 142
GLAVA OSMA OBRADA SIGNALA, SLIKE I WAVELET TOOLBOX ...................................................................... 144 8.1 OBRADA SIGNALA ................................................................................................................. 144 8.1.1 FOURIEROVA ANALIZA ......................................................................................................... 144 8.1.1.1 TEORIJSKI PREGLED................................................................................................... 144 8.1.1.2 RAČUNANJE ................................................................................................................. 145 8.1.1.3 PREUREĐIVANJE REZULTATA................................................................................. 145 8.1.1.4 INVERZNA TRANSFORMACIJA ................................................................................ 147 8.1.1.5 DVODIMENZIONA TRANSFORMACIJA .................................................................. 147 8.1.1.6 DISKRETNA KOSINUSNA TRANSFORMACIJA ...................................................... 147 8.1.1.7 FUNKCIJA PROZORA .................................................................................................. 147 8.1.2 RAČUNANJE I CRTANJE FREKVENTNOG ODZIVA .......................................................... 148 8.1.2.1 ANALOGNI DOMEN..................................................................................................... 148 8.1.2.2 DISKRETNI DOMEN..................................................................................................... 148 8.1.2.3 KONKRETNE FILTARSKE FUNKCIJE ...................................................................... 149 8.1.3 RAČUNANJE SIGNALA NA IZLAZU IZ DISKRETNOG SISTEMA ................................... 150 8.1.4 KARAKTERISTIČKI TEST SIGNALI ...................................................................................... 150 8.1.5 KROSKORELACIONA FUNKCIJA I SPREKTRALNA GUSTINA SNAGE SLUČAJNIH SIGNALA .............................................. 152 8.1.6 SPEKTROGRAM ................................................................................................................. 153 8.1.7 DVODIMENZIONI SIGNALI.................................................................................................... 153 8.2 DIGITALNA OBRADA SLIKE ................................................................................................. 154 8.2.1 UČITAVANJE I PRIKAZIVANJE SLIKE ................................................................................ 154 8.2.2 NAREDBA IMSHOW ................................................................................................................ 154 8.2.3 VELIČINA SLIKE ................................................................................................................. 155 8.2.4 SNIMANJE SLIKE ................................................................................................................. 156 8.2.5 NAREDBE WARP I GETIMAGE .............................................................................................. 156 8.2.6 KVALITET DISPLAY-A ........................................................................................................... 157 8.2.7 GENERISANJE ŠUMA .............................................................................................................. 158 8.2.8. KOLORNI MODELI ................................................................................................................. 159 8.2.9. BOJA PIKSELA ................................................................................................................. 161 8.2.10. NEKE STATISTIČKE KARAKTERISTIKE SLIKE................................................................. 161 8.2.11. INFORMACIJE O SLICI ............................................................................................................ 161 8.2.12. OSNOVE OBRADE SLIKE ....................................................................................................... 162 8.2.13. KLIPOVANJE SLIKE I PODEŠAVANJE HISTOGRAMA ..................................................... 164 8.2.14. GEOMETRIJSKE OPERACIJE ................................................................................................. 165 8.2.15. INTERPOLACIJA SLIKE .......................................................................................................... 167 8.2.16. DISKRETNE TRANSFORMACIJE ........................................................................................... 167 8.2.16.1. 2D DFT ................................................................................................................. 168 8.2.16.2. 2D DCT ................................................................................................................. 168 8.2.16.3. KONVOLUCIJA SLIKA ................................................................................................ 170 8.2.16.4. RADONOVA TRANSFORMACIJA .............................................................................. 170 8.2.17. RAD SA HDR SLIKOM ............................................................................................................. 172 8.2.18. DEMOSAICING ................................................................................................................. 173 8.2.19. HADARMARDOVA I HAAROVA TRANSFORMACIJA, BAZISNE SLIKE I VEKTORI .. 173 8.2.20. SOPSTVENE I SINGULARNE VRIJEDNOSTI ....................................................................... 174 8.2.21. FILTRIRANJE I POBOLJŠAVANJE SLIKE ............................................................................ 175 8.2.21.1. SLIKA SA ŠUMOM ....................................................................................................... 175 iv
8.2.21.2. FILTRIRANJE MEDIAN FILTROM ............................................................................. 176 8.2.21.3. FILTRIRANJE FILTROM SA POKRETNOM SREDINOM ........................................ 176 8.2.21.4. FILTRIRANJE KORIŠĆENJEM KONVOLUCIJE ....................................................... 177 8.2.21.5. LOKALNI ADAPTIVNI FILTRI ................................................................................... 177 8.2.21.6. OSTALI LINEARNI FILTRI .......................................................................................... 177 8.2.21.7. NELINEARNO FILTRIRANJE ...................................................................................... 178 8.2.21.8. PROCESIRANJE BLOKOVA ........................................................................................ 178 8.2.22. HISTOGRAMSKA EKVILIZACIJA ......................................................................................... 178 8.2.23. ZUMIRANJE I PROMJENA VELIČINE SLIKE ...................................................................... 178 8.2.24. KORIŠĆENJE NAREDBI ZA KREIRANJE FILTRA .............................................................. 178 8.2.25. DETEKCIJA IVICA ................................................................................................................. 179 8.2.26. SEGMENTACIJA REGIONA .................................................................................................... 181 8.2.27. OPIS OBLIKA I DIGITALNA MORFOLOGIJA ...................................................................... 183 8.3. WAVELET TRANSFORMACIJA ............................................................................................. 184 8.3.1. ILUSTRATIVNI PRIMJER WAVELET DEKOMPOZICIJE ................................................... 184 8.3.2. ILUSTRATIVNI PRIMJER DEKOMPOZICIJE SLIKE ........................................................... 186 8.3.3. UKLANJANJE ŠUMA PUTEM WAVELET TRANSFORMACIJE ........................................ 187 8.3.4. WAVELET PAKETI ................................................................................................................. 188 GLAVA DEVETA LINEARNA ALGEBRA I MATRIČNE FUNKCIJE ............................................................................. 190 9.1 SOPSTVENE VRIJEDNOSTI I SOPSTVENI VEKTORI......................................................... 190 9.2. Q-Z DEKOMPOZICIJA .............................................................................................................. 192 9.3. SINGULARNE VRIJEDNOSTI I PRIDRUŽENA DEKOMPOZICIJA MATRICA ................ 193 9.4. NORME VEKTORA I MATRICA ............................................................................................. 194 9.5. KONDICIONI BROJ MATRICE................................................................................................ 196 9.6. TROUGAONA (L-U) DEKOMPOZICIJA ................................................................................. 197 9.7. HESSENBERGOVA FORMA I SCHUROVA DEKOMPOZICIJA ......................................... 197 9.8. CHOLESKY-jeva DEKOMPOZICIJA ....................................................................................... 199 9.9. ORTOGONALNA Q-R DEKOMPOZICIJA .............................................................................. 200 9.10. RANG, BAZIS ZA SLIKU I KERNEL LINEARNOG OPERATORA ..................................... 201 9.11. MOORE-PENROSE PSEUDOINVERZIJA MATRICA ........................................................... 202 9.12. RJEŠAVANJE SISTEMA LINEARNIH JEDNAČINA............................................................. 203 9.12.1. HOMOGENI SISTEM JEDNAČINA ......................................................................................... 203 9.12.2. SISTEMI SA VEĆIM BROJEM NEPOZNATIH OD BROJA JEDNAČINA ........................... 203 9.12.3. SISTEMI SA VEĆIM BROJEM JEDNAČINA OD BROJA NEPOZNATIH ........................... 204 9.13. MATRIČNE FUNKCIJE............................................................................................................. 205 GLAVA DESETA RIJETKE MATRICE ................................................................................................................. 207 10.1. KREIRANJE RIJETKE MATRICE ............................................................................................ 207 10.2. RIJETKA MATRICA I FUNKCIJE ........................................................................................... 209 10.3. KONVERZIJA PUNE MATRICE U RIJETKU I OBRNUTO .................................................. 210 10.4. GRAFIČKI PRIKAZ RIJETKE MATRICE I DRVETA ............................................................ 210 GLAVA JEDANAESETA ULAZNO IZLAZNE NAREDBE ........................................................................................................... 212 11.1. PREGLED JEDNOSTAVNIH U/I NAREDBI ........................................................................... 212 11.2. ULAZNO/IZLAZNE NAREDBE NISKOG NIVOA ................................................................. 212 11.2.1. OTVARANJE I ZATVARANJE FAJLA ................................................................................... 212 11.2.2. NEFORMATIZOVANI ULAZ/IZLAZ ...................................................................................... 213 11.2.3. FORMATIZOVANI ULAZ/IZLAZ ............................................................................................ 214 v
11.2.4. POZICIONIRANJE U FAJLU .................................................................................................... 215 11.3. ZAPISIVANJE FAJLOVA SA FORMATIMA POGODNIM ZA TABELARNI PRIKAZ ...... 216 11.4. SNIMANJE I UČITAVANJE ZVUČNIH PODATAKA ........................................................... 216 11.5. HELP BROWSER ................................................................................................................. 218 11.6. REGULARNI ISKAZI ................................................................................................................ 218 11.7. MATLAB I INTERNET.............................................................................................................. 220 GLAVA DVANAESTA NAPREDNI TIPOVI PODATAKA ........................................................................................................ 222 12.1. STRUKTURE ................................................................................................................. 222 12.2. ĆELIJA ................................................................................................................. 223 12.3. VIŠEDIMENZIONE MATRICE ................................................................................................ 224 12.4. KLASE U MATLABU ................................................................................................................ 226 GLAVA TRINAESTA PARALELNO PROGRAMIRANJE ....................................................................................................... 229 13.1. OTVARANJE I ZATVARANJE SESIJE ZA PARALELNO IZVRŠAVANJE ........................ 229 13.2. PARALELNI CIKLUS PARFOR ............................................................................................... 229 13.3. IZVRŠAVANJE U POZADINI .................................................................................................. 230 13.4. IZAZOVI I PROBLEMI U PARALELNOM PROGRAMIRANJU .......................................... 231 GLAVA ČETRNAESTA VEZE SA DRUGIM PROGRAMSKIM JEZICIMA .............................................................................. 232 14.1. VEZA MATLAB - PROGRAMSKI JEZIK C ............................................................................ 232 14.2. STRING KAO ARGUMENT FUNKCIJE .................................................................................. 233 14.3. MEX FUNKCIJE SA VIŠE ARGUMENATA ........................................................................... 234 14.4. OSTALE MOGUĆNOSTI .......................................................................................................... 236 GLAVA PETNAESTA SIMBOLIČKA IZRAČUNAVANJA U MATLABU, MAPLE I MATHEMATICA ............................ 237 15.1. SIMBOLIČKA IZRAČUNAVANJE U MATLABU ................................................................. 237 15.2. SIMBOLIČKA IZRAČUNAVANJA U MAPLE-U ................................................................... 244 15.2.1. HELP ................................................................................................................. 244 15.2.2. INSERT ................................................................................................................. 244 15.2.3. KORIŠĆENJE KOMANDNOG PROZORA .............................................................................. 245 15.2.4. OSNOVI SINTAKSE ................................................................................................................. 246 15.3. MATHEMATICA ................................................................................................................. 258 15.3.1. SINTAKSA ................................................................................................................. 258 15.3.2. OSNOVNE FUNKCIJE .............................................................................................................. 259 15.3.3. UNOŠENJE VRIJEDNOSTI....................................................................................................... 259 15.3.4. SINTAKSA PROMJENLJIVIH .................................................................................................. 259 15.3.5. VEKTORI I MATRICE .............................................................................................................. 259 15.3.6. NUMERIČKA LINEARNA ALGEBRA .................................................................................... 260 15.3.7. RJEŠAVANJE SISTEMA JEDNAČINA ................................................................................... 261 15.3.8. LISTE BROJEVA ................................................................................................................. 262 15.3.9. LOKALNI MINIMUM I MAKSIMUM ..................................................................................... 262 15.3.10.PARAMETARSKE KRIVE ....................................................................................................... 263 15.3.11.POLARNE KRIVE ................................................................................................................. 263 15.3.12.INTEGRALI ................................................................................................................. 263 15.3.13.SIMBOLIČKI RAČUN – POLINOMI ...................................................................................... 264 15.3.14.RJEŠENJA POLINOMA............................................................................................................ 264 15.3.15.ALGEBARSKE FUNKCIJE ...................................................................................................... 264 15.3.16.INTEGRALI I DIFERENCIJALI............................................................................................... 265 vi
15.3.17.SUME I PROIZVODI ................................................................................................................ 265 15.3.18.KOMPLEKSNI BROJEVI U MATHEMATICA-I.................................................................... 265 15.3.19.REDOVI I LIMESI ................................................................................................................. 266 15.3.20.GRAFICI ................................................................................................................. 266 15.3.21.FITOVANJE POLINOMA ......................................................................................................... 268 15.3.22.NAPREDNA ALGEBRA U MATHEMATICA-I ..................................................................... 268 15.3.23.STATITIKA U MATHEMATICA-I .......................................................................................... 269 GLAVA ŠESTNAESTA NEKOMERCIJALNE ALTERNATIVE MATLAB-U .......................................................................... 270 16.1. OCTAVE ................................................................................................................. 270 16.2. UOČENE RAZLIKE MATLAB – OCTAVE ............................................................................. 270 16.3. SCILAB – PORIJEKLO I INSTALACIJA ................................................................................. 272 16.4. SCILAB I MATLAB ................................................................................................................. 275 16.5. PYTHON – OSNOVNI POJMOVI ............................................................................................. 278 16.6. R-CODE – UVOD (KREIRANO NA OSNOVU ZVANIČNE DOKUMENTACIJE) .............. 286 16.7. SAGE ALAT ................................................................................................................. 302 GLAVA SEDAMNAESTA SIMULINK ................................................................................................................. 305 17.1. UVODNE INFORMACIJE O SIMULINK-U ............................................................................ 305 17.2. POKRETANJE SIMULINK-A ................................................................................................... 305 17.3. KREIRANJE NOVOG MODELA .............................................................................................. 305 GLAVA OSAMNAESTA COMMUNICATIONS SYSTEM TOOLBOX ....................................................................................... 320 18.1. IZVORI SIGNALA ................................................................................................................. 320 18.2. KANALI ................................................................................................................. 321 18.3. KORISNI KONVERTORI TIPOVA PODATAKA ................................................................... 322 18.4. EKVILIZATORI ................................................................................................................. 324 18.5. DETEKCIJA, KOREKCIJA GREŠKE – BLOK, KONVOLUCIONI I CRC KODOVI ........... 325 18.6. GALOAOVA POLJA ................................................................................................................. 330 18.7. MODULACIJE ................................................................................................................. 331 18.8. MJERENJE PERFORMANSI ..................................................................................................... 335 18.9. DODATNI PROBLEMI U RADIO FREKVENCIJSKIM MODULACIJAMA ........................ 335 18.10. KODIRANJE IZVORA ............................................................................................................... 336 GLAVA DEVETNAESTA CONTROL SYSTEM TOOLBOX.......................................................................................................... 337 19.1. MODELOVANJE SISTEMA UPRAVLJANJA - UVOD .......................................................... 337 19.2. PREDSTAVLJANJE SISTEMA ................................................................................................. 338 19.3. POVEZIVANJE SISTEMA ........................................................................................................ 341 19.4. ANALIZA SISTEMA I DIZAJN KONTROLE.......................................................................... 342 19.5. ODZIV SISTEMA ................................................................................................................. 345 19.6. DIZAJN KONTROLE ................................................................................................................. 348 GLAVA DVADESETA MATLAB OKRUŽENJE ................................................................................................................. 355 20.1. KOMANDNI PROZOR .............................................................................................................. 355 20.2. GRAFIČKI PROZOR – FIGURE ............................................................................................... 360 LITERATURA
................................................................................................................. 367
INDEKS
................................................................................................................. 369 vii
UMJESTO PREDGOVORA Poslije više od petnaest godina odlučili smo se da pripremimo novo izdanje knjige o programskom paketu MATLAB. Prvo izdanje ove knjige je izašlo 1994. godine kada je MATLAB bio dostupan u formi alata pod operativnim sistemom MS DOS. Drugo izdanje knjige je izašlo 1998. godine pod naslovom MATLAB for Windows. Prije prvog izdanje, između dva izdanja te nakon drugog izdanja autori su objavili nekoliko kraćih materijala namjenjenih edukaciju iz ovog bitnog matematičkog programskog alata. Nakon što su oba prethodna izdanja knjige rasprodana te kako su akumulirane izmjene u MATLAB-u od posljednjeg izdanja naše knjige velike odlučili smo se da izdamo novo izdanje ove knjige nadajući se da će naći svoj put do čitalaca, studenata, istraživača, ljudi iz prakse, pa i srednjoškolaca koji se u svom radu srijeću sa matematičkim proračunima. MATLAB je viši programski jezik, programski alat aIi I paket razvijen sredinom 80-tih. Prva verzija pisana je u Fortranu, a kao osnova su uzeti paketi LINPACK i EISPACK. Nove verzije MATLAB-a (1987 i 1989) napisane su u jeziku C, a distribuira ga softverska kompanija The Math Works Inc. MATLAB je, za relativno kratko vrijeme, postao standardni programski paket na vodećim univerzitetima i istraživačkim institutima. Koristi se u uvodnim kursevima linearne algebre i numeričke analize kao i u kursevima ostalih matematičkih i tehničkih disciplina, ekonomije, medicine itd. U industriji se koristi za izračunavanja pri rješavanju praktičnih i istraživačkih problema. Problemi i rješenja se izražavaju na sličan način kao i u standardnim matematičkim formulacijama i to bez potrebe za tradicionalnim programiranjem. Na taj način se numerički problemi rješavaju za samo djelić vremena koje bi bilo potrebno za pisanje programa u nekom od nižih jezika (Fortran, Basic, C, C++, Java, Pascal). Programiranje, kada za njim postoji potreba, prati logiku paskaloidnih jezika a to su uglavnom gotovo svi programski jezici koji se danas koriste. Tokom godina razvoja MATLAB je doživio mogućnost da se koncepti iz drugih programskih jezika ugrađuju u MATLAB te da se programi i aplikacije razvijene u MATLAB-u koriste van ovog okruženja. MATLAB je dobar dio svoje popularnosti stekao nadogradljivošću. Svaki vični programer može da dopiše svoje funkcije. Danas postoje brojne nadogradnje te sajtovi za razmjenu softvera napisanog za ovaj programski alat. Zbog velike popularnosti, razvijene su različite verzije MATLAB-a prilagođene pojedinim operativnim sistemima. U široj upotrebi su verzije MATLAB-a namjenjene Windows-u, različita UNIX/LINUX izdanja te MAC-OS-u mada se mogu pronaći i izdanja za neke druge operativne sisteme. Kupovina MATLAB-a je relativni komplikovan posao jer se pored osnovne instalacije mora kupiti, u zavisnost od potreba korisnika, određeni broj biblioteka – toolbox-ova koji mogu biti takođe veoma skupi posebno kada se ima na umu platežna moć naših korisnika i institucija. Međutim, srećna je okolnost da mnogo programa koje su napisali programeri slobodno se razmjenjuje te da mnogim specijalistima za razne oblasti nijesu ni potrebni posebni alati za njihovu oblast (potrebne naredbe mogu sami da napišu) već im je bitna MATLAB-ova platforma sa primitivnim funkcijama koja bi se veoma teško pisala u drugim programskim alatima. Druga srećna okolnost je postojanje alata koji se zove Octave i koji se distribuira besplatno a koji u značajnoj mjeri podsjeća na MATLAB. Ovo izdanje smo u odnosu na prethodna pored ispravljanja grešaka, praćenja izmjena u programskim naredbama obogatili i složenijim tipovima podataka kao što su strukture i ćelije, te višedimenzionim matricama. Dali smo detalje toolbox-a za obradu slike, SIMULINK-a, prezentirali smo vezu MATLAB-a sa drugim programskim jezicima i okruženjima. Prikazali smo program za kreiranje grafičkog korisničkog interfejsa guide te smo na kraju prikazali i alat koji se naziva Octave koji predstavlja neku vrstu konkurencije ovom programskom alatu. Zbog skučenosti prostora nismo se detaljnije bavili drugim programskim paketima i alatima koji dolaze uz, ili se posebno poručuju, MATLAB već smo se uglavnom ograničili na one alate koji su od interesa za inženjere a partikularno za studente elektrotehnilke i srodnih tehničkih disciplina. Matlab prati zajednica programera koji preko odgovarajućih portala (najpoznatiji je MATLAB Central) razmjenjuju ili postavljaju svoje programe i kreacije. Može se reći da se veoma veliki broj kodova i programa može preuzeti na ovaj način. Naučnici i drugi stručnjaci su razvili programe koje postavljaju za testiranje svojih tehnika. Ovakva provjerljivost naučnih saznanja i informacija je dovela do dramatičnog razvoja pojedinih naučnih oblasti te do razvoja koncepta provjerljive nauke i provjerljivih naučnih rezultata. Uz MATLAB se zaposleni u malim firmama, studenti i naučnici iz siromašnih zemalja mogu osjetiti kao zaposleni u velikim razvojnim centrima korporacija ili dijelom velike svjetske zajednice istraživača koja ravnopravnije nego ikada ranije razvija ili koristi naučna saznanja. U cilju lakšeg praćenja i povezivanja sa prethodnim verzijama često smo davali reference na prethodne verzije MATLAB-a ili prethodna izdanja ove knjige. AUTORI
1
Kako početi rad u MATLAB-u Pretpostavljamo da je neka od aktuelnih verzija MATLAB-a instalirana na vašem računaru. Danas MATLAB postoji za veliki broj savremenih operativnih sistema. Vrijedi ipak istaći da je za očekivati da se sa MATLAB-om radi na nekom od operativnih sistema koji mogu da podrže složena matematička izračuvanja te na sistemima koji raspolažu sa znatnim resursima. Uzimajući o obzir ova ograničenja onda možemo smatrati da se MATLAB može izvršavati na gotovo svim savremenim verzijama Windows operativnog sistema, Linux distribucijama (uključujući Red Hat, Debian, Ubuntu itd) te na MAC OS-om. Mi ćemo se u našem izlaganju uglavnom ograničiti na verziju koja je namjenjena Windows operativnim sistemima. Vrijedi reći da je instalacija programa veoma jednostavna odnosno obavlja se sa odgovarajućeg DVD-ja uz praćenje upita koji se postavljaju prilikom instalacije. Postoji samo dva suštinska pitanja u instalaciji koja vrijedi pomenuti a to je dilema da li se kompletan help (pomoć) sistem instalira na računaru i proces autentikacije. Odgovor na prvo pitanje suštinski zavisi od korisnika. MATLAB pored tekstualnog helpa posjeduje, PDF help, interaktivni Web zasnovan help itd. pa je upitno da li sve to treba instalirati kada se uglavnom iste informacije multiplikuju u različitim pojavnim oblicima a sam help može da zauzme prostor na disku koji nije manji od prostora potrebnog za instalaciju programa. Drugo pitanje se odnosi na autentikaciju odnosno potrebno je propratiti korake koji se od vas zahtjevaju da bi potvrdili da ste vlasnik autentične (ispravno kupljene) verzije ovog programskog sistema. Problem sa helpom će se ubuduće prevazilaziti tako što će se postavljati na internetu najveći dio korisnih informacija dok će slično autentikacija u budućnosti biti obavljana u nekom sistemu sa učestalim provjerama putem Internet i cloud computing servisa. Nakon instalacije, startovanje ovog programa provodi se na uobičajeni način: korišćenjem dugmeta Start za navigaciju do ovog programa, preko prečice u Taskbar-u, ikonice postavljene na desktop-u ili na neki drugi način sa kojim ste se upoznali vezano za rad sa Windows operativnim sistemom (pogledati sliku 0.1).
1
2
3
Slika 0.1: Taskbar u Windows operativnom sistemu: (1) Dugme Start; (2) Prečica na MATLAB; (3) Aktivne instance programa.
2 1
3
4
Slika 0.2: Mogući izgled komandnog prozora MATLAB-a (1: Komandni prompt, 2: Navigacija po folderima; 3: Dodatni prozori; 4: Komandni prozor. Klikom na Start dugme u Taskbar-u možemo u polju Search programs and files unijeti MATLAB i pritisnuti Enter, ili možemo potražiti program u spisku koji se nalaze u meniju koji se otvori ili možemo u stavci All Programs. Nakon startovanja MATLAB-a uključuje se komandni prozor – Command Window. Izgled ekrana može da varira a sa opcijom menija Desktop/Desktop Layout možete da uključujete prikaz neki drugih elemenata koji mogu biti od koristi (sadržaj aktivnog direktorijuma, promjenljive koje se nalaze u memoriji, spisak posljednjih naredbi itd.). U zaglavlju prozora nalazi se linija sa aktivnim direktorijumom a prelazak u novi direktorijum se može vršiti na više načina od kojih je jedan unošenjem direktorijuma (foldera) direktno u
2
listu, otvaranjem menija kada će se pojaviti spisak posljednje korišćenih prozora, ili klikom na dugme sa tri tačke kada se otvara uobičajena Windows aplikacija za navigaciju kroz prozore. U komandom prozoru se pojavljuje oznaka » koja označava komandni prompt na kojem se unose naredbe koje nakon pritiska na Enter MATLAB izvršava (Slika 0.2). Prilikom rada sa MATLAB-om mogu da se otvaraju i drugi tipovi prozora kakav je na primjer grafički prozor (slika 0.3) ili M-editor koji predstavlja editor za unos programa (slika 0.4). Ovi i neki drugi prozori biće tumačeni kad sa to dođe vrijeme u našoj knjizi bez pretenzija da se objasne svi elementi izuzetno kompleksnog MATLAB-ovo korisničkog interfejsa.
Slika 0.3: Mogući izgled grafičkog prozora.
Slika 0.4: Editor za unošenje programa u MATLAB-u.
3
glava prva
OSNOVNE FUNKCIONALNOSTI MATLAB-a Osnovni objekat nad kojim se vrše operacije u MATLAB-u čini oblast brojeva (array of numbers) poređan u m vrsta i n kolona, koji ćemo uslovno zvati pravougaona (m n) matrica. Naime, ovako uređeni brojevi mogu predstavljati neki linearni operator, dakle matricu u uobičajenom smislu, digitalnu sliku, ali ih MATLAB može interpretirati i kao tabelarni prikaz nekih podataka koje treba obraditi na određeni način ili nešto drugo u zavisnosti od konteksta u kojem se podaci posmatraju. Fleksibilnosti MATLAB-a znatno doprinose i sljedeće osobine: (1) Ne sadrži iskaze za određivanje dimenzije ili tipa matrice odnosno alokaciju podataka, već se određeni prostor pridružuje automatski, sve do iznosa ograničenog za dati sistem; ako postoji potreba da se definišu dimenzije podatka ili njegov tip (ponekad se naziva klasom) to se može uraditi. Ovo se ponekad vrši radi brzine izračunavanja ili drugih potreba. (2) Svi specijalni slučajevi pravougaone matrice (m=n>1-kvadratna matrica, m=1-vektor vrsta, n=1-vektor kolona, m=n=1-skalar) prirodno slijede pravila za opšti slučaj, osim u nekim operacijama kada je za vektore i skalare određeno specijalno značenje. Zato ćemo, ukoliko nije posebno naglašeno, pod pojmom "matrica" podrazumijevati bilo koji od navedenih slučajeva. (3) Elementi matrice mogu biti realni ili kompleksni. (4) Postoji mogućnost da se definišu i matrice sa više od dvije dimenzije. Za početak ćemo raditi sa matricama sa dvije dimenzije a kada savladamo rad sa njima upoznaćemo se i sa radom sa višedimenzionim matricama. Operacije i iskazi u MATLAB-u pišu se, kadgod je to moguće, na prirodan način kao što bi ih pisali na papiru.
1.1 UNOŠENJE PODATAKA U MATLAB-u postoji više načina za unošenje matrica. Matrice malih dimenzija najlakše se unose direktnim definisanjem liste elemenata. Najprirodnije ih je unijeti po vrstama, pri čemu se uglaste zagrade i koriste da ograniče listu elemenata. Elementi su razdvojeni bjelinom ili zarezom dok se znak ; ili taster koristi za odvajanje vrsta matrice. Primjer 1.1.1 Unošenje izraza »A=[1 -2 4;5 -6 8;7 -4 2] rezultira u A= 1 -2 4 5 -6 8 7 -4 2 Matrica A smještena je u radnu memoriju za kasniju upotrebu. Isti rezultat imaćemo i unošenjem »A=[1,-2,4;5,-6,8;7,-4,2] ili »A=[ 1 -2 4 5 -6 8 7 -4 2] Ovaj način unošenja je pogodan jer imitira pisanje matrice na papiru, a korisan je i kada imamo posla sa velikim matricama koje možemo razvući na više ulaznih linija. Primjer 1.1.2 Unošenje »C=[123.0934 -24.934 -33.7634 945.3452 -345.8734 -39.246 -24.78 0.357 -45.98 -2.7 23.13 2] rezultira u C= 123.0934 -24.9340 -33.7634 945.3452 -345.8734 -39.2460 -24.7800 0.3570 -45.9800 -2.7000 23.1300 2.0000 Ukoliko elemente jedne vrste nije moguće smjestiti u jednoj ulaznoj liniji, unošenje možemo nastaviti u narednoj, pri čemu sa ... naznačimo prenošenje na sljedeću liniju. 4
Primjer 1.1.3 Unošenje »B=[245.268 -0.6592 -35.9643 27.2754 -965.346 -345.723 ... -34.97 54.678 35.28] rezultira u B= Columns 1 through 7 245.2680 -0.6592 -35.9643 27.2754 -965.3460 -345.7230 -34.9700 Columns 8 through 9 54.6780 35.2800 Ukoliko unosimo "rijetke" (sparse) matrice, tj. one kod kojih je relativno velik broj elemenata jednak nuli, pogodno je definisati nenulte elemente pojedinačno, sa indeksima unutar malih zagrada ( ). Primjer 1.1.4 Unošenje »D(1,1)=2;D(1,4)=-3;D(3,5)=7 rezultira u D= 2 0 0
0 0 0
0 -3 0 0 0 0
0 0 7
Gornji primjer ilustruje pomenutu osobinu MATLAB-a da se dimenzije matrice automatski prilagođavaju. Pored toga, vidimo da se više iskaza može napisati u jednoj liniji. Ukoliko su iskazi razdvojeni zarezima, rezultati će biti prikazani na ekranu, dok znak ; poslije iskaza služi za suspendovanje prikazivanja rezultata. Napomenimo da MATLAB raspolaže sa skupom funkcija za rad sa "rijetkim" matricama sa kojima ćemo se sresti u narednim poglavljima.
1.2 FORMIRANJE MATRICA SPECIJALNE STRUKTURE U MATLAB-u je razvijen određeni broj matrica specijalne strukture. Komande eye(n) i eye(m,n) daju jedinične matrice dimenzije (n n) i (m n), respektivno. Ako želimo da dobijemo jediničnu matricu istih dimenzija kao matrica X upotrijebićemo naredbu eye(size(X)) gdje je size funkcija koju ćemo detaljnije raditi nešto kasnije a koja vraća dimenzije neke matrice. Komande ones(n) i ones(m,n) generišu matrice sa svim elementima jednakim jedinici, a dimenzije su im (n n) i (m n), respektivno. ones(size(X)) daje matricu jedinica iste dimenzije kao matrica X. Funkcjie zeros(n), zeros(m,n) i zeros(X) na potpuno analogan način generišu matrice sa nulama. 2
Funkcija magic(n) generiše matricu dimenzija (n n) sa cjelobrojnim elementima između 1 i n , sa osobinom da je zbir elemenata po vrstama i kolonama konstantan. Primjer 1.2.1 Komande »X=ones(4,5),zeros(3),Y=eye(5,3),magic(5) rezultiraju u X=
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
ans = 0 0 0
0 0 0
0 0 0
Y= 1 0 0 0 0
0 1 0 0 0
0 0 1 0 0 5
ans = 17 24 23 5 4 6 10 12 11 18
1 7 13 19 25
8 14 20 21 2
15 16 22 3 9
Primjećujemo da MATLAB sam kreira veličinu po imenu ans (answer=odgovor, rezultat), ukoliko ne postoji lijeva strana kao rezultat operacije pridruživanja (znak=). Naravno, u radnom prostoru će ostati samo zadnja veličina pod tim imenom. Funkcija hilb(n) formira kvadratnu matricu dimenzija (n n) čiji su elementi vezani sa indeksima, po formuli 1/(i+j-1). Funkcijka pascal(n) formira kvadratnu matricu dimenzija (n n) kojoj elementi normalni na glavnu dijagonalu čine Paskalov trougao 1 1 1 1
1
1
2
1
3
1
3
1 4 6 4 1 5 10 10 5 1
.....
Primjer 1.2.2 Unošenjem » E=hilb(4),pascal(5) dobijamo E= 1.0000 0.5000 0.3333 0.2500 ans = 1 1 1 2 1 3 1 4 1 5
0.5000 0.3333 0.2500 0.2000 1 1 3 4 6 10 10 20 15 35
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
1 5 15 35 70
Pored navedenih, matrice se mogu unositi i na druge načine: - generisanjem pomoću iskaza i funkcija, - kreiranjem u M-fajlovima, - unošenjem iz spoljnih fajlova sa podacima. O ovim mogućnostima MATLAB-a biće riječi kasnije.
1.3 FUNKCIJE OPŠTE NAMJENE 1.3.1 OPERATORI ZA POMOĆ PRI RADU Kao i svi Windows programi i MATLAB posjeduje bogat Help program. Naredbom help u MATLAB-u je obezbijeđena "služba pomoći i informacija". Ovo predstavlja veliku pogodnost posebno za početnike, ali je značajno i za iskusne programere jer je teško memorisati veliki broj funkcija i opcije koje postoje u MATLAB-u. Postoji nekoliko verzija ove naredbe. Da bi se dobio spisak oblasti za koje postoji sažeto uputstvo (pomoć), dovoljno je unijeti »help Dobijamo spisak mnoštvo oblasti koje help obuhvata (u zavisnosti od verzije koju imate i broja toolbox-ova koje ste instalirali/kupili). Spisak naredbi koje obuhvataju jednu oblast dobijamo sa: »help oblast Informaciju o nekoj konkretnoj komandi ćete dobiti sa »help komanda Primjer 1.3.1 Korišćenjem naredbe help pribavićemo informacije o načinu upotrebe same komande help, kao i o skupu naredbi signal i funkcije abs. Unošenje »help help,help signal,help abs daju informaciju o naredbi help, oblasti/toolbox-u signal i funkciji abs. Ako umjesto naredbe help upotrijebite naredbu doc otvoriće vam se help sistem koji liči na web čitač sa opisom i linkovima na slične naredbe. 6
Pored ovakvog help-a MATLAB posjeduje help organizovan u obliku hiperteksta. Naime u liniji menija osnovnog MATLAB prozora postoji opcija Help koja se može pozvati tasterskom kombinacijom Alt+H ili klikom miša. Izborom opcije Table of Contents otvara se prozor za pregledom oblasti koje MATLAB obuhvata. Nazivi oblasti su istaknuti iz ostalog teksta, i klik miša na naziv oblasti daje pregled svih naredbi koje oblast obuhvata. Klikom na odgovarajuću naredbu dobijaju se osnovne informacije o njoj. Tokom čitanja help-a pritiskom na Back možemo se vratiti na prethodnu temu help-a ili sa History na neku temu koju ste tokom te sesije pokrenuli. Postoji i Index koji obuhvata abecedni spisak svih naredbi MATLAB-a. Prozor koji se vidi slici Slici 1.1 predstavlja mogući izgled Help prozora u MATLAB-u.
Slika 1.1. Help prozor u MATLAB-u. Opcije ovog veoma kvalitetnog Help-a su podijeljene na Contents – sadržaj u kojem su stavke razvrstanje po srodnim temama, Index – u kojem se pretraživanje vrši po ključnim riječima i nazivima funkcija, opcija Search Results daje rezultate posljednjih pretraga zaključno sa stavkom Demo u kojoj se nalaze prečice na veliki broj programa koji demonstriraju opcije programskog sistema MATLAB. Navigacija kroz Help je veoma prosta i prati osnovna pravila navigacije u Windows-u i u Web browser-ima. Naredba demo je prečica ka demonstracionim programima u MATLAB-u ponovo podijeljena po opcijama i grupa srodnih programa. »demo Programi koji su obuhvaćeni ovim demo programima predstavljaju dobru školu za svakog MATLAB programera. Zato se treba upoznati sa tekstovima samih programa o kojima možete čitati dvostrukim klikom na naziv demo programa. MATLAB posjeduje i rudimentarni uvodni program u kojem su predstavljene glavne karakteristike MATLAB-a: rad sa vektorima, matricama, osnovni grafički prikazi, kompleksni brojevi itd. »intro
1.3.2 INFORMACIJE O VARIJABLAMA I FAJLOVIMA Za prikazivanje direktorijuma veličina iz radnog prostora koristi se naredba who. Ukoliko ste proradili dosadašnje primjere, unošenjem »who dobija se: Your variables are: A C E Y B D X ans Pored ovih, MATLAB posjeduje i pojedine konstante uvedene da bi potpomogle jednostavniji rad i da bi pratile uobičajeni način matematičke notacije. 7
Veličina eps koristi se kao tolerancija pri nekim proračunima kao što su određivanje singularnosti ili ranga matrice. Njena vrijednost je rastojanje između 1.0 i sljedećeg većeg realnog broja sa pokretnim zarezom. U IEEE aritmetici koja se koristi na većini personalnih računara, uzima se da je -52
eps=2
-16
što približno iznosi 2.22*10 . Veličina pi je u stvari Ludolfov broj , koji se unaprijed izračuna na neki od mogućih načina (ovo je neka vrsta globalne kao i eps pa i neke druge). Veličina inf predstavlja skraćenicu od infinity (beskonačno) i koristio se na veoma malom broju sistema i računarskih jezika. Nakon popularizacije u MATLAB-u ovo je postalo dostupno u većem broju programskih sistema. Neki od načina da se dobije inf su »s=1/0, s1=-1/0 što daje s=
Inf
s1= -Inf Warning:divide by zero Kao što vidimo došlo je do poruke da se pojavila greška. Ako vam ova poruka smeta možete sve poruke o greškama isključiti sa: » warning off Ako želite da isključite samo poruku o grešci vezanoj za djeljenje sa nulom to se obavlja sa: » warning off::Divide by zero Ponovno uključenje upozorenja se obavlja sa warning on. Napominjemo da u programskim jezicima C, C++, Pascal, Java, i sličnim dijeljenje sa nulom dovodi do prekida izvršavanja, greške ili do "bacanja" izuzetka dok se u MATLAB-u dobija samo upozorenje a čak se i dobijena veličina može koristiti u daljim izračunavanjima. Veličina NaN je IEEE broj koji je povezan sa Inf, ali ima različito značenje. Dolazi od izraza Not a Number (nije broj) i može se generisati sa inf/inf ili 0/0. Promjenljive pi, eps, NaN, Inf su stalne promjenljive a, pored ovog, MATLAB podržava koncepciju globalnih promjenljivih. Globalne promjenljive su one veličine koje važe u svim fajlovima. Definisanje globalnih promljenljivih se može obaviti sa global A B C kojom se definiše da navedene promjenljive važe u svim fajlovima. Podatke o definisanim globalnim promjenljivim možemo vidjeti naredbom »who global U našim programima nećemo koristiti ovakve promjenljive a kada god je moguće treba da ih izbjegavati i u drugim programima jer ugrožavaju razumljivost programa, sprečavaju popravke istoga a otvaraju mogućnost za pojavu veoma komplikovanih grešaka u programima. Detaljnije informacije o veličinama iz tekućeg radnog prostora mogu se dobiti naredbom whos odnosno whos global, koja daje ne samo imena varijabli već i njihove dimenzije i indikaciju prisustva kompleksnih elemenata. Takođe, ovom naredbom dobijamo informaciju o gustini matrice. Za matrice koje nijesu rijetke gustina neće biti prikazana kao atribut dok je za rijetke promjenljive atribut sparse. Naredba whos ima mnoge druge opcije uključujući prikaz samo nekih promjenljivih iz memorije programa. Na primjer whos a* prikazaće se promjenljive koje počinju sa a (* je džoker simbol i podrazumijeva pojavu bilo koje kombinacije karaktera). Za prikazivanje liste direktorijuma M, MEX i MAT-fajlova, može poslužiti naredba what. Tako naredba »what prikazuje sadržaj tekućeg direktorijuma a »what ime_direktorijuma prikazuje sadržaj direktorijuma specificiranog imenom. Naredba which ime_funkcije traži poziciju na disku specificirane MATLAB funkcije iz M ili MEX fajlova. Za provjeru postojanja neke veličine ili fajla koristi se naredba exist. Tako unošenje »exist('A') daje 1 ako je A veličina iz radnog prostora, 2 ako je A.M ime nekog fajla na disku, 3 ako je A.MEX ime funkcije na disku, 4 ako je A prevedeni Simulink model, 5 ako je A ugrađena funkcija u MATLAB-ovom jezgru, 6 daje P funkciju, 7 je direktorijum, 8 je Java klasa dok je 0 ako A ne postoji. Naglasimo da ime varijable ili fajla mora biti između apostrofa. Primjer 1.3.3 Provjerimo da li postoje D, cos i acosh. Unošenjem »exist('D'),exist(‘cos’),exist('specgram') dobijamo 8
ans= 1 ans= 5 ans= 2 što znači da postoji varijabla D i fajl specgram.m i da je cos ugrađena funkcija u MATLAB-ovom jezgru (ovako se implementiraju najbitnije funkcije radi optimizacije). Za određivanje dimenzija pojedinih promjenljivih služi naredba size. Postoji više varijanti ove naredbe koje možemo generalno predstaviti kod matrica kao: s=size(X), [m,n]=size(X), m=size(X,1) i n=size(X,2). U prvom slučaju kao izlazni argumant dobijemo vektor vrstu (označen proizvoljno sa s) sa dva elementa koji pokazuju broj vrsta i kolona veličine X, respektivno. Ukoliko želimo da dimenzije varijable X (proizvoljno označene sa m i n) dobijemo posebno, koristićemo drugu verziju koja ima dva izlazna argumenta. Treća i četvrta varijanta naredbe size daju nam broj vrsta i kolona matrice X respektivno. Za određivanje dužine (dimenzije) vektora koristi se naredba length. Tako l=length(y) daje skalar l koji pokazuje broj elemenata vektora y, bilo da se radi o vektoru vrsti ili koloni. U slučaju da je y matrica, l predstavlja veći od broja redova i broja kolona. Primjer 1.3.4 Odrediti dimenzije promjenljive D i dužinu vektora B. Unošenjem »size(D),ll=length(D),size(X,1),[m,n]=size(D),d=length(B) dobijamo ans = 3 ll= 5 ans= 4 m= 3 n= 5 d= 9
5
1.3.3 BRISANJE I ČUVANJE PODATAKA Za odstranjivanje (brisanje) promjenljivih iz radne memorije koristi se naredba clear. Unošenjem »clear sve veličine i kompajlirane funkcije odstranjuju se iz radnog prostora. Na taj način se radni prostor "očisti" od promjenljivih kao kada prvi put uključimo MATLAB. Sa »clear x iz radnog prostora brišemo samo promjenljivu sa imenom x, a slično se može uraditi za nekoliko veličina, na primjer »clear ime1 ime2 ime3 ... pri čemu ime1, ... može biti ime varijable ali i nekih drugih koncepata. Naredbom »clear functions brišemo sve tekuće M-funkcije kompajlirane u radnoj memoriji. Naredbom »clear mex ukidamo sve povezane mex funkcije a sa »clear all brišemo sve promjenljive, mex linkove i funkcije iz radne memorije. Varijanta »clear global briše globalne promjenljive iz memorije. Primjer 1.3.5 Izbrisati iz radne memorije promjenljive ans i d. »clear ans d Naredbom clear se mogu brisati grupe podataka koristivši tzv. "džoker" simbole tako se sa: »clear a* brišu sve promjenljive koje počinju sa slovo a, a postoje i znatno komplikovanije forme džoker izraza koje ova naredba podržava a o čemu se možete informisati putem help-a.
9
Sa naredbom clear treba oprezno postupati da bi se izbjeglo nenamjerno brisanje podataka i drugih koncepata koji se putem nje mogu izbrisati. Da bi se osigurali od ovakvih omaški, a i zbog trajnog čuvanja podataka na disku za neku kasniju upotrebu, koristimo naredbu save. Tako unošenjem »save upisujemo sve tekuće varijable u unaprijed određeni MAT-fajl sa imenom matlab.mat. MAT fajlovi su poseban kompaktni (komprimovani) format zapisa promjenljivih u MATLAB-u. Naredbom »save ime upisujemo sve tekuće veličine iz radnog prostora u fajl ime.mat (ime je, naravno, proizvoljni naziv fajla), dok naredbom »save ime x Y Z upisujemo u fajl ime.mat samo veličine x, Y i Z. Naredba: »save abc –regexp a* sa korišćenom opcijom regexp snima u fajl abc.mat sve promjenljive koje počinju sa slovom a (* i ovdje označava sve). Postoje i drugi oblici regularnih izraza. Od ostalih opcija naredbe save ovdje ćemo pomenuti samo opciju –ascii kojom se promjenljive ne snimaju u MAT fajl već u tekstualni fajl kodiran ASCII kodom koji je lako čitljiv nakon otvaranja (za razliku od MAT fajlova) ali je manje kompaktan odnosno zauzima više prostora u memoriji. Opcija –append ne prepisuje novi fajl preko starog već novi dopunjuje stari. Pošto smo sačuvali na disku veličine koje nas interesuju, možemo završiti sesiju MATLAB-a. Za prekid rada koristi se ravnopravno više načina »exit »quit ili izborom opcije Exit iz menija File odnosno klikom na dugme za zatvaranje prozora. Prekid uzrokuje gubitak veličina iz radnog prostora i izlazak iz MATLAB-a. Vrijedi napomenuti da MATLAB prilikom završetka rada može da pozove program finish.m u kojem korisnik može da postavi naredbe koje treba da izvrši na završetku rada. Na primjer, može se postaviti da se snime rezultati rada. Kada se ponovo startujemo u MATLAB, radni prostor može se popuniti ranije sačuvanim podacima. Ovo se postiže naredbom load, koja predstavlja inverznu operaciju od save. Naime, »load unosi u radni prostor podatke iz fajla matlab.mat, dok »load ime puni radni prostor podacima iz fajla ime.mat. Naredbom load možemo specificirati učitavanje samo nekih promjenljivih iz fajla uključujući primjenu regularnih izraza koje smo već vidjeli u ovkiru opisan naredbe save. Prekid rada, ali bez izlaska iz MATLAB-a, može se izvršiti upotrebom - ili -, tj. istovremenim pritiskom na tipke i odnosno i . Ovaj prekid rada je obično potreban kada pozovemo program koji se dugo izvršava a za kojega smo pretpostavili da posjeduje grešku ili u kojega želimo ugraditi neku dodatnu funkcionalnost.
1 2 4 Primjer 1.3.6 Unijeti vektore x=[1 -2 3], y=[-3 4 -6] i matricu Z= . Sačuvati ove podatke u fajl sa imenom podaci, i po završetku 2 4 6 rada unijeti sa diska veličine x, y i Z. »x=[1,-2,3];y=[-3,4,-6];Z=[-1,2,4;2,4,6] »save podaci »quit »load podaci
1.3.4 INFORMACIJE O SISTEMU MATLAB posjeduje niz trajnih promjenljivih koje korisnika informišu o performansama sistema. Tako naredba » computer informiše korisnika sistema na kom sistemu radi, a odgovor će na PC mašinama sa 64-tnom platformom i Windows operativnim sistemom biti ans = PCWIN64 10
gdje je PCWIN64 promjenljiva tipa string (niz karaktera o kojima će biti više riječi u petom poglavlju). Trenutno vrijeme se može saznati pomoću promjenljive clock koja predstavlja vektor sa šest komponenti: godina, mjesec, dan, sat, minut i sekundu. Proteklo vrijeme u sekundama između dva trenutka se može saznati naredbom etime (početno_vrijeme,krajnje_vrijeme) a tekući datum u obliku string naredbom date u formatu dan-mjesec-godina. Primjer 1.3.7 Prikazati tekuće vrijeme, datum u obliku stringa i vrijeme proteklo između prve naredbe i sadašnjeg trenutka. » a=clock a= 1.0e+003 * 2.0130 0.0120 0.0280 0.0110 0.0330 0.0109 » Datum=date Datum = date Datum = 28-Dec-2013 » etime(clock,a) ans = 8.1490 Vidimo da je trenutak izrade ovog primjera bio 28.12.2013 u 11h 33minut i 10.9 sekundi i da je između prve i treće naredbe proteklo 8.149 sekundi.
1.4 ISKAZI I VARIJABLE MATLAB je jezik izraza (expressions). Izrazi koji korisnik unese interpretiraju se i izvršavaju od strane sistema MATLAB-a. Generalni izraz u MATLAB-u može poprimiti neki od sljedećih oblika:
- izraz - var=izraz - [var1,var2,..]=izraz pri čemu je var skraćenica za ime varijable (veličine, promjenljive). Izrazi su sačinjeni od operatora, specijalnih karaktera (znakova), funkcija i imena varijabli. Izračunavanje izraza proizvodi matricu, koja se nakon toga pojavljuje na ekranu i vezuje za neku varijablu radi kasnije upotrebe. Ako se ime varijable i znak pridruživanja (=) izostave, automatski se kreira varijabla sa imenom ans, čije ime potiče od answer (odgovor, rezultat). Iskaz se normalno završava pritiskom na tipku . Ako je, međutim, zadnji karakter iskaza tačka-crta (semicolon ;), prikazivanje na ekranu se suspenduje iako su operacije definisane iskazom izvršene. Imena varijabli i funkcija moraju početi slovom, iza koga može slijediti proizvoljan broj slova, cifara ili podvučenih crta (znak _). Ime promjenljive ne smije da se "poklopi" sa ugrađenim imenima funkcija u programu. Za neka imena (ključne riječi programskog jezika) ovo neće biti dozvoljeno: >> for=3 ??? for=3 | Error: The expression to the left of the equals sign is not a valid target for an assignment. dok u nekim slučajevima može da dovede do neočekivanih problema u radu: >> cos=3 cos = 3 >> cos(x) ??? Subscript indices must either be real positive integers or logicals. U drugom slučaju nam je dozvoljeno da u promjenljivu cos smjestimo broj ali nakon toga ne možemo više koristiti ima cos za funkciju kosinus. Nakon brisanja promjenljive cos iz memorije stvari se vraćaju u normalu: >> clear cos >> cos(2) ans = -0.416146836547142 MATLAB razlikuje velika i mala slova. Tako, na primjer, a i A nijesu iste varijable. Opšte je pravilo da se ugrađene MATLAB funkcije moraju pisati malim slovima. Preporučuje se da se ova notacija zadrži u svim funkcijama koje korisnici kreiraju. 11
Primijetimo da je MATLAB veoma fleksibilan, u smislu da kao argument operatora mogu poslužiti veoma složeni izrazi sastavljeni od niza funkcija i operatora. Pri tome je redosljed izvršavanja pojedinih operacija u okviru iskaza naznačen običnim (malim) zagradama ( ). Primjer 1.4.1 Izračunati: sin ln(19 / 12) cos( 2 / 3) tg(5 / 12) »sin(sqrt(log(19/12)+cos(2*pi/3)*tan(5/12))) ans = 0.4689
Ranije smo napomenuli da se podaci mogu unositi u više ulaznih linija. Analogan postupak može se primijeniti i na unošenje složenih izraza. Naime, ukoliko je izraz toliko složen da ga ne možemo unijeti u jednoj ulaznoj liniji, ili želimo pregledniji ispis u više kolona, možemo ga prenijeti na sljedeću ulaznu liniju korišćenjem ... (tri mada može i više tačaka) i tipke . Primjer 1.4.2 Izraz »s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - 1/8 ... + 1/9 - 1/10 + 1/11 - 1/12; izračunava parcijalnu sumu alternativnog reda i pridružuje je varijabli s, ali je ne prikazuje na ekranu. Napomenimo da ovakvu sumu možemo i elegantnije izračunati, o čemu će kasnije biti riječi. Izrazi u MATLAB-u mogu imati više izlaznih argumenata (varijabli) i to u slučajevima kada to prirodno proizilazi iz namjene samog osnovnog operatora ugrađenog u MATLAB (vidjeli smo ranije [m,n]=size(a), sa izlaznim argumentima m i n) ili kada se posebno kreiraju funkcije u M-ili MEX-fajlovima.
1.5 BROJEVI I ARITMETIČKI IZRAZI Ranije smo pomenuli da MATLAB operiše sa realnim i kompleksnim brojevima. Za brojeve se koristi uobičajena decimalna notacija sa znakom minus i decimalnom tačkom. Faktor skaliranja u obliku stepena broja deset može se uključiti kao sufiks, radi konciznijeg predstavljanja broja. Na računarima koji koriste IEEE aritmetiku sa pokretnim zarezom relativna tačnost brojeva je eps, što znači oko 16 decimalnih mjesta. Opseg iznosi od realmin do realmax, gdje su realmin i realmax prethodno definisane MATLAB konstante koje zavise od -308 308 računara, mada uobičajeno iznose približno 2.22x10 i 1.8x10 , i predstavljaju najmanji i najveći pozitivni broj sa kojim se u MATLAB-u može računati. Primjer 1.5.1 Navodimo nekoliko mogućih oblika brojeva: 3 6.9362818
-99 0.0002 1.8305e-20 4.035278e23
gdje je sa Nem označen broj Nx10m. Izrazi se formiraju korišćenjem uobičajenih aritmetičkih operacija: + sabiranje, - oduzimanje, * množenje, / dijeljenje sdesna, \ dijeljenje slijeva, ^n stepenovanje sa n i niza elementarnih funkcija ugrađenih u MATLAB, kao što su sin, log, sqrt, tan, itd. U narednom poglavlju će biti data lista najčešće korišćenih elementarnih funkcija dok će u Glavi 5 biti objašnjen način za dodavanje novih funkcija pomoću M-fajlova. Napomenimo da dva operatora za dijeljenje daju isti rezultat kada operišemo sa skalarima, a njihovo uvođenje je bilo motivisano potrebom koja proizilazi iz operacija sa matricama, o ćemu će kasnije biti više riječi. Primjer 1.5.2 Izrazi »1/4,4\1,inv(4)*1 svi daju isti rezultat ans=
0.25
1.6 KOMPLEKSNI BROJEVI I MATRICE Ranije smo pomenuli da značajna fleksibilnost MATLAB-a proizilazi iz činjenice da su dozvoljene operacije sa kompleksnim brojevima. Oni mogu biti unešeni kao ulazni podaci, a mogu se prirodno pojaviti i kao rezultat primjene određenih funkcija ili operatora sa realnim argumentima. Zbog različite notacije u literaturi, imaginarna jedinica je u MATLAB-u prethodno definisana kao permanentna – globalna veličina (kao što je to urađeno sa eps, pi i sl.), i označena sa i i j. Korišćena je klasična definicija, tako da je: »i=sqrt(-1) 12
dok drugi korisnici preferiraju oznaku j: »j=sqrt(-1) Mi ćemo ovdje koristiti oznaku i. Kompleksni brojevi se mogu generisati kao: z=a+b*i, a, b-realni i imaginarni dio ili u obliku: w=r*exp(i*fi), r, fi- moduo i argument kompleksnog broja. Primjer 1.6.1 Unošenje »z=4+5*i rezultira u z =4.0000 + 5.0000i dok izraz »w=5*exp(2.5*i) daje »w =-4.0057 + 2.9924i Postoje najmanje dva načina za unošenje kompleksne matrice: -elementi se unose kao kompleksni, i -posebno se unose realni i imaginarni dio.
1 5i 2 6i Primjer 1.6.2 Za unošenje matrice sa kompleksnim elementima Z 3 7i 4 8i možemo ravnopravno koristiti sljedeće izraze: »a=[-1,2;3,4],b=[5,-6;7,8],Z=a+b*i što daje a=
-1 2 3 4 b = 5 -6 7 8 Z= -1.0000 + 5.0000i 2.0000 - 6.0000i 3.0000 + 7.0000i 4.0000 +8.0000i ili »Z1=[-1+5*i 2-6*i;3+7*i 4+8*i] sa istim rezultatom: Z1 = -1.0000 + 5.0000i 2.0000 - 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i MATLAB danas dozvoljava proizvoljan broj bjelina (blenkova i tabova) između tokena (naziva varijabli i znakova aritmetičkih operacija) što nije bio slučaj sa nekim ranijim verzijama. Ova osobina omogućava posebno pregledno pisanje programa. Primjer 1.6 3 Izrazi » w=[-1+4*i 2+5*i],w1=[-1 + 4 * i 2 +5 * i],w2=[-1 + 4 * i 2 + 5 * i] daju w= -1.0000 + 4.0000i 2.0000 + 5.0000i w1 = -1.0000 + 4.0000i 2.0000
0 + 5.0000i
w2 = -1.0000 + 4.0000i 2.0000 + 5.0000i
13
Vidimo da je MATLAB prvu i treću matricu protumačio na isti način a da je izostanak praznine ispred broja 5 u drugoj matrici protumačio kao poseban broj. Čest je programerski manir, na koji ovdje upozoravamo, da se pojedine (obično brojačke promjenljive) nazivaju i i j. Prilikom rada sa kompleksnim brojevima to može da rezultira neočekivanim poteškoćama, kao u sljedećem primjeru. Primjer 1.6.4 Z nije kompleksna veličina jer su i i j uzeli realne vrijednosti. » i=2;j=1; »z=3+5*i »z = 13 U predmetnom slučaju navedeni problem će se razrješiti sa: » clear i j čime će se izbrisati promjenljive koje je korisnik zadao pa će na raspolaganju biti globalne promjenljive koje predstavljaju kompleksnu jedinicu.
1.7 IZLAZNI FORMAT Ranije smo naglasili da se rezultat bilo kojeg iskaza MATLAB-a prikazuje na ekranu, zajedno sa imenima specificiranih veličina ili ans ukoliko veličinama nijesmo pridružili imena. Izlazni oblik prikazivanja brojeva (rezultata) može se kontrolisati upotrebom naredbe format. Ona utiče samo na to kako se matrice prikazuju na ekranu, a ne na to kako se računaju ili smještaju u memoriju (MATLAB sva izračunavanja vrši u dvostrukoj preciznosti osim ako to korisnik na neki način ne spriječi). primjer
Najprostiji slučaj imamo kada su svi elementi matrice cijeli brojevi. Tada se matrica prikazuje u formi bez decimalne tačke. Tako, na
»x=[-1 0 2] rezultira u x=
-1
0
2
Ukoliko najmanje jedan element matrice nije cio broj, postoje nekoliko mogućih izlaznih formata. Standardni format naziva se format short, a pokazuje 4 decimalna mjesta. Koristi se automatski (by default) ukoliko se ne specificira neki drugi format. Ostali formati prikazuju više značajnih cifara ili koriste eksponencijalnu notaciju. Razne oblike prikazivanja izlaznih veličina ilustrovaćemo na sljedećem primjeru. Primjer 1.7.1 Unesimo vektor od dva elementa »y=[4/3
1.2345e-6];
Različiti mogući formati i rezultujuće reprezentacije vektora su: »format short »y y = 1.3333 0.0000 »format short e »y y = 1.3333e+000 1.2345e-006 »format long y =1.33333333333333 0.00000123450000 »format long e y =1.333333333333333e+000 1.234500000000000e-006 » format short g y= 1.3333 1.2345e-006 » format long g y= 1.33333333333333 1.2345e-006 »format hex y = 3ff5555555555555 3eb4b3fd5942cd96 »format + y = ++ »format bank y =1.33 0.00 format + predstavlja kompaktan način prikazivanja velikih matrica, gdje se simboli +, - i prazni prostori (bjeline) koriste za pozitivne, negativne i nulte elemente matrice, respektivno. format bank se koristi kod prikazivanja finansijskih izvještaja, gdje se iznosi 14
zaokružuju na dvije decimale (euri i centi, dinari i pare, dolari i centi, itd.). Kod format long dobijamo tačnost na većem broju decimalnih mjesta. Ako koristimo format short ili format long, a najveći element matrice je veći od 1000 ili manji od 0.001, tada se obično rezultati prikazuju sa običnim formatom skalirani sa eksponencijalnim faktorom. Primjer 1.7.2 Unošenje »c=[21346 0.01] rezultira u c = 1.0e+004 * 2.1346 0.0000 dok promjenom formata sa »format long imamo sljedeću izlaznu reprezentaciju c = 1.0e+004 * 2.13460000000000 0.00000100000000 Primjer 1.7.3 Unošenjem » format rat » a=[0.234 1/pi] dobijamo a= 117/500
113/355
jer format rat vrši predstavljanje brojeva u obliku racionalnih razlomaka. Formati format short e, format long e, format short g i format long g prikazuju brojeve u "naučnom" zapisu u obliku aen koji je jednak n a10 . Pomenimo još dva formata: format compact i format loose koji se koriste kod prikazivanja većih matrica. Kod drugog formata prikazivanje pojedinih redova podataka se odvaja praznim redom dok kod prvog formata to nije slučaj. Postoje mogućnost da se format podesiti putem menija File/Preferences/Command Window kao i drugi načini vezani za podešavanje objekata u MATLAB-u koje ćemo razmotriti u Glavi 6.
1.8 GENERISANJE VEKTORA POMOĆU KARAKTERA : (DVIJE TAČKE) Karakter – operator : je veoma pogodan i često korišćen u MATLAB-u. Najviše se upotrebljava za generisanje vektora sa ekvidistantnim elementima. Naime, izraz oblika x=i:k k>i i, k-cijeli brojevi generiše vektor vrstu x=[i i+1 i+2 ... k-1 k] dok izraz y=(i:k)' k>i generiše vektor kolonu koja u stvari predstavlja transponovani vektor x. Primjer 1.8.1 Izrazi »x=3:8 »y=(1:4)' daju x= 3 4 y= 1 2 3 4
5
6
7
8
15
U dobijenim vektorima priraštaj je jednak +1. Ukoliko želimo proizvoljnu realnu vrijednost priraštaja (koraka), opšti oblik izraza za generisanje vektora vrste je x=xmin:xk:xmax
xmin + Matrix dimensions must agree. zbog toga što su dimenzije ovih matrica (33) i (31), respektivno. Primjer 2.2.2 Za matrice A i B definisane u primjeru 2.1.1, izrazi » C=A+B,C1=A-B daju zbir i razliku matrica A i B C= -2 4 0 4 -6 -4 0 -4 -12 C1 = 0 0 8 0 0 6 -8 -6 0 Osobenost MATLAB-a sastoji se u tome što su operacije + i - dopuštene i za različite dimenzije operanada, ali samo ukoliko je jedan od njih skalar, npr. M+s (M-matrica, s-skalar). Ovakav izraz MATLAB interpretira tako što svakom elementu matrice M dodaje (ili od njega oduzima) naznačeni skalar s, tj. skalar se posmatra kao konstantna matrica sa dimenzijom prilagođenom matrici koja se sabira (ili oduzima). Primjer 2.2.3 Za matrice B, x i skalar a, definisane u primjeru 2.1.1, izrazi » G=B+a,G1=x-a daju G= 4.2000 7.2000 1.2000 7.2000 2.2000 0.2000 9.2000 6.2000 -0.8000 G1 = -6.2000 -2.2000 2.8000 iako, po pravilima matričnog računa, nijesu korektni. Primjer 2.2.4 Provjerimo rezultate iz prethodnog primjera matematički korektnim izrazima » G=B+a*ones(size(B)),G1=x-a*ones(size(x)) sa rezultatom G= 4.2000 7.2000 1.2000 7.2000 2.2000 0.2000 9.2000 6.2000 -0.8000 22
G1 = -6.2000 -2.2000 2.8000 Sva navedena pravila, uključujući i ono o kompatibilnosti skalara i matrice pri sabiranju i oduzimanju, važe za matrice i skalare sa kompleksnim elementima. Primjer 2.2.5 Izrazi » z=1+2*i;N=z+Z pri čemu smo kompleksnu matricu Z ranije definisali u primjeru 2.1.2, daju N=
0 + 4.0000i 3.0000 + 5.0000i -2.0000 + 6.0000i 6.0000
2.3 MNOŽENJE MATRICA Matrično množenje u MATLAB-u je označeno operatorom *. Shodno pravilima matričnog računa, ova operacija je definisana kada su "unutrašnje" dimenzije činilaca iste, tj. ako je broj kolona prvog činioca jednak broju vrsta drugog. Primjer 2.3.1 Prethodno definisani x i A (primjer 2.1.1) ne ispunjavaju navedeni uslov, pa će iskaz » c=x*A proizvesti poruku: ??? Error using ==> * Inner matrix dimensions must agree. dok je iskaz » c=A*x korektan specijalan slučaj matričnog proizvoda, koji će dati c= 39 -3 -59 Mogućnosti množenja vektora sa vektorom, tj. takozvani skalarni (unutrašnji) i spoljni proizvod vektora, ilustrovaćemo na narednom primjeru. Primjer 2.3.2 Sa definisanim vektorima » x=[1 2 3],y=[1 -1 2] x= 1 2 3 y= 1 -1 2 izrazi » c=x*y',c1=y*x' daju isti rezultat, tj. skalarni proizvod dva vektora c= 5 c1 = 5 Spoljni proizvodi rezultiraće iz izraza » D=x'*y,D1=y'*x D= 1 -1 2 2 -2 4 3 -3 6 D1 = 1 2 3 -1 -2 -3 2 4 6 pri čemu je očigledno da su matrice D i D1 povezane relacijom D'=D1. Naravno, izraz » x*y 23
daje poruku greške: ??? Error using ==> * Inner matrix dimensions must agree. Matrica ili vektor prirodno se množi sa skalarom. Primjer 2.3.3 Sa prethodno definisanim A i x (primjeri 2.1.1 i 2.3.2), izrazi » A*pi,6.3*x rezultiraju sa ans = -3.1416 6.2832 -12.5664 ans = 6.3000
6.2832 12.5664 -9.4248 3.1416 -15.7080 -18.8496 12.6000 18.9000
2.4 MNOŽENJE POLJA BROJEVA Za množenje uređenih skupova brojeva ne važe pravila matričnog računa, već se množenje vrši po principu element-po element, a odgovarajući operator je označen sa .*. Za ovakvu operaciju činioci moraju imati iste dimenzije ako su brojevi uređeni u obliku matrica ili vektora. Naime, ako A i C označavaju dva takva skupa brojeva, tada E=A.*C daje novi skup brojeva E čiji su elementi proizvodi korespondentnih elemenata iz skupova A i C. Primjer 2.4.1 Sa prethodno definisanim A i C (primjeri 2.1.1 i 2.2.1), izrazi » E1=A*C » E=A.*C su, s obzirom na dimenzije varijabli A i C, oba legitimni, samo što su operacije izvršene po različitim pravilima tako da daju različite rezultate: E1 = 10 -32 -56 -16 22 0 -12 38 92 E= 2 8 0 8 18 -4 0 20 72 Primjer 2.4.2 Za ranije definisane varijable A, x, y, (primjeri 2.1.1 i 2.3.2), izraz » A.*x rezultuje greškom ??? Error using ==> .* Matrix dimensions must agree. dok izrazi » g=x.*y » g1=x.*(-2) daju g= 1 -2 6 g1 = -2 -4 -6 Vidimo da ukoliko je jedan od činilaca skalar, rezultat primjene operatora .* će biti isti kao kod običnog matričnog množenja *, tj. svaki element matrice ili vektora množi se sa skalarom.
2.5 DETERMINANTA I INVERZNA MATRICA Determinanta kvadratne matrice X, X, izračunava se pomoću operatora det(X). Primjer 2.5.1 Ako unesemo matricu A sa realnim elementima » A=[1 5 8;3 -1 2;4 -4 6] A= 1 5 8 3 -1 2 24
4 -4 izraz
6
» d=det(A) daje d= -112 a na isti način dobijamo determinantu matrice sa kompleksnim elementima. Naime, unošenjem matrice » B=[-1+2*i 1-2*i i;-i 2 1+i;-2 3*i 4+i]; izraz » d1=det(B) daje d1 = -8.0000 +38.0000i Primjer 2.5.2 Sa matricama iz prethodnog primjera provjeriti relaciju AB=AB. » det(A*B)-det(A)*det(B) ans = 0 Inverzna matrica X kvadratne nesingularne matrice X, dobija se primjenom operatora inv(X). Primjer 2.5.3 Za matrice A i B iz primjera 2.5.1, izrazi » Ai=inv(A),Bi=inv(B) daju Ai = -0.0179 0.5536 -0.1607 0.0893 0.2321 -0.1964 0.0714 -0.2143 0.1429 Bi = -0.0836 - 0.2719i 0.2241 + 0.1897i -0.0915 - 0.0597i 0.0663 + 0.0650i 0.2586 + 0.1034i -0.0464 - 0.0955i -0.0371 - 0.1764i 0.1552 - 0.1379i 0.1260 - 0.0265i U MATLAB-u ne postoji posebni operator za izračunavanje adjungovane matrice ali je, na osnovu definicije inverzne matrice, očigledno da izraz » adjA=inv(A)*det(A) daje adjungovanu matricu matrice A adjA = 2.0000 -62.0000 18.0000 -10.0000 -26.0000 22.0000 -8.0000 24.0000 -16.0000
2.6 "DIJELJENJE" MATRICA U matričnom računu dijeljenje nije precizno definisano (osim ako je djelilac skalar). U MATLAB-u, međutim, postoje dva operatora za "dijeljenje" matrica: /
koji označava takozvano "dijeljenje" s desna, i
\
koji označava takozvano "dijeljenje" s lijeva.
Značenje ovih operatora razmotrićemo, za sada, samo za specijalni slučaj kada se radi o kvadratnim nesingularnim matricama. Neka je, naime, matrica A kvadratna i nesingularna. Tada izraz: X=A\B -1
-1
odgovara množenju matrice B s lijeva sa A , tj. X=A B, dok izraz: X=B/A -1
-1
odgovara množenju matrice B s desna sa A , tj. X=BA , pri čemu se primjenom operatora \ i / rezultati dobijaju direktno, bez računanja inverzne matrice. Dijeljenje s lijeva A\B definisano je samo u slučaju kada je broj vrsta matrica A i B isti. 25
Primjer 2.6.1 Za matrice A i B iz prethodnog primjera i b=[1 2 3]', izrazi » x=A\b,X=A\B imaju smisla i daju x= 0.6071 -0.0357 0.0714 X= 0.3393 - 0.5893i 1.0893 - 0.4464i -0.0893 + 0.3750i 0.3036 - 0.0536i 0.5536 - 0.7679i -0.5536 + 0.1250i -0.3571 + 0.3571i -0.3571 + 0.2857i 0.3571 - 0.0000i dok za c=2 i d=b', izrazi » x=A\c,X=A\d nijesu definisani i rezultiraće porukom o neslaganju dimenzija. Dijeljenje s desna B/A može se izraziti preko dijeljenja s lijeva kao B/A=(A'\B')', i ima smisla samo ako je broj kolona varijabli A i B isti. Primjer 2.6.2 Za veličine iz prethodnog primjera, izrazi » y=d/A,Y=B/A imaju smisla, i daju rezultate y= 0.3750 0.3750 -0.1250 Y= 0.1071 - 0.1429i -0.3214 + 0.4286i -0.0357 + 0.2143i 0.2500 + 0.0893i 0.2500 - 0.7679i -0.2500 + 0.3036i 0.3214 + 0.3393i -1.9643 + 0.4821i 0.8929 - 0.4464i dok izrazi »y=c/A »b/A nijesu definisani i rezultiraće porukom o neslaganju dimenzija matrica koje se "dijele". Napomenimo ovdje da izraz X=A\B predstavlja rješenje za AX=B, dok izraz X=B/A predstavlja rješenje za XA=B. O operatorima \ i / biće više riječi u osmom poglavlju, gdje ćemo razmotriti njihovu upotrebu pri rješavanju skupa linearnih jednačina u opštem slučaju.
2.7 DIJELJENJE POLJA BROJEVA Za dijeljenje uređenih skupova brojeva važe drugačija pravila pa se upotrebljavaju i različiti simboli: ./ za dijeljenje s desna, i .\ za dijeljenje s lijeva. Tačka u simbolu za dijeljenje označava da se ova operacija vrši na korespondentnim elementima. Tako, izraz C=A./B (ili njemu ekvivalentan C=B.\A) znači da su elementi skupa C izračunati po pravilu c(i,j)=a(i,j)/b(i,j), gdje su a(i,j) i b(i,j) odgovarajući elementi skupova A i B. Na isti način, izrazi D=A.\B (tj. D=B./A) znače da je d(i,j)=b(i,j)/a(i,j). Iz ovakvih pravila očigledno slijedi: da bi navedeni izrazi imali smisla A i B moraju imati iste dimenzije. Jedini, ali veoma praktičan, izuzetak od ovog pravila predstavlja slučaj kada je dijeljenik ili djelilac skalar. Tako izrazi D=k./A odnosno D=A.\k znače da je d(i,j)=k/a(i,j), dok izrazi D=A./k odnosno D=k.\A znače da se elementi skupa D računaju po relaciji d(i,j)=a(i,j)/k (u ovom slučaju operator tačka nije ni bio potreba). Primjer 2.7.1 Unesi polja A i B i naći njihove količnike. » A=[1 0 -2;-1 2 0],B=[-3 0 4;0 2 -1] A= 1 0 -2 -1 2 0 B= -3 0 4 0 2 -1 » C=A./B Warning: Divide by zero 26
C= -0.3333 NaN -0.5000 -Inf 1.0000 0 » D=B./A Warning: Divide by zero D= -3 NaN -2 0 1 -Inf Pošto A i B iz primjera sadrže neke elemente jednake nuli, dobijamo poruku o dijeljenju sa nulom, a u rezultatu se javlja Inf ili NaN. Primjer 2.7.2 Za a=2 i polja A i B iz prethodnog primjera, izračunati a./A i B./a. Unošenjem » A1=a./A dobijamo Warning: Divide by zero A1 = 2 Inf -1 -2 1 Inf dok » B1=B./a daje B1 = -1.5000 0 2.0000 0 1.0000 -0.5000 Vidimo da je efekat isti kao da smo koristili naredbe: » A1=a*ones(size(A))./B, odnosno » B1=B./(a*ones(size(B))) Postoji jedna značajna razlika ove verzije MATLAB-a u odnosu na neke prethodne verzije u pogledu dijeljenja skalara poljem brojeva. Naime u MATLAB-u for Windows izraz: » 4./A je korektan i rezultira Warning: Divide by zero ans = 4 Inf -2 -4 2 Inf dok bi u prethodnim verzijama MATLAB-a rezultirao greškom. Neke "starije" verzija MATLAB-a tačku tumače kao decimalni zarez pa matrične dimenzije nijesu odgovarale. Obično se primjenjivao trik da se prethodni izraz zapisivao u obliku 4../A gdje prva tačka i dalje označava decimalni zarez a druga operaciju na polju brojeva.
2.8 STEPENOVANJE MATRICA Ako je A kvadratna matrica a p pozitivan cio broj, matrični stepen definiše se kao p
A =AAAA...A, p puta odnosno, za A nesingularnu matricu -p
-1 p
A = (A )
Stepenovanje kvadratne matrice vrši se pomoću operatora ^, tako da izrazi A^p i A^(-p) daju p-ti i (-p)-ti matrični stepen od A. 2
-2
0
Primjer 2.8.1 Za proizvoljnu nesingularnu matricu A odrediti A , A i provjeriti da li važi: A =I, gdje je I jedinična matrica iste dimenzije kao A. » A=[-1 2 3;2 -2 1;1 4 2] A= -1 2 3 2 -2 1 1 4 2 » B=A^2 B= 8 6 5 -5 12 6 9 2 11 » C=A^0 27
C= 1 0 0
0 1 0
0 0 1 Ukoliko p nije cio broj, već proizvoljan realan broj, operacija stepenovanja kvadratne matrice A ima različito značenje i vrši se po p p p drugačijem pravilu. A je definisano preko sopstvenih vrijednosti i vektora (za definiciju ovih pojmova vidi deveto poglavlje) kao A =VD V 1 , gdje je D dijagonalna matrica koja sadrži sopstvene vrijednosti matrice A na glavnoj dijagonali, a V je matrica sačinjena od odgovarajućih sopstvenih vektora matrice A. Samo stepenovanje D jednostavno se vrši stepenovanjem pojedinih skalarnih elemenata sa glavne dijagonale. Ukoliko A sadrži kompleksne sopstvene vrijednosti, A će takođe biti kompleksna matrica. Primjer 2.8.2 Za matrice A= 2 -2 3 1 1 1 1 3 -1 B= -2 2 3 2 -2 1 2 4 2 2.6 -1.56 nađi matrične stepene A i B . » A1=A^2.6 A1 = 9.1993 + 0.0000i -0.4674 + 4.2285i 8.6667 - 4.2285i 8.1993 + 0.0000i 2.4483 + 0.3844i 6.7510 - 0.3844i 8.1993 - 0.0000i 4.3218 - 5.3817i 4.8775 + 5.3817i » B1=B^(-1.56) B1 = -0.0730 - 0.0000i -0.0176 + 0.0000i 0.1023 + 0.0000i 0.3043 - 0.0000i -0.0086 - 0.0000i -0.1376 + 0.0000i -0.1464 + 0.0000i 0.0935 + 0.0000i 0.1493 - 0.0000i A Na sličan način, izraz p , gdje je p skalar a A kvadratna matrica, računa se preko sopstvenih vrijednosti i vektora. A
B
Primjer 2.8.3 Za matrice A i B iz prethodnog primjera nađi (2) i (-3.6) . » A1=2^A A1 = 5.0000 -0.6833 3.6833 3.0000 2.4833 2.5167 3.0000 2.2333 2.7667 » B1=(-3.6)^B B1 = 1.0e+002 * 0.0825 + 0.5963i 0.1176 + 0.8498i 0.1482 + 1.0736i 0.0470 + 0.3472i 0.0684 + 0.4958i 0.0870 + 0.6259i 0.1458 + 1.0508i 0.2070 + 1.4985i 0.2613 + 1.8939i B Izraz A , gdje su A i B matrice, nije korektan i ukoliko pokušamo da stepenujemo matricu sa matricom, dobićemo poruku greške. Greška će se javiti u svim slučajevima kada pokušamo računati matrični stepen a matrica nije kvadratna.
2.9 STEPENOVANJE POLJA BROJEVA Stepenovanje polja brojeva (element po element), u MATLAB-u je označeno sa .^. Izraz oblika C=A.^B gdje su A i B matrice, moguć je samo ako su A i B istih dimenzija, a elementi polja C dobijaju se po relaciji b(i,j)
c(i,j)=a(i,j)
Primjer 2.9.1 Stepenovati, element po element, matrice A i B iz prethodnog primjera. Pošto su iste dimenzije, izrazi » C1=A.^B,C=B.^A daju C1 = 0.2500 4.0000 27.0000 1.0000 1.0000 1.0000 1.0000 81.0000 1.0000 C= 28
4.0000 0.2500 27.0000 2.0000 -2.0000 1.0000 2.0000 64.0000 0.5000 Za vektor x=[1 -2 3], izraz » A.^x daje poruku ??? Error using ==> .^ Matrix dimensions must agree. B Specijalni slučajevi generalnog izraza C=A nastupaju kada je u osnovi ili eksponentu skalar. Tako izrazi C=A.^p i D=p.^A, gdje je p skalar a A matrica proizvoljne dimenzije, u MATLAB-u imaju smisla a elementi C i D računaju se kao p
c(i,j)=a(i,j)
i d(i,j)=p
b(i,j)
Primjer 2.9.2 Za x=[-1 -2 2] i y=[0.5 2 3] imamo » (-3).^x ans = -0.3333 0.1111 9.0000 » y1=y.^3 y1 = 0.1250 8.0000 27.0000 » 3.^y ans = 1.7321 9.0000 27.0000 U posljednjem izrazu MATLAB praviln tumači operator kao stepenovanje polja brojeva a ne kao decimalnu tačku.
2.10 ELEMENTARNE MATEMATIČKE FUNKCIJE Osnovni operatori ugrađeni u MATLAB sadrže i skup elementarnih matematičkih funkcija čija je lista data u priloženoj tabeli. Elementarne matematičke funkcije Kompleksne funkcije abs angle conj
apsolutna vrijednost ili moduo fazni stav konjugovanje
real imag unwrap
realni dio imaginarni dio dobijanje neprekidne faze
Numeričke funkcije fix floor ceil gcd rat
zaokruživanje prema nuli zaokruživanje prema - zaokruživanje prema najveći zajednički djelilac racionalna aproksimacija
round rem sign lcm rats
zaokr. ka najbl. cijelom broju ostatak pri dijeljenju funkcija znaka (signum) najmanji zajednički sadržalac racionalni rezultat
Trigonometrijske funkcije sin asin cos acos tan atan atanh sech csc acsc cot acot
sinus arkus sinus kosinus arkus kosinus tangens arkus tangens arkus tangens hiperbolni sekans hiperbolni kosekans arkus kosekans kotangens arkus kotangens
sinh asinh cosh acosh tanh atan2 sec asech csch acsch coth acoth
hiperbolni sinus arkus sinus hiperbolni kosinus hiperbolni arkus kosinus hiperbolni tangens hiperbolni arkus tangens četiri kvadranta sekans arkus sekans hiperbolni kosekans hiperbolni arkus kosekans hiperbolni cotangens hiperbolni arkus kotangens hiperbolni 29
Eksponencijalne funkcije exp log10 expint pow2
eksponencijalna funkcija logaritam sa osnovom 10 eksponencijalna integralna f-ja stepen dvojke
log sqrt log2
prirodni logaritam kvadratni korijen logaritam sa osnovom 2
Beselove, beta, gama i eliptičke funkcije besselj besseli bessel beta betaln
Beselova funkcija prve vrste modifik. Beselova f-ja prve vrste Beselova f-ja komplex. argum. beta funkcija logaritam beta funkcije gammainc nekompletna gama funkcija ellipj Jakobijeva eliptička funkcija
bessely besselk betainc gamma gammaln ellipke
Beselova funkcija druge vrste modif. Besel. f-ja druge vrste nekompletna beta funkcija gama funkcija logaritam gama funkcije kompletna eliptička funkcija
Funkcija greške erf erfcx
funkcija greške skalirana komplem. f-ja gre{ke
erfc erfinv
komplementarna f-ja greške inverzna funkcija greške
Ako sa f(X) označimo generalnu matematičku funkciju, možemo sumirati neke osnovne osobine većine operatora navedenih u predmetnoj tabeli: 1) Zadati argument X (koji može biti skalar, vektor ili matrica) tretira se kao polje brojeva, tj. za X 11 X X 21 X m1
X 12 X 22 X m2
X 1n X 2n X mn
imamo f ( X 11 ) f (X ) 21 f (X ) f ( X m1 )
f ( X 12 ) f ( X 22 ) f ( X m2 )
f ( X 1n ) f ( X 2n ) f ( X mn )
2) X može imati realne ili kompleksne elemente. 3) Složeni izrazi i nove funkcije grade se pomoću elementarnih funkcija i operacija za manipulaciju sa poljima brojeva +,-,.*,./,.\,.^.
2.10.1 FUNKCIJE ABS, ANGLE, REAL, IMAG, CONJ I UNWRAP Na jednom primjeru ilustrovaćemo značenje i sintaksu naredbi abs, angle, real, imag i conj. Primjer 2.10.1 Za dato polje brojeva Z Z= -1.0000 + 2.0000i 1.0000 - 3.0000i 3.0000 + 4.0000i 2.0000 - 6.0000i izraz » az=abs(Z) daje az = 2.2361 3.1623 5.0000 6.3246 tj. apsolutne vrijednosti elemenata polja Z. Izraz » an=angle(Z) 30
daje an = 2.0344 -1.2490 0.9273 -1.2490 tj. uglove (fazne stavove) elemenata Z izražene u radijanima. Ukoliko želimo dobiti njihove vrijednosti u stepenima, primijenićemo » an*180/pi što daje ans = 116.5651 -71.5651 53.1301 -71.5651 Izraz » Re=real(Z) daje realni dio polja (ili matrice) Z, tj. Re = -1 1 3 2 a na sličan način: » Im=imag(Z) daje imaginarni dio Im = 2 -3 4 -6 dok se konjugovana matrica (polje) dobija pomoću izraza » Zc=conj(Z) Zc = -1.0000 - 2.0000i 1.0000 + 3.0000i 3.0000 - 4.0000i 2.0000 + 6.0000i Osnovni problem kod naredbe angle je činjenica da daje rezultat koji je je u granicama [-,) a to može da za neke podatke produkuje prekidne funkcije faze u uslovima kada je faza neprekidna. Često su ovi prekidi nepovoljno za dalju obradu. Funkcija unwrap nastoji da izbjegne prekide u fazi odnosno da formira neprekidnu funkciju faze. Primjer 2.10.2 Prikazati fazu signala exp(jx) funkcijom angle i funkcijom » x=0:pi/10:2*pi; » subplot(221), plot(angle(exp(j*x))) » subplot(222), plot(unwrap(angle(exp(j*x))) Ovdje vidimo jasno razliku u korišćenju dva pristupa gdje prvim pristupom dobijamo rješenje u granicama [-,) dok drugi pristup daje neprekidnu funkciju. Funkcije koje se koriste za grafički prikaz biće objašnjene u sljedećem poglavlju.
a) b) Slika 2.1 Faza signala sa linearnom funkcijoma: a) Funkcija angle()
2.10.2 FUNKCIJE ZA ZAOKRUŽIVANJE U MATLAB-u postoje četiri operatora za zaokruživanje realnih brojeva. Operatore i njihovo značenje možemo ilustrovati sljedećim dijagramima:
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
31
round(x) zaokruživanje na najbliži cio broj
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
fix(x) zaokruživanje prema nuli
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
floor(x) zaokruživanje prema -
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
ceil(x) zaokruživanje prema + Primjer 2.10.3 Neka je matrica (ili polje brojeva) data sa A= -3.5600 5.2300 2.6700 -1.2400 Primjena pojedinih operatora za zaokruživanje daje: » R=round(A) R= -4 5 3 -1 » F=fix(A) F= -3 5 2 -1 » C=ceil(A) C= -3 6 3 -1 » F1=floor(A) F1 = -4 5 2 -2 Kompleksni brojevi se zaokružuju tako što se posebno zaokruže realni i imaginarni djelovi. Ako uzmemo Z iz prethodnog primjera, izraz » Z1=Z*2*pi daje Z1 = -6.2832 +12.5664i 6.2832 -18.8496i 18.8496 +25.1327i 12.5664 -37.6991i pa operatori za zaokruživanje round i ceil daju » round(Z1) ans = -6.0000 +13.0000i 19.0000 +25.0000i » ceil(Z1) ans = -6.0000 +13.0000i 19.0000 +26.0000i
6.0000 -19.0000i 13.0000 -38.0000i 7.0000 -18.0000i 13.0000 -37.0000i
2.10.3 EKSPONENCIJALNA, LOGARITAMSKA, STEPENA I FUNKCIJA KVADRATNOG KORIJENA x
Eksponencijalna funkcija definisana je operatorom exp. Tako exp(X) daje e za svaki element polja X. Za kompleksni broj z=x+iy, z x exp(z) računa kompleksnu eksponencijalnu funkcija e =e (cos y + isin y). Primjer 2.10.4 Ilustrova}emo primjenu eksponencijalne funkcije za polja 32
. 5.23 1 2i 1 3i 356 A i Z 3 4i 2 6i 2.67 1.24 » exp(A) ans = 0.0284 186.7928 14.4400 0.2894 » exp(Z) ans = -0.1531 + 0.3345i -2.6911 - 0.3836i -13.1288 -15.2008i 7.0948 + 2.0646i j log(X) daje prirodne logaritme elemenata polja X. Ukoliko je z=re negativan ili kompleksan broj, izraz log(z) računa kompleksni prirodni logaritam, po formuli lnz=lnr+ i. Logaritam za osnovu 10 od elemenata polja X definisan je sa operatorom log10(X). Primjer 2.10.5 Za polja A i Z iz prethodnog primjera, dobijamo: » log(A) ans = 1.2698 + 3.1416i 1.6544 0.9821 0.2151 + 3.1416i » log(Z) ans = 0.8047 + 2.0344i 1.1513 - 1.2490i 1.6094 + 0.9273i 1.8444 - 1.2490i » log10(A) ans = 0.5514 + 1.3644i 0.7185 0.4265 0.0934 + 1.3644i » log10(Z) ans = 0.3495 + 0.8835i 0.5000 - 0.5425i 0.6990 + 0.4027i 0.8010 - 0.5425i Specifične funkcije ove grupe su log2 i pow2. log2 kao funkcija jednog argumenta log2(X) daje logaritam sa osnovom 2 elemenata x matrice. pow2(X), funkcija jednog argumenta daje matricu čiji su elementi 2 . Za matrice sa realnim argumentima može se zahtjevati da funkcija log2(X) ima dva izlazna argumenta: [f,e]=log2(X) e Vrijednost matrice f su brojevi izme|u 0.5 i 1 takvi da važi X=f 2 . Funkcija x=pow2(f,e) ima suprotan efekat. Primjer 2.10.6 Naći logaritam sa osnovom 2 matrice A korišćene u prethodnim primjerima, četvrti stepen broja 2 i na nizu brojeva od 1 do 16 demonstrirati ostale mogućnosti naredbi log2 i pow2. » log2(A) ans = 1.8319 + 4.5324i 2.3868 1.4168 0.3103 + 4.5324i » x=pow2(4) x= 16 » [f,e]=log2(1:16) f= Columns 1 through 7 0.5000 0.5000 0.7500 0.5000 0.6250 0.7500 0.8750 Columns 8 through 14 0.5000 0.5625 0.6250 0.6875 0.7500 0.8125 0.8750 Columns 15 through 16 0.9375 0.5000 e= Columns 1 through 12 1 2 2 3 3 3 3 4 4 4 4 4 Columns 13 through 16 4 4 4 5 » x=pow2(f,e) x= Columns 1 through 12 33
1 2 3 4 5 6 7 8 9 10 11 12 Columns 13 through 16 13 14 15 16 Operator sqrt(X) daje kvadratni korijen elemenata matrice X, pri čemu se kompleksni rezultat dobije za negativne elemente, po definiciji z r [cos( / 2 k ) i sin( / 2 k )], k 0,1 .
Primjer 2.10.7 Naći kvadratni korijen prethodno zadatih polja brojeva A i Z. » sqrt(A) ans = 0 + 1.8868i 2.2869 1.6340 0 + 1.1136i » sqrt(Z) ans = 0.7862 + 1.2720i 1.4426 - 1.0398i 2.0000 + 1.0000i 2.0402 - 1.4705i
2.10.4 TRIGONOMETRIJSKE, HIPERBOLNE I NJIMA INVERZNE FUNKCIJE Operatori sin(X), cos(X), tan(X), cot(X), sec(X) i csc(X) daju trigonometrijske funkcije za argumente definisane u radijanima. I oblast definisanosti i oblast vrijednosti ovih funkcija uključuju kompleksne brojeve. Za kompleksne argumente z=x+iy važe sljedeće definicije: iz
-iz
iz
-iz
sin z=(e -e )/2i
cos z=(e +e )/2
tan z=sin z/cos z
cot z=cos z/sin z
sec z=1/cos z
csc z=1/sin z
Operatori asin(X), acos(X), atan(X), acot(X), asec(X) i acsc(X) daju inverzne trigonometrijske funkcije u radijanima. Za realne vrijednosti x, takve da je abs(x)1, kao i za kompleksne vrijednosti x, acos(x) i asin(x) daju kompleksne vrijednosti po pravilu
cos1 ( x ) i ln( x i 1 x 2 )
sin 1 ( x) i ln(ix 1 x 2 ) Na sličan način, za kompleksne x, operatori atan(x) i acot(x) daje kompleksne vrijednosti po pravilu
tan 1 ( x) i ln i x 2 i x
cot 1 ( x ) i ln ix 1 2 ix 1
Funkcija atan2(Y,X) daje tzv. četvorokvadrantni arkus tangens. Vidimo da zahtijeva dva ulazna argumenta, jer vrijednosti Y i X određuju kvadrant u kome se pridružena varijabla X+iY nalazi, tako da za računanje arkus tangensa nije dovoljno poznavati samo odnos Y/X. Rezultat se dobija u opsegu [-, ). U m-fajlovima postoje i hiperbolne funkcije sinh, cosh, tanh, coth, sech i csch kao i inverzne hiperbolne funkcije asinh, acosh, atanh, acoth, asech i acsch. Primjer 2.10.8 Za polja A i Z iz primjera 2.10.3, ilustrovaćemo pojedine od navedenih elementarnih matematičkih funkcija: » sin(A),sin(A+2*pi),sin(Z),sin(Z+2*pi) ans = 0.4063 -0.8690 0.4543 -0.9458 ans = 0.4063 -0.8690 0.4543 -0.9458 ans = 1.0e+002 * -0.0317 + 0.0196i 0.0847 - 0.0541i 0.0385 - 0.2702i 1.8342 + 0.8394i ans = 1.0e+002 * -0.0317 + 0.0196i 0.0847 - 0.0541i 0.0385 - 0.2702i 1.8342 + 0.8394i » asin(Z) ans = 34
-0.4271 + 1.5286i 0.3076 - 1.8642i 0.6340 + 2.3055i 0.3181 - 2.5426i » tan(Z), cot(A), 1./tan(A) ans = -0.0338 + 1.0148i 0.0045 - 1.0021i -0.0002 + 0.9994i 0.0000 - 1.0000i ans = -2.2489 -0.5694 -1.9609 -0.3434 ans = -2.2489 -0.5694 -1.9609 -0.3434 » atan2(imag(Z),real(Z)) ans = 2.0344 -1.2490 0.9273 -1.2490 » angle(Z) ans = 2.0344 -1.2490 0.9273 -1.2490 » sec(A), sec(A),1./cos(A) ans = -1.0944 2.0210 -1.1225 3.0789 ans = -1.0944 2.0210 -1.1225 3.0789 ans = -1.0944 2.0210 -1.1225 3.0789 » sinh(A) ans = -17.5674 93.3937 7.1854 -1.5831 Vidimo da za Z=X+iY operatori angle(Z) i atan2(Y,X) daju isti rezultat. Premda je veza između radijana i stepena jednostavna odnosno linearna tako da od svake vrijednosti u stepenima možemo dobiti vrijednost u radijanima pomnožimo sa /180 u aktuelnim verzijama MATLAB-a postoje funkcije sind, cosd, tand, cotd, secd, cscd koje računaju trigonometrijske funkcije za podatke koji su dati u stepenima.
2.10.5 BESSELOVE, BETA, GAMA I FUNKCIJE GREŠKE Operatori besselj, bessely, besseli, besselk i besselh služe za izračunavanje Besselovih funkcija (redom su u pitanju Besselova funkcija prve vrste, druge vrste, modifikovana funkcija prve vrste, modifikovana funkcija druge vrste i funkcija treće vrste koja se naziva I Hankelovom). Diferencijalna jednačina oblika 2 2 x y"+ xy'+(x - )y = 0, naziva se Besselova jednačina, a njena rješenja poznata su pod imenom Besselove funkcije. besselj(alfa,X) izračunava Besselovu funkciju prve vrste reda >0 za svaki element polja X. bessely(alfa,X) izračunava Besselovu funkciju druge vrste reda > x=erfinv(-1:.2:1) x= -Inf -0.9062 -0.5951 -0.3708 -0.1791
0 0.1791 0.3708 0.5951 0.9062
36
Inf
a)
b)
Slika 2.4. a) Funkcija greške; b) Komplementarna funkcija greške
2.10.6. SPECIFIČNE NUMERIČKE FUNKCIJE Broj prikazan u pokretnom zarezu može se prikazati u obliku razlomaka. Funkcija rat(x) prikazuje racionalni broj u obliku sume razlomaka. Drugi oblik ove naredbe je a,b=rat(x,greska) vraća vrijednost a i b za koju važi:
a / b x greska x Ako se argument greska izostavi, njegova se vrijednost uzima po pravilu opisanom u help-u. Druga naredba za racionalnu aproksimaciju je rats(x,l) koja vraća prosti razlomak koji aproksimira broj x (odnosno svaki element matrice x) a l predstavlja mjeru tačnosti sa kojom će se aproksimacija izvršiti. Ako se l izostavi podrazumjeva se vrijednost l=13, za bolju preciznost treba uzeti veće l. Primjer 2.10.13 Demonstrirati naredbe rat i rats. Unošenje » rat(0.234), rat(pi) rezultira sa 0 + 1/(4 + 1/(4 + 1/(-3 + 1/(11)))) 3 + 1/(7 + 1/(16)) Dakle, važi približna relacija:
3
1
7 1 16
Drugi oblik naredbe rat » [a,b]=rat(pi) a= 355 b= 113 što znači da je 355/113. Isti izraz sa zadatom većom tačnošću daje » [a,b]=rat(pi,2^(-52)) a= 80143857 b= 25510582 Unošenje » rats(1.234) rezultira sa ans = 617/500 » rats(pi) ans = 355/113 dok sa povećanom ili smanjenom tačnošću dobijamo » rats(pi,20) ans = 312689/99532 37
» rats(pi,5) ans = 22/7 Za određivanje najvećeg zajedničkog djelioca i najmanjeg zajedničkog sadržaoca koriste se funkcije gcd i lcm respektivno. Ostatak dijeljenja se dobija sa rem dok je funkcija znaka broja sign. Funkcija gcd(a,b) za cijele brojeve a i b nalazi najmanji zajednički djelilac (broj sa kojim se mogu podijeliti oba broja bez ostatka). Oblik ove naredbe [A,B,C]= gcd(a,b) daje A najmanji zajednički djelilac tako da važi linearna kombinacija A=aB+bC. Ovaj oblik izraza ima mnoštvo primjena u nauci i tehnici kao što je rješavanje Diofantske jednačine te provođenje Euklidskog algoritma za dekodiranje. Funkcija lcm(a,b) za cijele brojeve a i b daje najmanji broj u kojem se a i b sadrže bez ostatka. Naredba rem(a,b) daje ostatak pri dijeljenju a sa b. Funkcija znaka sign vraća -1 za one elemente matrice koji su negativni, +1 za pozitivne i 0 za nulte elemente matrice. Primjer 2.10.14 Na primjerima demonstrirati opisane funkcije » G=gcd(17,6) G= 1 » G=gcd(25,35) G= 5 » [G,C,D]=gcd(25,35) G= 5 C= 3 D= -2 Provjerite da li je 25C+35D jednako G. » GCD(0,0) ans = 0 Dakle, brojevi 17 i 6 su uzajamno prosti. Po definiciji se usvaja da je gcd(0,0)=0. Demonstrirajmo i funkciju lcm: » lcm(23,34), lcm(12,42) ans = 782 ans = 84 Odredimo ostatak pri dijeljenju 23 i 3, 234 i 3, pa demonstrirajmo funkciju sign. » rem(23,3) ans = 2 » rem(234,3) ans = 0 » sign([-23 0 12]) ans = -1 0 1
2.11. FUNKCIJE ZA MANIPULACIJU MATRICAMA Već smo se sreli sa nekim operacijama za manipulaciju kolona i vrsta matrica (operator : i transponovanje). Ponekad ovo nije dovoljno ili nije dovoljno efikasno. Stoga postoje sljedeće funkcije za manipulaciju matricama: rot90, flipud i fliplr. Funkcija rot90(A) "rotira" matricu A za 90 u smjeru kazaljke na satu, dok verzija ove funkcije rot90(A,n) "rotira" matricu A za n 90 u smjeru kazaljke na satu. Dakle, rot90(A,4) vraća polaznu matricu a rot90(A,-1) rotira matricu za 90 u smjeru suprotnom kretanju kazaljke na časovniku. Funkcija flipud(A) (skraćenica od flip upper down) mijenja redosljed vrste. Prva vrsta novodobijene matrice je posljednja matrice A, i zatim se ređaju vrste ka prvoj vrsti matrice A. Slična ovoj je funkcija fliplr(A) (skraćenica od flip left right) koja mjenja redosljed kolona matrice. Primjer 2.11.1 Na matrici A=[11 12 13 14;21 22 23 24;31 32 33 34] demonstrirati opisane naredbe za manipulaciju matricama. » A=[11 12 13 14;21 22 23 24;31 32 33 34]; » A,rot90(A) Rezultira kao: A= 11 12 13 14 38
21 31 ans = 14 13 12 11
22 23 24 32 33 34 24 23 22 21
34 33 32 31
Unošenjem » rot90(A,4) dobijamo početnu matricu ans = 11 12 13 14 21 22 23 24 31 32 33 34 Za rotaciju u smjeru suprotnom kazaljki na satu koristimo » rot90(A,-1) ans = 31 21 11 32 22 12 33 23 13 34 24 14 Demonstrirajmo naredbe flipud i fliplr. Unošenjem » flipud(A),fliplr(A) dobijamo ans = 31 32 33 34 21 22 23 24 11 12 13 14 ans = 14 13 12 11 24 23 22 21 34 33 32 31 Uočimo da dobijene matrice imaju iste dimenzije kao početna matrica. flipud možemo realizovati pomoću operatora: » A(size(A,1):-1:1,:) ans = 31 32 33 34 21 22 23 24 11 12 13 14 Naredbi fliplr odgovara » A(:,size(A,2):-1:1) Ove dvije funkcije se mogu realizovati jednostavno kao A(end:-1:1,:) A(:,end:-1:1). U ovim naredbama end je broj koji predstavlja broj vrsta odnosno kolona matrice.
39
glava treća
GRAFIKA MATLAB posjeduje sjajne mogućnosti za grafičko predstavljanje funkcija jedne promjenljive, izuzetno kvalitetno grafičko predstavljanje funkcija dvije promjenljive a donekle se mogu vizuelizirati funkcije tri promjenljive. Predstavljanje funkcija dvije promjenljive može biti u obliku "trodimenzionih (mrežastih) crteža", 2-D obojenih površi, kolornih mapa, putem izo linija i slika. U okviru ove glave dat je pregled grafičkih mogućnosti MATLAB-a kao i opcije za grafičko post-procesiranje. Upravljanje grafičkim okruženjem, kao i samim graficima opisano je u šestoj glavi.
3.1 GRAFIČKO PREDSTAVLJANJE MATRICA, VEKTORA I FUNKCIJA JEDNE PROMJENJIVE 3.1.1 OSNOVNI OBLIK Najjednostavniji oblik predstavljanja vektora vrste ili vektora kolone je korišćenjem naredbe plot. Primjer 3.1.1 Nacrtati y=[1 2 4 8 16 32] Postupak je sljedeći: » y=[1 2 4 8 16 32]; » plot(y)
Slika 3.1. Grafik vektora vrste. Sa slike 3.1. možemo zapaziti da je za nezavisno promjenjivu uzet redni broj elementa u vektoru y. Ako nezavisno promjenljivu označimo sa x onda je uzeto da je nezavisno promjenljiva x=[1 2 3 4 5 6] i dok je nacrtan grafik u obliku izlomljene linije koji spaja tačke (1,y(1)), (2,y(2)), (3,y(3)), (4,y(4)), (5,y(5)) i (6,y(6)). U opštem slučaju sa plot(y) se crta grafik spajajući tačke (i,y(i)) za i=1,2,3,...,N, gdje je N dužina vektora y. Vektor y može biti i vektor kolona. Provjeriti da se dobija isti grafik ako zadamo y1=y' i nacrtamo plot(y1). Prilikom crtanja grafika, otvara se grafički prozor za koji važe opšta pravila svih Windows prozora. Na komandni prompt se moguće vratiti na više načina, a od njih pominjemo dva: pritisnuti Alt, a zatim pritiskati Tab dok se ne pojavi natpis MATLAB Command Window; nakon toga se otpuste oba tastera. Na isti način možemo se vratiti u grafički prozor. Za prelazak u otvoreni grafički prozor pored kombinacije Alt+Tab možemo se poslužiti trakom sa programima koja se nalazi obično na dnu prozora (naziva se Taskbar) gdje kliknemo na pravougaonik koji odgovara aktuelnoj Matlabovoj instanci. Nezavisno promjenljiva može biti zadata posebno. U tom slučaju se crtanje vektora y u zavisnosti od x vrši sa plot(x,y). Primjer 3.1.2 Ako su pri nekom mjerenju za vrijednosti nezavisno promjenljive x=[-2 -1 0 1 3 4 7 6] dobijene vrijednosti koje su zapisane odgovarajućim redom u y=[-1 -0.5 0 1 3 6 9 8], nacrtati y(x). » x=[-2 -1 0 1 3 4 7 6]; » y=[-1 -0.5 0 1 3 6 9 8]; » plot(x,y)
Slika 3.2. Grafik funkcije y(x).
40
Grafik se u ovom slučaju dobija spajanjem tačaka (x(i),y(i)) za i=1,2,...,N, gdje je N broj elemenata vektora x i y. Ukoliko broj elemenata u x i y nije isti umjesto grafika dobićemo poruku o grešci da se dimenzije ne slažu. Vektori x i y ne moraju oba biti vektori vrste ili vektori kolone, već jedan može biti kolona a drugi vrsta, i obrnuto. Probati plot(x,y'). Posebno je značajna primjena operatora plot za crtanje grafika funkcija sa jednom promjenljivom y=f(x). 2
Primjer 3.1.3 Nacrtati grafik funkcije y=xsin (x) u intervalu -4x4. » x=-4:.1:4; » y=x.*sin(pi*x).^2; » plot(x,y)
2
Slika 3.3. Grafik funkcije y=xsin (x) za -4x4 sa korakom 0.1. Prilikom formiranja nezavisno promjenljive možemo umjesto operatora dvotačka koristiti naredbu linspace(a,b,n) kojom se formira nezavisno promjenljiva u intervalu a, b sa n ekvidistantno raspoređenih tačaka. Kasnije ćemo objasniti i naredbu logspace koja ima sličnu primjenu.
3.1.2 VIŠE FUNKCIJA NA ISTOM CRTEŽU Postoji i mogućnost predstavljanja kolona matrice dimenzija (mn). Ako matrica y ima n kolona onda naredbom plot(y) dobijamo n krivih od kojih svaka predstavlja grafik po jedne kolone matrice y. Primjer 3.1.4 Nacrtati grafik pojedinih kolona matrice:
1 1 3 2 3 0 2 5 1 y 4 2 5 1 3 0 1 2 2 » y=[1 -1 3;2 3 0;2 5 -1;5 4 -2; -1 3 0;-2 2 1]; » plot(y) Vidimo da je svaka kolona predstavljena različitim tipom, odnosno bojom linije. Kao nezavisno promjenljiva uzet je redni broj elementa u koloni. Tako je prvi grafik dobijen spajanjem tačaka (i,y(i,1)) za sve vrijednosti i. Uskoro ćemo vidjeti da se boje i tipovi linija mogu podešavati a za sada vrijedi istaći da se linije crtaju ako se ništa ne specificira redom plavom, zelenom, crvenom, cijan (verzija plave), magenta (verzija ljubičaste), žutom i crnom bojom.
Slika 3.4. Grafičko predstavljanje matrice po kolonama. I u ovom slučaju moguće je predstaviti sve kolone u funkciji nezavisno promjenljive x. 41
Primjer 3.1.5 Nacrtati grafik pojedinih kolona matrice y u funkciji vrijednosti x.
1 1 3 2 3 0 2 5 1 y 0.5 4 2 1 3 0 1 2 2
1 2 4 x 5 7 8 » x=[1 2 4 5 7 8]; » y=[1 -1 3;2 3 0;2 5 -1;5 4 -2; -1 3 0;-2 2 1]; » plot(x,y)
Dužina vektora x i kolona matrice y mora biti ista. Ako to nije slučaj, onda se vrši provjera da li je dužina vrste u matrici y ista kao i dužina vektora x. Ukoliko jeste, onda će nacrtati vrste matrice y u funkciji od x, a ako nije, javiće grešku da se dimenzije ne slažu. U svakom slučaju prvo se vrši provjera slaganja kolona.
Slika 3.5. Grafik matrice y(x). Prethodni postupak se može iskoristiti za crtanje više funkcija na istom grafiku. 2
3
Primjer 3.1.6 Nacrtati funkcije y=x i y=x u intervalu -1x1. » x=-1:0.02:1; » y1=x.^2; » y2=x.^3; » y=[y1;y2]'; » plot(x,y)
Slika 3.6. Dvije funkcije na istom grafiku. Više funkcija se može nacrtati na istom grafiku i na sljedeći način: plot(x1,y1,x2,y2,...,xn,yn) sa time da parovi promjenljivih moraju da imaju iste dimenzije ali ne i svi grafici. x
Primjer 3.1.7 Nacrtati na istom grafiku funkcije: y=x za -1x1, y=xe za 0x1, y=sin(x) za -1x0. » x1=-1:.1:1; » y1=x1; » x2=0:.1:1; » y2=x2.*exp(x2); » x3=-1:.1:0; » y3=sin(pi*x3); » plot(x1,y1,x2,y2,x3,y3)
42
Slika 3.7. Crtanje više funkcija na istom grafiku.
3.1.3 VRSTE LINIJA I OZNAKA U dosadašnjim primjerima odabiranje tipa linija za crtanje grafika je vršeno automatski ili, kako se često kaže, po defaultu. Tip linije za crtanje pojedinih grafika može se zadavati po želji. Na raspolaganju su puna linija, isprekidana, tačkasta, crta-tačka-crta, kao i označavanje vrijednosti sljedećim znacima markerima u obliku ., o, x, *, +, itd. Naredba plot(x1,y1,'-',x2,y2,'-.',x3,y3,'o') daje prvu funkciju iscrtanu punom linijom, drugu linijom crta-tačka-crta, a treću označenu markerom o. Tipovi linija i simbola koji se mogu koristiti dati su u Tabeli 3.1. Tipovi linija puna linija tačkasta tačka crta crtkana
: -. --
Tipovi markera tačka . slova o ili x mat. simboli + ili * trouglovi >, tac. U MATLAB-u postoje ugrađene funkcije za izračunavanje određenog integrala: b
I f ( x)dx a
u obliku I=quad(f,a,b,tac, korak) gdje je f naziv funkcije, a donja granica, b gornja granica, tac željena tačnost i korak korak integracije (koji se može izostaviti i tada se uzima neka podrazumijevana vrijednost). Primjer 5.5.2 Izračunati integral funkcije f(x)=sin(x) od 0 do , sa tačnošću 0.000001. » quad('sin',0,pi,0.000001) 87
Primjer 5.5.3 Izračunati integral funkcije f(x)=xsin(x) od 0 do , sa tačnošću 0.000001. Potrebno je definisati funkciju f(x)=xsin(x), koju ćemo zvati sx(x). function s=sx(x) s=x.*sin(x); Poslije izlaska iz editora, integral računamo sa: » quad(@sx,0,pi,0.001) Nulu funkcije definisane m-fajlom ili ugrađene funkcije, u okolini tačke x=a, možemo dobiti sa fzero(f,a,tac). 3
2
Primjer 5.5.4 Naći nule funkcije y=x +x -2x-1 za x plot Vectors must be the same lengths. Zbog nesaglasnosti dužina vektora došlo je do greške i prekinuto je izvršavanje programa. Međutim, sljedeći blok naredbi funkcioniše: » clear » x=1:10; 90
» y=x(1:9).^2; » try » plot(x,y) » catch » y=[y,zeros(1,length(x)-length(y))]; » plot(x,y) » end Dakle u naredbi plot(x,y) se dešava greška pa se izvršava catch dio. Uočite da recimo za razliku od C++ catch nema argumenata. Za vjerovati je da će sistem obrade izuzetaka u narednim verzijama MATLAB-a napredovati.
5.7 PCODE Jedna od osnovnih primjedbi MATLAB-u je činjenica da su M-fajlovi otvoreni odnosno da nije moguće u njim sakriti sopstvenu programersku vještinu. Stoga su uvedeni P-fajlovi koji se iz M-fajlova dobijaju naredbom: » pcode naziv_mfajla Ovom naredbom se dobija fajl sa ekstenzijom p ali koji se ne može van računara na kome je kreiran editovati niti vidjeti.
5.8 DEBUG-OVANJE PROGRAMA Bilo koji iole složeniji program ne može se napisati odjednom da tačno radi. Lakši dio priče predstavljaju sintaksne greške dok mnogo veći problem predstavljaju semantičke greške odnosno situacije kada program radi ali nam ne daje željeno ponašanje. Što je program složeniji to je problem nalaženja logičkih grešaka u njemu složeniji. Stoga je potrebno obično raditi na otklanjanju grešaka u programu. Ovaj proces se u programerskom žargonu najčašće naziva debugova (dibag) od riječi “bug” što je jedan od uobičajenih naziva u jeziku programera za grešku u programu. MATLAB-ov editor posjeduje niz opcija koje nam omogućuju kvalitetno otklanjanje grešaka u programu. Ovdje su te opcije pobrojene i ilustrovane do nivoa nekog prosječnog korisnika. Koliki je značaj otklanjanja grešaka MATLAB-ov editor u kojem unosimo naredbe naših programa često se naziva Editor/Debuger. Vrijedi napomenuti da se opcije debagovanja mogu podešavati i u editoru ali i iz komandnog prozora. Prva opcija sa kojom ćemo se upoznati je postavljanje tzv. tačke loma - “breakpoint-a”. To je pozicija na kojoj ćemo zaustaviti izvršavanje programa na poziciji gdje sumnjamo da se greška dogodila da bi provjerili sadržaj promjenljivih pa čak i izvršiti određene naredbe i iskaze. Breakpoint se postavlja tako što se u editoru klikne na lijevu sivu traku pored teksta koda. Kao što se vidi sa slike 5.10 u ovoj traci se nalaze horizontalne linije. Kada kliknemo na neku od njih one se pretvaraju u breakpoint-e što je označeno sa crvenim kružićima. Breakpoint-i se mogu unositi samo na pozicijama gdje se nalaze vertikalne linije jer su ostale pozicije ili bez iskaza ili nisu pogodne za postavljanje ovakvih tačaka.
Slika 5.10. Horizontalne linije – pozicije gdje se breakpoint može postaviti, i kružić pozicija gdje je breakpoint postavljen. Pozvani program se zaustavlja na prvom breakpoint-u, komandna linija se mijenja u K» što ukazuje da se naredbe mogu pozivati sa tastature. Pozicija “stopiranog” breakpointa se proširuje strelicom kako je to prikazano na slici 5.11.
Slika 5.11. Zelena strelica indicira poziciju na kojoj je tekuće izvršavanje programa zaustavljeno. Kada se program zaustavi u komandoj liniji možemo unijeti novu vrijednost neke promjenljive a zatim ponovo pokrenuti program od tačke gdje je zaustavljen na više načina od kojih je jedan opcija medija Debug/Step Out. Na ovaj način ćemo nastaviti izvršavanje programa do njegovog kraja ili do narednog breakpoint-a. Alternativa je Debug/Step In kada nastavljamo izvršavanje programa od breakpointa naredbu po naredbu (i dalje ostajući u komandnom promptu K» koji nam dozvoljava u svakom koraku testiranje promjenljivih ili druge operacije). Naredna opcija koja se u debagiranju često poteže je da u editor izmjenite dio koda za kojega sumnjate da vam pravi problem dok ste u privremeno zaustavljeni na breakpointu, zatim selektujete ovaj dio koda (putem miša ili tastature), a zatim na njega napravite desni klik i odaberete opciju Evaluate Selection. Kada se jednom želi prekinuti sa debagiranjem, eventualno se snime željene izmjene pa se odabere opcija Debug/Exit Debug Mode. Napominjem da ovim nećete eliminisati breakpoint-e koje ste prethodno postavili. Svaki pojedinačni breakpoint se može modifikovati ili ukinuti tako što se napravi desni klik na poziciju kružića na lijevoj strani editor i odabere se u padajućem meniju opcija Clear Breakpoint. Ako ste postaviti veći broj ovakvih tačaka u programu onda ih je zgodno sve obrisati Debug/Clear Breakpoints in All files. Ne mora postavljanje breakpoint-a uvjek da dovede do zaustavljanja programa. Postoje takozvane uslovni breakpoint-i (Conditional Breakpoint) koji se aktiviraju samo ako je neki uslov zadovoljen. Najjednostavniji način da se postave je da se klikne desnim tasterom miša na horizontalnoj liniji lijevo od koda programa i odaberite opciju Set Conditional Breakpoint. Tada se otvara dijalog u kome 91
se može podesiti uslov pod kojim se aktivira breakpoint da bi se izvjeglo aktiviranje za slučajeve kada ne dobijamo “sumnjive” rezultate (slika 5.12).
Slika 5.12. Dijalog za postavljanje uslovnog breakpoint-a. Postoje i breakpoint-i koji se ne aktiviraju na nekoj posebnoj lokaciji već koji su vezani za probleme koji se u fajlu pojavljuju “kumulativno”. Aktiviraju se opcijom Debug/Stop if Errors/Warnings in All Files kada se otvara dijalog koji je prikazan na slici 5.13. Ovdje se može podesiti pojava breakpoint-a prilikom pojave greške, upozorenja (Warning) ili prilikom ulaska u obradu izuzetaka, odnosno prilikom pojave NaN i inf vrijednosti.
Slika 5.13. Dijalog za breakpoint-a vezanih za pojavu grešaka, upozorenja, obrade izuzetaka ili “neregularnih” vrijednosti. Ovim ni na koji način nisu iscrpljene opcije debagiranja a pored predloženog postupka korišćenjem editor mogu se koristiti i naredbe. Istraživanje ovih naredbi možete započeti sa naredbom dbstop čiji vas help vodi ka desetak drugih koje se za ovu svrhu koriste u MATLAB-u.
92
glava šesta
GRAFIČKI OBJEKTI U ovom poglavlju biće objašnjene funkcije za kontrolu pojedinih elemenata grafičkog okruženja MATLAB-a: osnovnog (komandnog - korjenog) prozora, grafičkog prozora, koordinata, djelova grafika, teksta, ulazno izlaznog menija i ulazno izlaznih kontrola. Posebno je važno upravljanje pojedinim objektima koji se kreiraju uobičajenim funkcijama za prikaz vektora i matrica. U sklopu ovog poglavlja vodilo se računa o grafičkim komandama koje prilikom rada kreiraju jedan odnosno više objekata. Rad sa ovim objektima može se vršiti na dva načina. Prvi je relativno mali broj naredbi sa kojima možemo podesiti sve što nam je od suštinske važnosti. Međutim, jednostavna podešavanja osobina na ovaj način mogu biti zametna pa je MATLAB kreirao poseban program guide kojim se olakšava podešavanje i rad sa grafičkim korisničkim interfejsom. Koliko nam prostor ove knjige dozvoljava obradićemo oba načina rada a na kraju svakog dijela ćemo dati suštinski isti primjer koji ilustruje mogućnosti u radu sa ovim objektima.
6.1 KOMANDNI PROZOR (ROOT) Svakom grafičkom objektu u MATLAB-u dodijeljen je numerički identifikator (handle) koji jedinstveno određuje objekat i pomoću kojeg se sa objektom rukuje-upravlja. Napomenimo da numerički identifikatori pojedinih objekata koji su dati u knjizi mogu uzimati vrijednosti koje se ne poklapaju sa onim koje su date kao rezultat. Komandni prozor je grafički objekat kojem je pridružen identifikator 0. To je zapravo prozor sa kojim smo se do sada susrijetali i u kojem smo zadavali naredbe sa komandnim promptom. Dvije osnovne naredbe sa kojima možemo podesiti gotovo sve što želimo u radu sa svim grafičkim objektima su get i set. Naredba get nam daje osobine pojedinog grafičkog objekta dok nam naredba set služi za postavljanje osobina grafičkog objekta. Tekuće osobine komandnog prozora se mogu dobiti sa get(h) gdje je h identifikator prozora koji je u ovom slučaju 0: » get(0) CallbackObject = [] CommandWindowSize = [187 37] CurrentFigure = [] Diary = off DiaryFile = diary Echo = off FixedWidthFontName = Courier New Format = short FormatSpacing = loose Language = en_us.windows-1252 MonitorPositions = [1 1 1920 1080] More = off PointerLocation = [805 196] PointerWindow = [0] RecursionLimit = [500] ScreenDepth = [32] ScreenPixelsPerInch = [116] ScreenSize = [1 1 1920 1080] ShowHiddenHandles = off Units = pixels BeingDeleted = off ButtonDownFcn = Children = [] Clipping = on CreateFcn = DeleteFcn = BusyAction = queue HandleVisibility = on HitTest = on Interruptible = on Parent = [] Selected = off SelectionHighlight = on Tag = Type = root 93
UIContextMenu = [] UserData = [] Visible = on Vidimo da komandni prozor a kao što ćemo vidjeti kasnije i svaki drugi grafički prozor posjeduje veoma veliki broj osobina. Prije nego objasnimo neke od njih vrijedi istaći da se pojedinačne osobina mogu dobiti sa » get(0,'Visible') Objasnimo neke od osobina komandnog prozora (detalje ostalih opcija možete sami proučiti): Type Parent Children Format FormatSpacing Diary
Tip grafičkog objekta, za komandni prozor to je 'root'; Roditelj grafičkog objekta, kompandni prozor nema roditelja pa je ova osobina prazan vektor []; Handleovi potomaka posmatranog grafičkog objekta (na primjer kod komandnog prozora to mogu biti handleovi grafičkih prozora koji se otvaraju); Format u kojem se ispisuju rezultati rada (podešavali smo ga naredbom format, na primjer format long); Razmak između redova rezultata (isto smo ga podešavali naredbom format, na primjer format compact ili format loose); Da li je će se voditi dnevnik o radu u okviru komandog prozora (vrijednost 'off' je podrazumijevana i znači da se dnevnik ne vodi dok je alternativa 'on' koja znači da je dnevnik uključen);
DiaryFile
Naziv fajla u kojem se čuva dnevnik o radu u MATLAB-u ako je dnevnik uključen;
CurrentFigure
Redni broj (handle) grafičkog prozora koji je trenutno aktivan odnosno na koji se odnose naredbe;
Echo
Da li je uključen echo koji nas obavještava da koja se naredba u nekom programu trenutno izvršava (podrazumijevano je isključeno 'off' ali može biti 'on'); FixedWidthFontName Font fiksne širine koji se koristi u grafičkom prozoru (često 'Arial' ili 'Courier'); CurrentFigure Vraća handle – redni broj tekućeg aktivnog grafičkog prozora odnosno prozora na koji se odnose naredbe; PointerLocation Lokacija pozivača miša u datom trenutku; Units
Veličine u kojima se mjeri grafički prozor. Moguće vrijednosti su inches (1inč=2.54cm), centimeters, normalized, points (1/72 inča), pixels (12 points), characters (npr. normalizovano mjeri u granicama od 0 do 1 u odnosu na širinu ekrana ili prozora); CreateFcn Naredbe koje se pozivaju prilikom kreiranja ovog prozora (može da se odnosi na string u kojem je zapisana funkcija, na naziv funkcije koja se poziva itd., biće objašnjeno na samom kraju u okviru prikaza guide programa); DeleteFcn Naredbe koje se pozivaju prilikom završetka rada sa prozorom. Sa jednim brojem opcija upoznaćemo se samo kasnije u okviru objašnjavanja osobina drugih elemenata grafičkog interfejsa gdje je primjena navedenih osobina očiglednija. Postavljanje osobina komandnog prozora ali i svih drugih grafičkih elemenata se obavlja putem naredbe set. Na primjer, promjena opcije vezane za echo u programu se može obaviti naredbom: set(0,'Echo,'on') Na ovaj način se može podesiti istovremeno veći broj osobina u sintaksi gdje prvo kao argument naredbe set postavljamo handle objekta čije osobine postavljamo pa zatim navodimo parove: osobina-vrijednost osobine. Ako je vrijednost osobine string mora se navoditi unutar apostrofa. Mnoge osobine imaju nabrojiv broj mogućnosti. Na primjer osobina Echo ima tačno dvije mogućnosti, osobina Units nešto više. Često ih je zgodno znati pa se to može postići naredbom set(h) gdje je h handle grafičkog elementa čija se osobina traži. U primjeru komandnog prozora to ima oblik: set(0) sa mogućim rezultatima (zavise od podešavanja vašeg konkretnog prozora i aktuelne instalirane verzije MATLAB-a) CurrentFigure Diary: [ on | off ] DiaryFile Echo: [ on | off ] FixedWidthFontName Format: [ short | long | shortE | longE | shortG | longG | hex | bank | + | rational | debug | shortEng | longEng ] FormatSpacing: [ loose | compact ] Language More: [ on | off ] PointerLocation RecursionLimit ScreenDepth ScreenPixelsPerInch ShowHiddenHandles: [ on | {off} ] Units: [ inches | centimeters | normalized | points | pixels | characters ] ButtonDownFcn: string -or- function handle -or- cell array Children 94
Clipping: [ {on} | off ] CreateFcn: string -or- function handle -or- cell array DeleteFcn: string -or- function handle -or- cell array BusyAction: [ {queue} | cancel ] HandleVisibility: [ {on} | callback | off ] HitTest: [ {on} | off ] Interruptible: [ {on} | off ] Parent Selected: [ on | off ] SelectionHighlight: [ {on} | off ] Tag UIContextMenu UserData Visible: [ {on} | off ] Kao što se može vidjeti na nizu opcija koje imaju nabrojiv skup potencijalnih vrijednosti moguće vrijednosti su navedene a tamo gdje postoji potreba navedena je i tekuće selektovana vrijednost (u vitičastim zagradama gdje za time postoji potreba). Naredba get » get(0,'Diary') daje tekuću vrijednost osobine Diary. Za postavljanje osobina koristi se naredba set. Npr. naredbi » figure(2); » set(0,'CurrentFigure',2) adekvatna je naredba » gcf=2 odnosno, naredbi » set(0,'Diary','on','DiaryFile','dnevnik.txt') ekvivalentna je naredba » diary dnevnik.txt Potpuno su ekvivalenta i naredbe » set(0,'Format','long') » format long Postoji takođe i niz osobina koje se mogu samo pročitati i kod kojih pokušaj mijenjanja prouzrokuje grešku. Tako se ne može promijeniti vrijednost osobine ScreenSize. » set(0,'ScreenSize',[1 1 234 432]) ??? Error using ==> set Attempt to modify a property that is read-only. Object Name : root Property Name : 'ScreenSize'. Ovim je u poruci koja prati grešku saopšteno da se navedena osobina za objekat tipa root ne može mijenjati jer se može koristiti samo za čitanje. Napomenimo da nazive osobina npr. ScreenSize možemo pisati bez razlike i malim i velikim slovima. U ovom pregledu su obrađene osobine koje se mogu mijenjati kako naredbom set tako i nekom od već definisanih naredbi. Postoji čitav niz osobina grafičkih objekata kojima se može prići samo naredbom set i sa njima ćemo se još srijetati.
6.2 GRAFIČKI PROZOR (FIGURE) Grafički prozor se kreira sa naredbom figure. Sa nekim specifičnostima ove naredbe smo se već srijetali u okviru trećeg poglavlja. Ako se ne navodi broj grafičkog prozora, sa naredbom figure kreiraju se prozori počev od 1 pa redom nadalje. Prvi grafički prozor može se kreirati tako što se neka funkcija grafički prikaže ili se prazan grafički prozor dobija naredbom figure(1). Osobine ovakvog prozora se dobijaju naredbom » get(1) Objasnimo neke od osobina ovog grafičkog objekta koje nisu objašnjene kod prethodnog "korjenog" prozora. Color Boja pozadine izražena kao vektor od tri elementa koji predstavljaju vrijednosti boja u RGB modelu; CurrentAxes Handle osa na koje se grafičke naradbe za iscrtavanje grafika odnose; IntegerHandle Ova osobina bi trebala da je uključena 'on' da bi grafički prozor imao cjelobrojnu vrijednost handle-a; MenuBar Sadržaj linije menija može biti prazan 'none' dok je podrazumijevano 'figure' jer se odnose na grafički prozor; Name Naziv prozora, ako se želi unijeti nova vrijednost to se može postići set(1,'Name','Crtez slike') NumberTitle Može biti 'on' i 'off'. U prvom slučaju pojavljuje se redni broj grafičkog prozora u zaglavlju dok se u drugom slučaju ne pojavljuje; 95
Position
Pozicija grafičkog prozora determinisana preko vektora sa 4 člana od kojih prva dva člana predstavljaju poziciju donjeg lijevog ugla dok je drugi par veličina prozora; Resize Podrazumjevana vrijednost je 'on' a ako se promjeni na 'off' isključuje se dugme u gornjem desnom uglu prozora koje omogućava promjenu dimenzija prozora odnosno ne postoji dalje mogućnost promjene veličine prozora dok se ova osobina ponovo ne uključi; ResizeFcn Predstavlja funkciju koja se poziva prilikom promjene veličine prozora, ovakvih funkcija ima više kako za grafički prozor tako i za druge elemente korisničkog interfejsa. Slična je funkcijama 'CreateFcn' i 'DeleteFcn'; ToolBar Definiše izgled toolbar-a za grafički prozor 'auto' je podrazumijevano a zapravo predstavlja opciju 'figure' u konkretnom slučaju dok je 'none' opcija koja predstavlja prazan toolbar grafičkog prozora; Units Već ranije objašnjene mjerne veličine; Children Handle-ovi objekata koji se nalaze u grafičkom prozoru; Parent Handle roditelja – po pravilu roditelj za grafičke prozore je komandni prozor pa je ova vrijednost 0; Type Tip elementa grafičkog korisničkog interfejsa – u ovom slučaju 'figure'; Visible Determiniše vidljivost elementa grafičkog korisničkog interfejsa sa dvije moguće vrijednosti 'on' i 'off'; Color Boja pozadine. Može se zadati karakterom po pravilima iz naredbe plot, npr: set(1,'color','w') daje bijelu pozadinu, ili se boja pozadine definiše vektorom od tri broja između 0 i 1 po RGB pravilu npr. set(1,'color',[0.3 0.8 1]); Colormap Matrica koja predstavlja kolornu mapu, obično je veličine 643, može se postavljati putem matrice sa tri kolone ali i korišćenjem standardnih matrica za kolorne palate koje smo već koristili putem naredbe colormap, npr. set(1, 'colormap', hsv); CurrentAxes Numerički identifikator (handle) trenutnog koordinantnog sistema koji se za tekući grafički prozor može dobiti naredbom gca. Ose su potencijalni potomci ('Children') grafičkog prozora pa će jedna identifikator tekuće ose poklapati se sa jednim od identifikatora koji se dobija sa get(h,'Children') gdje je h identifikator tekućeg grafičkog prozora; CurrentObject Identifikator tekućeg grafičkog UI objekta (o njima će biti više riječi kasnije a ovo je jednako rezultatu naredbe gcbo); MinColormap Minimalan broj boja koje predstavljaju kolornu mapu; MenuBar Definiše da li će grafički prozor imati standardan meni sa opcijama asociranim za grafičke prozore File, Edit, View, Insert, Tool, Desktop, Window i Help (vrijednost osobine 'figure') ili bez ovih opcija ('none'); Name Ime grafika (podrazumijevano je prazno ali po želji se može postaviti kao na primjer set(h, 'Prikaz rasta zarada'). NumberTitle Definiše prikazivanje rednog broja grafičkog prozora u njegovom naslovu. Ako je 'on' prikazan je broj, a ako je 'off' nije. PaperType Tip papira na koji se može štampati grafički objekat. Predefinisan je 'usletter', a moguć su i druge vrijednosti 'uslegal', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'arch-A', 'arch-B', 'arch-C', 'arch-D', 'arch-E', 'A', 'B', 'C', 'D', 'E', 'tabloid',…. PaperUnits Jedinice u kojima se mjeri veličina papira koja odgovara grafičkom prozoru. Potrebno ih je poznavati ako se želi samostalno podešavanje veličine papira. Predefinisano je obično ‘inches’ a moguće vrijednosti su ‘centimeters’, ‘normalized’, ‘points’. PaperOrintation Orijentacija papira, može biti uspravljena 'portrait', položena 'landscape' ili rotirana 'rotated'. Ova se osobina može podešavati naredbom orient. PaperPosition Pozicija papira, vektor sa četiri elementa koji determiniše margine na štampajućem papiru. PaperSize Veličina papira (vektor sa dva elementa). NextPlot Definiše gdje će biti prikazan naredni grafik. Vrijednosti ove osobine mogu biti: 'add' dodaje grafik u tekući grafički prozor, 'new' otvara novi grafički prozor i u njemu prikazuje novi grafik, 'replace' stari grafik mijenja sa novim, 'replacechildren' vrši zamjenu potomka posmatranog crteža. Pointer Oznaka oblik pokazivača. Strijelica je sa 'arrow' (podrazumijevano), časovnik 'watch', i niz drugih opcija sa kojima se možete upoznati set(gcf,'Pointer'). Pokazivač je u obliku časovnika kada je računar zauzet nekom operacijom pa se na ovaj način onemogućava zadavanje operacija. Napominjemo da je ovdje dat samo dio osobina grafičkih prozora a da se kompletan spisak može pronaći u dokumentaciji. Primjer 6.2.1 Kreirajmo dva grafička prozora imena 'Prozor2' sa i bez broja prozora sa različitim bojama pozadine. » figure('Color',[0.3 0.8 1],'Name','Prozor2','NumberTitle','off') » figure('Color','r','Name','Prozor2') Primjer 6.2.2 Formirati grafičke prozore različitih veličina sa različitim mjernim jedinicama. » figure('Name','Vel1','Units','inches','Position',[2.5 2.5 5.5 5.5]) » figure('Name','Vel2','Units','Pixels','Position',[45 45 120 210]) » figure('Name','Vel3','Units','Normalized','Position',[0.2 0.2 0.6 0.4]) » figure('Name','Vel4','Units','Points','Position',[100 100 400 300]) Primjer 6.2.3 U grafičkom prozoru nacrati proizvoljni grafik, zatim odrediti handle za grafik i provjeriti vrijednosti njemu roditeljskog handlea i na taj način podesiti osobine grafičkog prozora. » plot(1:10) » a=get(gcf,'Children') a= 170.0063get(a,’Parent’) » set(get(a,’Parent’),’Position’,[0.1 0.1 0.6 0.6]) » get(a,'Parent') ans = 96
1 » set(get(a,'Parent'),'Position',[0.1 0.1 0.6 0.6]) Zapamtite da globalna promjenljiva gcf predstavlja handle tekućeg aktivnog prozora pa smo je u ovom slučaju iskoristili da bi dobili informacije vezane za ovaj objekat.
6.3 KONTROLA OSA Veoma važan grafički objekat je koordinantni sistem sa osama. Osama se može upravljati naredbom axes. Takođe, značajne naredbe za upravljanje osama su cla i gca. Naredba gca daje numerički identifikator (handle) koji je priključen tekućim osama. Naredba cla briše sve objekte unutar tekućih osa, dok se naredbom cla reset brišu svi objekti unutar trenutnih osa i vraćaju osobine grafičkog prozora na podrazumijevane. Ako se želi izvršiti ova naredba za ose sa identifikatorom h onda se mogu pozvati sa cla(h), odnosno cla(h,’reset’). Za brisanje grafičkih objekata, pa i osa može da posluži naredba delete. Naime delete(a) briše grafički objekat kome je dodijeljen numerički identifikator a. Npr. naredbom » delete(gca) brišu se tekuće ose. Ista naredba se može primijeniti na bilo koji grafički objekat, tako da naredba » delete(gcf) briše tekući grafički prozor. Naredbom delete file, briše se fajl sa diska. U tom pogledu ova je naredba potpuno analogna komandi DEL koje se koristi za brisanje fajlova u brojnim operativnim sistemima. Osobine tekućih osa se mogu ravnopravno postavljati sa set(gca,osobina1,vrijednost1,osobina2,vrijednost2,...) axes(osobina1,vrijednost1,osobina2,vrijednost2,...) Osobine tekućeg grafika se mogu dobiti sa » get(gca) Moguće je istovremeno sa kreiranjem koordinantog sistema, dodijeliti nekoj promjenljivoj vrijednost numeričkog identifikatora koji opisuje te ose » a=axes('Box','on','Position',[0.2 0.2 0.6 0.6]) a= 76.0004 Naredbom » axes(a) čini se tekućim ose određene identifikatorom a. Naredbom axes, bez argumenata, crta se prazan koordinantni sistem. Vrijednostima pojedinih osobina se u tom slučaju dodjeljuju predefinisane vrijednosti. U ovom slučaju koordinantni sistem zauzima čitav grafički prozor. Najvažnije osobine ovog grafičkog objekta su (a koje su bitnije različite u odnosu na prethodno opisane): ALim
Vektor od dva elementa u granicama od 0 do 1 koji definiše transparentnost pojedinih elemenata grafika (proučite dokumentaciju ili naredbu alim); ALimMode Način postavljanja transparentnosti djelova grafika (podrazumijevano je ‘auto’); AmbientLightColor Vektor od tri elementa u granicama od 0 do 1 koji predstavljaju boju kojom je crtež osvjetljen (podrazumijevano je [1 1] odnosno bijela boja a pojedini elementi vektora su količina crvene, zelene i plave boje); Box Pravougaonik oko tekućih osa. Ako je 'on' crta se pravougaonik oko osa a sa 'off' se ne crta; Clim Vektor sa dva elementa koji definišu predstavljanje u pseudo bojama. Ova se veličina može postavljati naredbom caxis. Podrazumijevano je prvi element vektora postavljen na minimum a drugi na maksimum funkcije koja se grafički prikazuje. Ako se na primjer gornja granica limitira ispod maksimuma funkcije koja se prikazuje sve preko toga će biti prikazano istom bojom. ClimMode Podrazumijevano postavljeno na ‘auto’ odnosno postavljanje osobine 'Clim' na minimum i maksimum funkcije koja se prikazuje. Alternativno je ‘manual’ kada se osobina ‘Clim’ onda podešava ručno. Color Boja grafika (ili kako se preciznije kaže boja pozadine) u kome se iscrtavaju koordinante ose. ColorOrder Matrica dimenzija m 3, kojom se definiše redosljed boja kojim će se isrtavati linije u okviru grafika. Podrazumijevano su to prvih šest boja iz MATLAB-ove palete. Predefinisani se redosljed tokom vremena mijenjao a aktuelna vrijednost se može dobiti sa get(gca,'colororder'). Alternativno se u funkciji plot i drugim sličnim boje mogu podešavati sa 'r', 'w', itd... CameraPosition Vektor sa tri koordinate koji specificira poziciju iz koje kamera gleda na scenu. Postoji više osobina koje počinju sa riječju Camera koje imaju zadatak podešavanja načina rada “kamere” na navedenoj sceni koje vam prepuštam za samostalno istraživanje. CurrentPoint Daje poziciju posljednjeg klika miše u okviru grafičkog prozora. To su zapravo dvije tačke zadate kao vektor od tri elementa (x, y, z koordinata klika). DataAspectRatio Vektor sa tri elementa koji reguliše relativne odnose između veličina u pojedinim osama. Na primjer [1 2 3] znači da dužna 1 u pravcu x ose je ista kao dužina 2 u pravcu y ose i dužina 3 u pravcu z ose. DataAspectRatioMode Postavljen podrazumijevano na ’auto’ dok ako ga podešavate sa DataAspectRatio prelazi na ‘manual’. 97
DrawMode
Reguliše brzinu prikaza „komplikovanih grafika“. Podešen je podrazumijevano na ‘normal’ a može se promijeniti na ‘fast’ kako bi se nešto ubrzalo iscrtavanje; FontAngle Ugao pod kojim se prikazuje tekst (podrazumijevano je ‘normal’ ali može biti i ‘italic’. FontName Naziv fonta na primjer ’Courier’ ili ’Arial’. FontSize Veličina fonta mjerena u ‘FontUnits’ koja može biti ‘points’ (podrazumijevano), ’normalized’, ’inches’, ’centimeters’, ’pixels’. FontWeight Može biti ‘normal’ (podrazumijevano) i ‘bold’ (podebljana). GridLineStyle Podešavanje izgleda mreže ako je pozvan naredbom grid sa mogućim vrijednostima ‘-‘, ‘- -‘, ’:’, ‘-.’, ‘none’. HitTest Određuje da li se objekat može selektovati putem miša ‘on’ ‘off’. Layer Determiniše da li se ose crtaju ispod ‘bottom’ ili iznad objekata djece ’top’. LineStyleOrder Redosljed iscrtavanja linija. Na primjer {'-*',':','o'} reguliše da se se linije iscrtavaju redom puna sa markerom '*', tačkastom linijom i sa markerom 'o'. LineWidth Debljina linije u pointima kojom se iscrtavaju ose. NextPlot Definiše poziciju iscrtavanja novog grafika. 'add' – grafik se crta u postojećim osama; 'replace' (podrazumijevano) mijenja tekuće ose u skladu sa parametrima novog grafika; 'replacechildren' – zadržava podešavanja koordinantnog sistema ali se brišu svi grafici u njem zatečeni. Position Vektor sa četiri elementa koji definišu poziciju koordinantnog sistema na ekranu. Projection Tip projekcije kojim se prikazuju 3-D grafici. Podrazumijevano je ‘orthographic’ (u projekciji se zadržavaju relativni odnosi između dimenzija objekata) dok je druga opcija ‘perspective’. Selected Podrazumijevano je ‘off’ a može biti ‘on’ kada se grafički objekat (u ovom slučaju ose) selektuje. SelectionHighlight Ako je objekat selektovan da li se ta činjenica vidi (‘on’ vidi se da je selektovan odnosno ‘off’ ne vidi se da je selektovan). Tag Dosta značajna osobina. Ovo je string koji se u programima može koristiti umjesto Handle-a. Češće se koristi u programima (što ćemo vidjeti kasnije) nego u upravljanju graficima putem naredbi. TickDir Da li će male linije koje označavaju vrijednosti na osama biti unutar grafika (vrijednosti ‘in’ koja je podrazumijevana) ili van grafika (‘out’). TickDirMode Vezano za prethodnu osobinu, podrazumijevano je ‘auto’ što znači unutar 2D grafika i van 3D grafika a može se prebaciti na ručno - ‘manual’. Title Naslov grafika. Pored unošenja naslova grafika njegov handle se može dobiti na primjer kao h=get(gca,’Title’) nakon čega se mogu podešavati detaljno osobine i ovog elementa grafika (font, boja, veličina itd). Type Za ose tip je ’axes’. UIContextMenu Ovo je osobina koja za sada može da bude relativno nejasna. Putem nje se kreira tzv. padajući meni odnosno meni osjetljiv na sadržaj (context) koji će se pojaviti kada se napravi desni klik na ose. Units Prethodno objašnjavano. View Definiše poziciju “kamere“ odakle se gleda na objekat (djelimično obrađeno sa naredbom view). XaxisLocation Gdje se prikazuju x-ose. Podrazumijevano je ’bottom’ ali može biti i ’tip’. Slično za osobinu ’YAxisLocation’. XColor Determiniše boje ose (u ovom slučaju x-ose a slično i za druge ose). Podešava se na isti način kao i ostale osobine vezane za boju. XDir Pravac osa. Uobičajeno da ose rastu sa lijeva na desno (‘normal’) a može i obrnuto (‘reverse’). Ista osobina postoji za ostale ose (YDir, ZDir). XGrid Mreža (grid) na x-osi (postoje osobine YGrid, ZGrid, ovako se omogućava pojedinačno postavljanje mreže za svaku osu). Podrazumijevano je isključeno ‘off’ a uključuje se postavljanjem ove osobine na ‘on’. XLabel Labela (tekst) uz osu (slično YLabel, ZLabel). U ovom slučaju predmetni tekst kao i kod osobine Title ima svoj handle i mogu mu se osobine podešavati kao i svim tekstualnim objektima (o ovome u narednim poglavljima). XLim Granice osa (slično YLim, ZLim) vektor od dva elementa koji predstavlja granice osa (slično onome što je rađeno naredbom axis). XLimMode Određuje da li se granice osa postavljaju automatski u skladu sa podacima (‘auto’) ili ih podešava korisnik “ručno” (‘manual’). Adekvatne osobine za druge ose su YLimMode i ZLimMode. XMinorGrid Može biti uključeno ili isključeno ‘on’ ili ‘off’ a predstavlja mrežu na manje bitnim pozicijama na x-osi. Da bi ovo funkcionisalo XMinorTick osobina mora biti uključena. Iste osobine postoje duž y- i z-ose. XScale Skaliranje duž ose (može biti podrazumijevano ‘linear’ ili logaritamsko ‘log’). Slične osobine su YScale i ZScale. XTick Vektor kojim zadajemo pozicije malih crtica na x-osi (tick-ova). Ako ih ne želimo postavimo na prazan vektor. Ovo se koristi ako nismo zadovoljni sa onim što nam MATLAB pruža na osnovu svoje automatske procjene. Slične osobine su YTick i ZTick. XTickLabel Niz stringova pridružen pojedinim tick-ovima. Slična osobina postoji za y- i z-osu. XTickMode Vrijednost ‘auto’ dozvoljava MATLAB-u da automatski odredi poziciju crtica na x-osi a ‘manual’ je ručno podešavanja. Slične su osobine postoje za y- i z-osu. XTickLabelMode Podrazumijevano je ‘auto’ koji uzima numeričke vrijednosti na osi labela a u slučaju da se postavi ‘manual’ onda se uzimaju vrijednosti koje su specificirane u osobini XTickLabel. Slično za YTickLabel i ZTickLabel. 3 2 Primjer 6.3.1 Nacrtati krivu y=x -2x u intervalu -4x4 i onemogućiti iscrtavanje pravougaonika oko osa. » x=-4:.1:4; 98
» y=x.^3-2*x.^2; » plot(x,y) » a=gca; » set(a,'box','off') Primjer 6.3.2 Grafik iz prethodnog zadatka nacrtati na zelenoj pozadini. » set(a,'color','g') Primjer 6.3.3 Na prethodni grafik nanijeti font Arial veličine 30 podebljan. » set(a,'FontName','Arial','FontSize',30,'FontWeight','bold') Primjer 6.3.4 Prikazati na prethodnom grafiku mrežu u obliku pune linije. Neka debljina osa bude 2. » set(a,'GridLineStyle','-','LineWidth',2) » grid Ako postavimo naslovnu liniju prozora naredbom title: » title(‘naslov test prozora’) onda sa » gt=get(a,'Title') možemo dobiti handle za ovaj objekat pa mu možemo dobiti osobine i podešavati na odgovarajući način. Osobine ovog objekta se dobijaju naredbom » get(get(gca,'Title')) dok se osobine postavljaju naredbom » set(get(gca,'Title'),'Osobina1','Vrijednost1',...) Predmetni objekat je tekstualni što se može provjeriti sa » get(gt,'type') ans = text Tekstualni objekti su i labele koordinatnih osa - osobina XLabel, YLabel i ZLabel. O tekstualnim objektima biće više riječi kasnije. Primjer 6.3.5 Na grafik iz prethodnih primjera nanijeti oznake na x-osi a, b, i c. Ujedno neka boja x-ose bude plava. » set(a,'XTickLabel',['a' 'b' 'c']','XColor','b') Iste osobine kao za x-osu postoje i za druge dvije koordinantne ose. Ove se osobine razlikuju samo po prvom slovu imena. 2 Primjer 6.3.6 Unutar osa nacrtati funkcije y=x i y=2x+4 i naći identifikatore ovih objekata. » a=axes; » x=-4:0.1:4; » plot(x,x.^2,x,2*x+4) » get(a,'Children') ans = 62.0001 61.0001 Putem ovih handleova možemo da definišemo osobine objekata djece koji se nalaze na našim osama. » set(get(a,'Children'), 'Color', 'r') U predmetnom primjeru ovi objekti su tipa linije: » get(get(a,'Children'), 'type') ans = 'line' 'line' Primjer 6.3.7 Učiniti nevidljivim ose date numeričkim identifikatorom a iz prethodnog zadatka. » set(a,'Visible','off') Primjer 6.3.8 Nacrtati pravu liniju y=x, za x u granicama od 0 do 10. Prikazati ose debljine 2, a na x osi neka budu tick-ovi samo na pozicijama 0, 2 i 5 sa tekstom na njima ‘a’, ‘cc’ i ‘kg’. » plot(0:10,0:10) » set(gca,'linewidth',2,'xtick',[0 2 5],'xticklabel',{'a','cc','kg'}) Možete sada provjeriti da je osobine 'XtickLabelMode' i 'XtickMode' prešle na vrijednosti ‘manual': » get(gca,'XTickMode') ans = manual » get(gca,'XTickLabelMode') ans = manual Situacija sa ovom osom se vraća na uobičajeno sa podešavanjem ove dvije osobine na 'auto' (automatsko podešavanje). » set(gca,'XTickMode','auto','XTickLabelMode','auto') 2 Primjer 6.3.9 Prikazati krivu y=x u intervalu x[-3,3]. Ovaj grafik u istom grafičkom prozoru zumirati dio ove krive oko 0. Podebljati linije oko oba grafika na 2 a zatim liniju u drugom grafiku postaviti na crvenu. Pretpostaviti da vam nisu poznati handle-ovi za pojedine djelove grafika. » clear 99
» x=linspace(-3,3,501); » plot(x,x.^3); » axes('Position',[0.5 0.1 0.4 0.3]) » plot(x,x.^3);axis([-1 1 -1 1]) » set(get(gcf,'children'),'linewidth',2) » rr=get(gcf,'children'); » set(get(rr(1),'children'),'color','r') Primjer 6.3.10 Posmatrajmo što se deševa sa opcijama XLim i YLim osobinama nakon što se primjeni naredba axis sa osama. » x=0:20; y=x.^2./(x.^2+1); » plot(x,y) » a=get(1,'children'); » get(a,'Xlim') ans = 0 20 » get(a,'Ylim') ans = 0 1 » axis([0 15 0 2]) » get(a,'Ylim') ans = 0 2 » get(a,'Xlim') ans = 0 15 » axis('auto') » get(a,'Xlim') ans = 0 20 » get(a,'Ylim') ans = 0 1 U ovom primjeru smo nacrtali grafik funkcije a zatim smo odredili handle predmetnih osa. Ispitali smo osobine XLim i YLim koje korespondiraju granicama koje odgovaraju navedenim osama. Zatim smo pozvali naredni axis i manuelno postavili granice osa što se odmah odrazilo na osobine XLim i YLim nakon povratka osa na automatsko podešavanje sa time se i ažuriraju vrijednosti ovih osobina na početne.
6.4. GRAFIČKI OBJEKTI OD KOJIH SE SASTOJI GRAFIK
Osnovni objekti od kojih se sastoji grafik su: linija (line), površ (surface), kolorna slika matrice (image), zatim tekstuani objekat tekstualni objekti (text), obojeni poligon (patch), konturni dijagram (contour) itd. Ovi grafički objekti se mogu dobiti naredbama line, patch, surface i image. Međutim, nama su interesantniji grafički objekti koji nastaju crtanjem nekih uobičajenih grafika te ove naredbe (osim text sa kojom smo se prethodno djelimično upoznali) nećemo obrađivati.
6.4.1 LINIJA - LINE Grafički objekti tipa linije se dobijaju kao rezultat sledećih naredbi: plot, polar, semilogx, semilogy, loglog, stem, compass, plot3, itd. Gotovo sve ove naredbe daju onoliko objekata koliko je linija – odnosno funkcija koje se na grafu prikazuje. Mi do sada nismo koristili činjenicu da gotovo sve funkcije koje se koriste za grafičko prikazivanje mogu da imaju rezultat te da se putem toga rezultata može vršiti podešavanje navedenog grafičkog elementa. Primjer 6.4.1 Odrediti numeričke identifikator prilikom crtanja jedne funkcije naredbom plot i prilikom crtanja dvije funkcije naredbom 2 plot. Nacrtajmo prvo funkciju y=sin(x ). » x=-1:0.02:1; » a=plot(x,sin(x.^2)) U ranijim verzijama MATLAB-a rezultat ove naredbe je bio numerički identifikator – handle sa kojim se u principu radilo kako je prethodno opisano. Npr. moguća vrijednost identifikatora je a= 62.0002 Međutim u novijim verzijama MATLAB-a naredbe za grafički prikaz kao rezultat vraćaju sam objekat kome se vrši prikazivanje: a= Line with properties: Color: [0 0.4470 0.7410] LineStyle: '-' 100
LineWidth: 0.5000 Marker: 'none' MarkerSize: 6 MarkerFaceColor: 'none' XData: [1x101 double] YData: [1x101 double] ZData: [1x0 double] Show all properties Ovo ukazuje na činjenicu da se uskoro za gotovo sve naredbe koje rade sa grafičkim objektima preći na ovakav način uz izbjegavanja korišćenja numeričkih handle-ova. Ujedno na ovaj način dobili smo prikaz svih najznačajnijih osobina za predmetnu liniju sa vrijednostima a klikom na Show all properties ili sa: » get(a) dobijamo spisak svih osobina ovoga grafičkog objekta: AlignVertexCenters: 'off' Annotation: [1x1 matlab.graphics.eventdata.Annotation] BeingDeleted: 'off' BusyAction: 'queue' ButtonDownFcn: '' Children: [] Clipping: 'on' Color: [0 0.4470 0.7410] CreateFcn: '' DeleteFcn: '' DisplayName: '' HandleVisibility: 'on' HitTest: 'on' Interruptible: 'on' LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerEdgeColor: 'auto' MarkerFaceColor: 'none' MarkerSize: 6 Parent: [1x1 Axes] PickableParts: 'visible' Selected: 'off' SelectionHighlight: 'on' Tag: '' Type: 'line' UIContextMenu: [] UserData: [] Visible: 'on' Data: [1x101 double] XDataMode: 'manual' XDataSource: '' YData: [1x101 double] YDataSource: '' ZData: [1x0 double] ZDataSource: '' Pogledajmo sljedeći primjer u kojem naredbom plot prikazujemo dvije funkcije: 2 2 Primjer 6.4.2 Nacrtati na jednom grafiku y=sin(x ) i y=sin(x )/(x+3). » b=plot(x,sin(x.^2),'r',x,sin(x.^2)./(x+3)) b= 2x1 Line array: Primjer 6.4.3 Nacrtati funkciju y=sin(x) za -2x2 i podesiti širinu linije na 2 i neka je grafik predstavljen bojom [0.3 0.8 1]. » x=-pi:0.02:pi; » a=plot(x,sin(x)); » a.LineWidth=2; » a.Color=[0.3 0.8 1]; Na ovaj način pprimjenom objekta direktno pristupamo osobinama linije bez korišćenja naredbe set: » set(a,'LineWidth',2,'Color', [0.3 0.8 1]) 101
6.4.2 KONTURA - CONTOUR U ranijim verzijama MATLAB-a naredba contour produkovala je niz linija dok je u novijim verzijama dobijen jedan objekat tipa contour. 2 2 Primjer 6.4.4 Nacrtati izodijagram z=sin(x +y -2xy) u granicama -2x2 i -2y2. » [x,y]=meshgrid(-2:.1:2,-2:.1:2); » z=sin(x.^2+y.^2-2*x.*y); » [a,b]=contour(z); Naredba contour ima dva rezultata. Prvi je matrica sa numeričkim podacima koja sadrži podatke koji definišu konturne linije. U principu riječ je o matrici sa dva reda od kojih su u prvom redu upisane koordinate x pozicija linija na konturnom dijagramu dok su y koordinate upisane u drugom redu. Međutim, ovi podaci su „prošarani“ sa podacima o pojedinim konturama na dijagramu i broju tačaka u okviru konture stoga je prilično teško koristiti u praksi. Drugi rezultat je grafički objekat tipa contour sa najčešće korišćenim osobinama koje se mogu izlistati sa: »b= Contour with properties: LineColor: 'flat' LineStyle: '-' LineWidth: 0.5000 Fill: 'off' LevelList: [-0.8000 -0.6000 -0.4000 -0.2000 0 0.2000 0.4000 0.6000 0.8000] XData: [1x41 double] YData: [1x41 double] ZData: [41x41 double] Show all properties
6.4.3 POPUNJENI POLIGON - PATCH Popunjani poligoni dobijaju se naredbama fill, fill3 i nekim drugim. Posmatrajmo primjer: » pp=fill([1 2 4 5 4],[1 11 8 14 6],'c'); Ovom naredbom se prikazuje poligon koji je popunjen odgovarajućom bojom. Prikaz najvažnijih osobina ovoga grafičkog objekta daje: pp = Patch with properties: FaceColor: [0 1 1] FaceAlpha: 1 EdgeColor: [0 0 0] LineStyle: '-' Faces: [1 2 3 4 5] Vertices: [5x2 double] Redom ove osobine znače: FaceColor – boja popunjenog poligona; FaceAlpha – obojenost (1 puna boja; 0 potpuno providno); EdgeColor boja linija oko poligona; LineStyle – tip linije koja je oko poligona; Vertices – vrijednosti vektora nezavisno promjenljive i zavisno promjenljive (x i y ose). Bez želje da se umanji značaj ostalih osobina do kojih možete doći na isti način kao i do osobina ostalih grafičkih objekata dajemo jedan primjer koji ilustruje samo rad sa prethodnim osobinama. Primjer 6.4.5 Nacrtati funkciju y=sqrt(x) kao poligon popunjen crvenom bojom. Ilustrujte promjenu osobina ovoga poligona. » x=1:20; » pp=fill(x,sqrt(x),'r'); » pp.FaceColor=[1 0 1]; » pp.EdgeColor=[1 0 0]; » pp.Vertices(:,2)= pp.Vertices(:,1).^2; Na slici 6.1 prikazane su početna slika kao i ona koju smo dobili nakon predmetnih manipulacija.
102
Slika 6.1. Primjer manipulisanja osobinama objekta tipa patch.
6.4.4 POVRŠ – SURFACE Grafički objekat tipa surface – obojene površi dobija se putem većeg broja naredni. Pogledajmo sljedeći primjer. 2 Primjer 6.4.6. Prikazati funkciju z=x -y2 za [x,y][-2,2]× [-2,2] putem različitih grafičkih naredbi koje kreiraju objekti tipa surface. » [x,y]=meshgrid(linspace(-2,2,101)); » z=x.^2-y.^2; » a1=pcolor(z); » a2=mesh(z);shading interp » a3=meshc(z); Prve dvije naredbe formiraju objekata tipe surface: a1 = Surface with properties: EdgeColor: [0 0 0] LineStyle: '-' FaceColor: 'flat' FaceLighting: 'flat' FaceAlpha: 1 XData: [1x101 double] YData: [101x1 double] ZData: [101x101 double] CData: [101x101 double] Show all properties a2 = Surface with properties: EdgeColor: 'interp' LineStyle: '-' FaceColor: [1 1 1] FaceLighting: 'none' FaceAlpha: 1 XData: [1x101 double] YData: [101x1 double] ZData: [101x101 double] CData: [101x101 double] Show all properties dok se trećom formiraju dva objekta (kojima se može pristupiti preko a3(1) i a3(2) od kojih je prvi tipa surface dok je drugi tipa contour. a3 = 2x1 graphics array: Surface Contour Vidimo osnovne osobine ova dva tipa podataka. Opcije flat i interp odnose se na činjenicu da neka boja može biti „ravna“ odnosno konstantna u dijelu poligona dok interp podrazumijeva da je boja prelivena putem odgovarajućeg tipa bilinearne interpoalacije. Postoji i opcija faceted je ista kao flat sa time da su grafiku superponirane crne linije koje predstavljaju granice pojedinih poligona na grafiku.
6.4.5 SLIKA – IMAGE Posljednji tip grafičkog objekta kojega ovdje objašnjavamo je image (slika). Dobija se primjenom većeg broja naredbi za prikazivanje slika (image, imagesc, imshow itd). 103
Primjer 6.4.6. Prikazati funkciju 10z gdje je z dobijeno u prethodnom primjer putem naredne imagesc. » b=imagesc(10*z); » b b= Image with properties: CData: [101x101 double] CDataMapping: 'scaled' Show all properties » subplot(121) » b=imagesc(10*z); » xlabel('(a)') » subplot(122) » d=imagesc(10*z); » set(d,'CDataMapping','direct') » xlabel('(b)') Na slici 6.2 isti podaci su prikazani dva puta sa time da je u druom podgrafiku osobina 'CDataMapping' postavljena na 'direct' što podrazumijeva da su vrijednosti koje su upisane u matricu koja se vizuelizuje tretirane kao indeksi u mapi koja se koristi za vizuelizaciju.
Slika 6.2. Dva načina prikazivanja funkcije dvije promjenljive putem iste kolorne mape: lijevo - Skaliranje vrijednosti od minimuma do maksimuma podatka koji se vizuelizuje; desno - Tretiranje slike koja se prikazuje kao indeksa u kolornoj mapi.
6.4.6 OSVJETLJENJE – LIGHT Objekti tipa light (osvjetljenje) se ne crtaju već utiču na način kako izgledaju surface i patch objekti. Premda se radi o isključivo načinu na koji su objekti vizuelizirani ipak imaju ogroman uticaj. Često su osobine osvjetljaja objekata nerazdvojive od naredbi kojima kojima se sami objekti crtaju. Osnovni način za dodavanje izvora svjetlosti objektima je putem opcije: light(osobina1,vrijednost1, osobina2, vrijednost2, ..., osobinan,vrijednostn); odnosno putem parova osobina i vrijednosti. Rezultat ove naredbe je handle (koji je lijeva strana iskaza) i kojem se pridružuje rezultat prethodne naredbe. Kada se dobije handle onda se može putem njega vršiti modifikacija pojedinih osobina npr. h.Color=[1 0 0]; ili dobiti rezultujuća vrijednost neke od osbina c=h.Style. Ovdje smo vidjeli i ujedno neke od najbitnijih osobina ‘Color’ je boja osvjetljaja koja je podrazumijevano bijela [1 1 1], dok je ‘Style’ stil koji može biti u beskonačnosti ‘infinity’ što je podrazumijevana vrijednost ili lokalan - ‘local’. Pozicija osvjetljaja se podešava sa h.Position i predstavlja vektor sa koordinatama koje predstavljaju poziciju izvora svjetljosti. Postoji i čitav niz drugih osobina od značaja za ovaj tip objekta a koje su vezane za trodimenzione grafike na koji se osvjetljaj odnosi. Na primjer, kod objekta tipa surf jedna grupa osobina se odnosi na izgled površi (face): ‘FaceColor’ je boja površi koja može biti ‘flat’, ‘interp’, ‘none’, ‘texturemap’, a boja se može zadati preko RGB vektora od tri broj ili karaktera npr. ‘r’ za crvenu boju. Dok su ostale opcije više manje jasne opcija ‘texturemap’ predstavlja osvjetljenje putem odgovarajuće teksturne mape. Primjer 6.4.7. Učitati sliku onion.png pa je zatim u vidu teksturne mape prikazati na surf površi. Demonstrirati primjenu osvjetljenja na crveno sa ovom slikom. » A=imread('onion.png'); » surf(peaks,A,'FaceColor','TextureMap') » light('Color',[1 0 0],'Position',[1 0 1],'Style','local')
104
Slika 6.3. Prikaz surf površi sa teksturnom mapom i osvjetljene sa crvenom svjetljošću. Sa osvjetljanjem (objekat tipa light) zgodno se mogu kombinovati i druge osobine objekata tipa surface. Efekat prozirnosti površi se podešava sa opcijom ‘FaceAlpha’ sa opcijama koje mogu biti zadate kao skalar u granicama 0 do 1 (podrazumijevano je 1), ili kao opcije ‘flat’ odnosno ‘interp’. Opcija ‘FaceLighting’ determiniše efekat osvjetljenja na površi gdje je podrazumijevano ‘flat’ dok opcije mogu biti ‘gouraud’ (Gouraudovo sjenčenje objekat dobilo ime po Henriju Gouraudu) i bez ‘none’. Za više informacija o interakciji osvjetljenja sa površima (objektima tipa surface) pogledajte dokumentaciju. Ovdje ćemo samo kratko napomenuti neke od najbitnijih osobina koje mogu da imaju interakciju sa osvjetljenjem: FaceNormals – Normalni vektori za svaku površ (utiče na način odbijanja svjetlosti) – zadaju se u obliku 3D matrice sa posljednjom dimenzijom 3; FaceNormalsMode – Selektuje način kako se ponaša osobina FaceNormals (podrazumijevano ‘auto’ a može biti ‘manual’); VertexNormals – Normalni vektori za najviše tačke na površi; VertexNormalsMode – Slično kao za površi primjenjeno na najviše tačku; CData – boje vrhova date kao matrica (ili 3D matrica); CDataMode –Selekcija načina prikaza podataka o boji – CData (podrazumijevano je ‘auto’ a može biti ručno ‘manual’); CDataSource – String koji predstavlja promjenljivu koja je povezana sa CData; CDataMapping – Metod za preslikavanje boje sa opcijama 'scaled' (podrazumijevano) ili 'direct'; AlphaData – Providnost (podrazumijevano 1 a može biti u granicama [0,1] ili zadata preko odgovarajuće matrice); AlphaDataMapping – Način na koji se preslikavaju podaci o providnosti (transparentnosti) sa mogućim vrijednostima ove osobine: ‘scaled' (podrazumijevano), 'direct', i 'none'; AmbientLight – jačina ambijentalnog osvjetljaja (podrazumijevano je 0.3 a može se podešavati u granicama od 0 do 1); DiffuseStrngth – Snaga difuznog svijetla (podrazumijevano je 0.6 a može se podešavati u granicama od 0 do 1); SpecularColorReflectance – Boja reflektovane svjetlosti sa površi (podrazumijevano 1); SpecularExponent – Veličina spekularne tačke (podrazumijevana veličina 10, mora biti veće od 1); SpecularStrength – Snaga spekularne reflekcije (podrazumijevano 0.9).
6.4.7 ANIMIRANA LINIJA – ANIMATEDLINE Poseban tip linija i grafičkih objekata su animirane linije koje se, između ostalog, mogu dobiti putem naredbe animatedline. Posmatrajmo sledeći primjer. Primjer 6.4.8. Kreirati animiranu liniju (animatedline) objekat koji prikazuje funkciju y=sin(x) a zatim vrši animaciju ove funkcije dodavanjem tačaka. Radi lakše vizuelizacije između pojedinih grafičkih prikaza uvesti kraću pauzu. x=0.1:0.1:10; h=animatedline(x,sin(x)); for k=1:100 addpoints(h,max(x)+k*0.1,sin(max(x)+k*0.1)) drawnow update pause(0.01) end Prve dvije linije naredbom vršimo prikaz sinusoidalne funkcije u granicama [0,10]. Zatim u programskoj petlji dodajemo tačke na ovaj grafik putem nardbe addpoints. Ova naredba ima kao argumente handle grafika u koji se dodaju tačke kao i koordinate tačaka koje se dodaju (ovdje smo dodavali tačku po tačku ali se to tako ne mora raditi). Iskazom drawnow update ažuriramo grafički prikaz linije (uz pauzu kako bi se postepeno iscrtavanje vidjelo).
105
Osobine ovog grafičkog objekta su slične kao kod linije pa ih ovdje nećemo obrađivati. Animirana linija može biti i trodimenzionlna pa tada naredba addpoints ima treći argument za z-koordinatu. Postoje dodatne naredbe za rad sa tačkama na animiranoj liniji. Sa [x,y]=getpoints(h). Sa clearpoints(h) brišu se tačke sa animirane linije.
6.4.8 OBLAST - AREA Još jedan jednostavan tip grafičkog objekta dodat u nedavnim verzijama MATLAB-a je oblast-površ odnosno tip area. Ovaj tip podataka je unekoliko nadomjestak objekta tipa patch. Osobine su slične kao kod drugih grafičkih objekata i ostavljamo vam ih za samostalni rad dok ovdje ilustrujemo neke od njih kroz jedan primjer. 2 Primjer 6.4.9. Prikažite kvadratnu funkciju y=x za x[0,1] sa oblašću obojenom zelenom bojom, i linijom koja ga obuhvata obojenom u crvenom debljine 2. x=linspace(0,1,101); y=x.^2; h=area(x,y,'facecolor','g','edgecolor','r','linewidth',2); 2
Primjer 6.4.10. Prikažite na jednom grafike funkcije y1=sin(x) i y2=sin(x ) za x[-,]. Osnovna linija grafika treba da bude postavljena na -1. Grafici treba da budu u različitim bojama da bi se lakše raspoznavali. x=linspace(-pi,pi,101); y=[sin(x);sin(x.^2)-sin(x)]; basevalue=-1; h=area(x,y.',basevalue); h(1).FaceColor='r'; h(2).FaceColor='g'; Moramo da ukažemo pažnju na dvije činjenice. Kada prikazujemo više funkcija putem objekat tipa area moramo da znamo da konkstruktorom area dolazi do računanja kumulativne sume pojedinih funkcija za zadate argumente pa stoga smo ovdje oduzeli pojedine vrijednosti za dvije funkcije u naredbi y=[sin(x);sin(x.^2)-sin(x)];. Druga relativno neuobičajena osobina objekta area je da kada zavisna promjenljiva predstavlja više funkcija mora da bude broj kolona drugog argumenta jednak broju vrsta prvog (stoga smo morali da transponujemo y). Ostalo bi trebalo da je jasno iz konteksta samoga programa.
Slika 6.4. Ilustracija sa objektima tipa area.
6.4.9 NEKI DODATNI OBJEKTI U NOVIJIM VERZIJAMA MATLAB-A Kontrola MATLAB-ovog grafički interfejsa započela je sa svega nekoliko objekata. Ovo je posebno izraženo kod grafičkih elemenata koji čine crteže. Svi djelovi grafika su morali da budu prikazani putem relativno malog broja objekata. Međutim, posljednje verzije MATLAB je krenuo u drugom pravcu ka kreiranju većeg broja specifičkih objekata. Tako su nastali brojni objekti koji imaju samo jednu namjenu – da budu asocirani sa jednim ili malim brojem MATLAB naredbi za grafički prikaz. Ovo je na neki način druga krajnjost da imamo relativno veliki broj usko specijalizovanih objekata. Mišljenja smo da je potrebno kombinovati ove pristupe u radu. Nemamo želju ni mogućnost da ulazimo u sve pojedinačne objekte jer bi to zahtjevalo previše vremena a ujedno mnogi od ovih objekata imaju najviše jednu ili dvije osobine koje nisu potpuno jasne iz konteksta i svega nekoliko drugih bitnih osobina. Ovdje ćemo predstaviti samo objekte za iscrtavanje stepenastih dijagrama (bar), za kolornu mapu (colorbar) i objekat koji vizueliziju vrijednost funkcije sa standardnom devijacijom (errorbar), i legendu (legend). Slični su objekti za prikaz pravougaonika (rectangle) te različiti objekti asocirani za pojedine crteže koje smo radili stair, scatter i stem koje ovdje nećemo obrađivati. Primjer 6.4.11 Prikazati trakasti bar dijagram vektora [1 2 4 5 11 18 25] tako da između pojedinih traka nema razmaka. h=bar([1 2 4 5 11 18 25]); h.BarWidth=1; h.FaceColor='r'
106
Na slici 6.5(a) prikazan je standardni trakasti dijagram. Vidimo da je između traka postavljen procjep pošto je podrazumijevano širina trake 80% razmaka između pojedinih vrijednosti. Ovo mijenjamo na slici 6.5(b) sa osobinom h.BarWidth=1; čime je ovaj prostor popunjen 100%. Ujedno smo promjenili boju „traka“ na crvenu.
(a) (b) Slika 6.5. Ilustracija trakastog dijagrama. Primjer 6.4.12 Demonstrirati promjenu pozicije kolorne trake putem objekta koji predstavlja kolornu traku. pcolor(randn(10,20)) shading interp h=colorbar; h.Location='South';
(a) (b) Slika 6.6. Ilustracija podešavanja pozicije kolorne trake (objekat colorbar). Standardna pozicija kolorne trake prikazana je na slici 6.6(a) sa standardnoj poziciji 'eastoutside' a na crtežu sa pozicijom (slika 6.6(b)) 'South' (kada ne piše outside podrazumijeva se da je unutar grafika). Primjer 6.4.13 Mjerenje y=x zahvaćeno je Gausovim šumom sa standardnom devijacijom 0.2. Prikazati ovaj dijagram putem errorbar objekta. Neka je radi grafičkog prikaza y=x sa 10 različitih mjerenja (x[1,10]). x=1:10; y=x+0.2*randn(size(x)); h=errorbar(x,y,std(y)*ones(size(x))); Po svim ostalim karakteristikama ova funkcija je slična funkciji plot osim po činjenici da postoji mogućnost da se prikaže veličina standardnog odstupanja za svaku tačku mjerenja. Stoga treći argumeent naredne errorbar mora da ima iste dimenzije kao prva dva. Ovo implicira da postoji mogućnost da imamo različite standardne devijacije u raznim tačkama.
Slika 6.7. Ilustracija funkcije errorbar. 107
Konačno demonstrirajmo opcije za objekat tipa legend. 2 3 Primjer 6.4.14. Neka je x[0,1]. Prikazati funkcija y=x, y=x i y=x . Prikazati objekat tipa legend na dijagramu i demonstrirati mu opcije. x=linspace(0,1,101); y=[x;x.^2;x.^3]; plot(x,y) grid h=legend('linearna','kvadratna','kubna'); h.Location='northwest'; h.Orientation='horizontal'; h.FontSize=12; Objekat tipa legend daje informaciju o pojedinim linijama na grafiku. Prikazali smo ove informacije putem tri stringa. Zatim smo promjenili neke od osobina čiji je finalni rezultat vidljiv na slici 6.8 sa legendom na vrhu grafika.
Slika 6.8. Ilustracija primjene objekta tipa legend na grafiku.
6.4.10 TEKSTUALNI OBJEKAT - TEXT Brojne naredbe koje kreiraju tekstualne objekte na graficima zapravo kreiraju objekat tipa text. Na primjer, naredbe title, xlabel, ylabel, text itd mogu da imaju izlazni argument koji nije ništa drugo nego objekat tipa text: a=xlabel(‘(a)’); Pored ovoga objekat tipa text se može formirati i kao h=text. Kao najvažnije osobine ovoga objekta MATLAB izdvaja: Text ((a)) with properties: String: '(a)' FontSize: 11 FontWeight: 'normal' FontName: 'Helvetica' Color: [0.1500 0.1500 0.1500] HorizontalAlignment: 'center' Position: [0.5000 -0.0977 -1] Units: 'data' Od ovih osobina imamo 'String' – tekst koji je upisan u stringu; 'FontSize' - veličina fonta; 'FontWeight' – može biti 'normal' i 'bold'; 'Color'boja; 'HorizontalAlignment' – poravnanje koje može biti 'central', 'left' ili 'right', 'String' – pozicija stringa (treća element vektora je -1 za slučaj kada imamo 2D dijagrame) i 'Units' – mjerna jedinica za pozicioniranje na dijagramu. Postoji mogućnost da se ovom objektu postave još neke osobine. Ovdje izdvajamo tri koje se odnose na pravougaonik koji može da bude ocrtan oko teksta: a.EdgeColor='r'; a.LineWidth=2; a.LineStyle='--'; Osobine su: 'EdgeColor' – boja pravougaonika; 'LineWidth' – debljina linije i stil linije 'LineStyle' – oblik linije. Ovim zaključujemo naš pregled osnovnih grafičkih elemenata koji se pojavljuju u okviru MATLAB-ovih 2D i 3D crteža. Činjenica je da MATLAB posljednjih godina je dodao veliki broj novih objekata te da postoji mogućnost da se sa objektima radi na dva a ponekad tri načina ponekad usložnjava a ponekad pojednostavljuje ovu materiju. U svakom slučaju pozvani ste da u skladu sa vašim potrebama dodatno izučite ovu problematiku.
6.5 GRAFIČKE KONTROLE Naredba - iskaz je karakteristika tekstualnog okruženja. Grafičko okruženje podrazumjeva interaktivni rad, to jest da se niz operacija, parametara može zadavati klikom miša na odgovarajuće grafičke kontrole. Danas nema alata koji ovakav rad ne podržava a on je zastupljen već više od 20 godina i u MATLAB-ovom grafičkom okruženju. Do sada je doživio tri veće evolutivne izmjene. Premda nema garancije da se 108
evolutivne ili revolutivne izmjene MATLAB-ovog sistema za rad sa grafičkim kontrolama neće ubuduće mijenjati dobra je činjenica da do sada je svaka promjena bila takva da je dozvoljavala da se više manje nastavi rad po starom bez izmjena ili uz minimalne izmjene postojećih programa. Dakle, jednom naučena znanja se mogu upotrebljavati dugo bez straha da se investira u tehnologiju koja je kratkog vijeka. Pored naredbi get i set za čitanje i postavljanje vrijednosti osobina dvije najvažnije funkcije za kreiranje interaktivnih aplikacija su uicontrol i uimenu. Funkcijom uicontrol dodaje se nova interaktivna kontrola u grafički prozor. Osnovni oblik ove naredbe je: H=uicontrol(prozor,’Style’,’tip uicontrol-e’,’osobina1’,’vrijednost1’,’osobina2’,’vrijednost2’,…); H je handle kontrole koja se kreira u prozoru čiji je handle prvi argument naredbe. Najvažniji argument ove funkcije je stil ‘Style’ kojim se specificira koja je konkretna kontrola kreirana. Te kontrole mogu biti: ‘pushbutton’ dugme na čiji pritsak dovodi do aktivacije neke operacije; ‘togglebutton’ dugme koje može biti prikazano kao aktivno (pritisnuto) ili neaktivno; ‘checkbox’ polje za izbor opcija u obliku kvadratića koje obično dolazi u grupama čiji je izbor nezavisan; ‘radiobutton’ polje za izbor opcija u obliku kruga koje obično dolazi u grupama gdje je samo jednu dugme uključeno; ‘edit’ polje za unos teksta ili podataka; ‘text’ statički tekst (koji ne bi trebalo da se mijenja tokom rada); ‘slider’ kontrola u obliku klizača čijim se prevlačenjem bira određena vrijednost; 'listbox' lista sa spiskom opcija od kojih je jedna aktivna; 'popupmenu' spisak opcija u obliku menija od kojih je jedna aktivna; 'frame' okvir koristi se za grupisanje drugih kontrola.
6.5.1 FRAME KONTROLA Frame kontrola – okvir se koristi za iscrtavanje površi koja će da nosi ostale kontrole. Ova kontrola se sa (podrazumijevanim osobinama) » r=figure; » hf=uicontrol(r,'Style','Frame'); Osnovne osobine ove kontrole su: Style: 'frame' String: ' ' BackgroundColor: [0.9400 0.9400 0.9400] Callback: '' Value: 0 Position: [20 20 60 20] Units: 'pixels' Pored ovih postoji i niz drugih osobina za ovu kontrolu manje značajnih. Primjer 6.5.1 Kreirati grafički prozor i na njemu unijeti frame kontrolu koja će služiti kao nosilac ostalih kontrola. » PrvaGP=figure('NumberTitle','off','Name','Program za 2-D prikaze','Resize','off','Position',[6 6 628 412]); » Frame1=uicontrol(PrvaGP,'Style','frame','Position',[400 1 340 410],'BackgroundColor',[0.62 0.22 0.40]); Na slici 6.9 prikazan je prozor u kojem je pozicioniran okvir koji je dat u drugoj boji u odnosu na pozadinu prozora. Od bitnijih osobina iz iz ovoga primjera napominjemo da smo kod prozora sa 'Resize','off' isključili mogućnost da se promjeni veličina prozora (izblijeđena srednja opcija u gornjem desnom uglu prozora).
Slika 6.9. Okvir u drugoj boji u desnom dijelu prozora.
6.5.2 TEXT KONTROLA Text grafička kontrola se u naredni uicontrol specificira sa 'Style','text' ka na primjer: » Text1=uicontrol(PrvaGP,'Style','text'); Sa 109
» Text1 Izlistaćemo najvažnije osobine ove kontrole: Style: 'text' String: '' BackgroundColor: [0.9400 0.9400 0.9400] Callback: '' Value: 0 Position: [20 20 60 20] Units: 'pixels' Naravno sa set(Text1) možemo dobiti kompletan spisak osobina. Uočimo osobinu 'Callback'. Riječ je o izuzetno značajnoj osobini – stringu u kojem se upisuju naredbe koje se izvršavaju prilikom pristupa kontroli, klika na kontrolu ili promjene sadržaja kontrole. Vidjećemo tokom rada koliki je značaj ove osobine. Primjer 6.5.2 Prethodno definisanu text kontrolu pozicionirati na početnu tačku (200,200) širine i visine 10020 piksela sa upisanim tekstom 'Proba' u žutoj boji preko pozadine u crvenoj boji. » set(Text1,'Position',[200 200 100 20],'BackgroundColor',[1 0 0],'ForegroundColor',[1 1 0],'String','Proba') Modifikacija prethodnog prozora dataje na Slici 6.10.
Slika 6.10. Prozor sa dodatom tekstualnom kontrolom
6.5.3 EDIT KONTROLA Edit kontrola služi za upisivanje teksta unutar polja. Dakle, za razliku od text kontrole ona dozvoljava korisniku da promjeni sadržaj (to je eventualno moguće i kod text-kontrole ali zahtjeva programiranje ili korišćenje određenih trikova). Stil ove kontrole je 'edit'. Njen sadržaj kontrole može mijenjati tako što se na nju klikne mišem i unese novi tekst. Primjer 6.5.3 Kreirajmo edit kontrolu u kojoj piše 'Pocetak' kliknimo na nju i upišimo 'Kraj'. Naredbom get pogledajmo zatim sadržaj String osobine kontrole » Edit1=uicontrol(PrvaGP,'Style','edit','Position',[120 200 100 20],'String','Pocetak') » get(Edit1,'String') ans = Kraj Sada možemo da ilustrujemo primjenu 'Callback' osobine. Na primjer u edit kontrolu upišimo String1='Pocetak'; » String1='Pocetak'; a zatim ga mijenjamo na sljedeći način: » Edit1=uicontrol(PrvaGP,'Style','edit','Position',[120 200 100 20],'String',String1,'Callback','String1=get(Edit1,''String'')'); Klikom na kontrolu i upisom stringa mjenja se i promjenljiva String1, npr. neka se prvo upiše 'Nastavak', pa zatim 'Kraj'. String1 = Nastavak String1 = Kraj Primijetimo da kada se javi potreba da se u okviru Callback koristi apostrof ovdje se mora unijeti dvaput. Ako se sadržaj Callback stringa prostire u više redova uokviruje se srednjim zagradama, redovi počiju apostrofom a završavaju apostofom, pa se postavlja zarez i tri tačke pa novi red. Posljednji red završava se apostrofom. Postoji mogućnost da se koristi ćelija umjesto stringa kao i brojne druge opcije za umjesto rada neposredno sa stringom. Primjer 6.5.4 Neka se u grafičkom prozoru unesu tekst kontrola sa promjenljivom 'N=' i edit kontrola u kojoj se u početku nalazi string '20'. Neka je početna vrijednost promjenljive N=20 i neka se pomoću edit kontrole upisom brojeva u nju unosi i mijenja sadržaj promjenljive N. » N=20; » Text2=uicontrol(PrvaGP,'Style','text','Position',[120 200 40 20],'String','N='); » Edit2=uicontrol(PrvaGP,'Style','edit','Position',[160 200 60 20],'String','20','Callback','N=str2num(get(Edit2,''String''))') 110
Unesimo u edit kontrolu vrijednost 234 i pročitajmo sadržaj promjenljive N N= 234
6.5.4 POPUPMENU KONTROLA Popupmenu kontrola koristi se za kreiranje menija kojim se bira jedna od ponuđenih opcija. Opcija koja je trenutno izabrana prikazana je u zatvorenom meniju. Sa menijem se radi tako što se klikne na strelicu na dolje i izabere odgovarajuća opcija. Bez podešavanja partikularnih osobina ova kontrola se kreira sa uicontrol naredbom sa stilom 'popupmenu': » Popup1=uicontrol(PrvaGP,'Style','popupmenu'); Najvažnije osobine ove kontrole sa podrazumijevanim vrijednostima su: Style: 'popupmenu' String: '' BackgroundColor: [0.9400 0.9400 0.9400] Callback: '' Value: 1 Position: [20 20 60 20] Units: 'pixels' Primjer 6.5.5 U grafički prozor definisan prethodnim primjerima unijeti popupmenu koji ima opcije 'mesh', 'surf', 'waterfall', 'contour', 'meshc', 'surfc', 'interp' i 'flat'. Neka je početna vrijednost promjenljive Grafik=1 što znači da je izabrana default vrijednost - prva vrijednost u meniju 'mesh'). » Grafik=1; » Menielementi=str2mat('mesh','surf','waterfall','contour','meshc','surfc','interp','flat'); » Popup1=uicontrol(PrvaGP,'Style','popupmenu','String',Menielementi,… 'Position',[435 300 100 20],'Callback','Grafik=get(Popup1,''Value'');'); Otvorite meni i kliknite na 'waterfall', kako je u promjenljivu Grafik smješten sadržaj Value osobine popupmenija ova promjenljiva uzima vrijednost 3 (Slika 6.11). » Grafik Grafik = 3 Napomena za definisanje sadržaja stringa u kontroli često je zgodnije koristiti ćelije: » Menielementi={'mesh','surf','waterfall','contour','meshc','surfc','interp','flat'};
Slika 6.11. Grafički prozor sa dodatim menijem.
6.5.5 RADIO KONTROLA Ova kontrola je kružnog oblika. Dolazi u grupama tako da je samo jedna uključena (Value=1) dok su ostale isključene (Value=0). Nastala je u doba kada je bilo živo sjećanje na kasetofone koji su imali dugmad takvu da je pritisak na jedno dugme isključivao ostala dugmad. Primjer 6.5.6 Kreirati u grafičkom prozoru iz prethodnog primjera tri radio kontrole i programirajte mehanizam uključivanja i isključivanja. Neka mehanizam uključivanja i isključivanja dovodi do promjene promjenljive S (sa mogućim vrijednostima 0, 1 ili 2). » S=0; » Radio(1)=uicontrol(PrvaGP,'Style','Radio','Position',… [445 254 15 15],'Value',1,'Callback',... 'set(Radio(:),''Value'',0);set(Radio(1),''Value'',1); S=0;',... 'Backgroundcolor',[0.8 0.8 0.8]); » Radio(2)=uicontrol(PrvaGP,'Style','Radio','Position',… [505 254 15 15],'Value',0,'Callback',... 111
'set(Radio(:),''Value'',0);set(Radio(2),''Value'',1); S=1;',... 'Backgroundcolor',[0.8 0.8 0.8]); » Radio(3)=uicontrol(PrvaGP,'Style','Radio','Position',... [565 254 15 15],'Value',0,'Callback',... 'set(Radio(:),''Value'',1);set(Radio(3),''Value'',1);S=2;',... 'Backgroundcolor',[0.8 0.8 0.8]); Kao što se vjerovatno relativno lako zaključuje iz primjera da je proces uključivanje kontrole jednostavan – isključe se prvo sve kontrole u grupi a zatim se uključi konkretna kontrola. Grafički prozor sa dodata tri radio dugmena prikazan je na slici 6.12. Uočite da je vjerovatno pogodno (za što ima dovoljno prostora) da se uz kontrolu upiše tekst koji objašnjava njenu namjenu.
6.5.6 CHECKBOX KONTROLA Checkbox kontrola, slično kao radio, predstavlja prekidač. Razlika u odnosu na radio kontrolu je ta što se ova kontrola, premda se često grupiše sa drugim sličnim kontrolama, koristi samostalno i predstavlja jednu opciju sa dvije mogućnosti. Pravougaonog je oblika i kada je kontrola uključena (odnosno opcija izabrana) u njoj je upisan znak . Po načinu rada ova kontrola je slična sa radio kontrolom.
6.5.7 SLIDER KONTROLA - KLIZAČ
Slika 6.12. Grafički prozor sa dodatim radio dugmićima. U grafičkom okruenju veoma često se pojedine naredbe odnosno vrijednosti zadaju pomoću klizača. U MATLAB-u klizač je kontrola sa stilom 'slider'. Izgled horizontalno postavljenog klizača prikazan je na slici 6.13. Slika 6.13 Klizač – slider kontrola. Pravougaona oznaka na sredini klizača predstavlja trenutnu vrijednost neke veličine. Klikom na strelice ovaj klizač se pomijera u jednom ili drugom pravcu. Klikom na površ kontrole oko klizača pomjeraj je nešto veći u datom smjeru, a može se prevlačenjem klizača podesiti vrijednost na željenu. Od važnijih osobina ove kontrole (ne ponavljamo one osobine koje su karakteristične za sve kontrole) izdvajamo: Max maksimalna vrijednost koja se može postaviti. Podrazumijevana vrijednost ove osobine je 1. Min minimalna vrijednost koja se može postaviti (podrazumijevano 0). Value tekuća vrijednost (podrazumijevano 0 ili Min). Primjer 6.5.7 Povezati slider kontrolu sa edit kontrolom. Neka se promjena veličine M može obavljati klizačem i edit kontrolom i neka ove dvije kontrole ažuriraju jedna na drugu. » M=20; » Text3=uicontrol(PrvaGP,'Style','text','Position',[405 390 25 15],... 'String','M=','Backgroundcolor',[0.8 0.8 0.8]); » Edit3=uicontrol(PrvaGP,'Style','edit','Position',[427 390 30 15],... 'String','20','Callback',... ['set(SL,''Value'',str2num(get(Edit3,''String'')));',... 'M=str2num(get(Edit3,''String''));'],'Backgroundcolor',[0.8 0.8 0.8]); » SL=uicontrol(PrvaGP,'Style','Slider','Position',[460 388 145 20],... 'min',20,'max',256,'Value',20,'Callback',... 'M=fix(get(SL,''value''));set(Edit3,''string'',num2str(fix(M)));'); Na slici 6.14 prikazan je grafički prozor u kojem su dodati edit i slider kontrole u gornjem desnom uglu.
112
Slika 6.14. Grafički prozor sa dodatim klizačem koji je uparen sa edit kontrolom (gornji desni ugao).
6.5.8 PUSHBUTTON KONTROLA Pushbutton je taster (dugme) u Windows okruženju čijim pritiskom iniciramo neku operaciju. Stalno se srećemo sa ovakvim dugmićima na kojima često piše OK, Help, Cancel, Apply, itd. Primjer 6.5.8 Kreirati pushbutton sa upisanim stringom 'Close' koji dovodi do zatvaranja tekućeg grafičkog prozora. Ovaj pushbutton pridružiti prozoru čiji je identifikator PrvaGP. » PushClose=uicontrol(PrvaGP,'Style','pushbutton','Position',[550 20 60 30],... 'String','Close','Background',[0.8 0.8 0.8],'Callback','close(gcf);'); Na slici 6.15 prikazana je ažurirani grafički prozor sa pushbutton kontrolom koja ga nakon pritiska gasi.
6.5.9 LISTBOX KONTROLA
Slika 6.14. Grafički prozor na kome je dodato dugme Close. Listbox je kontrola slična popumenu-ju sa tom razlikom što je njen sadržaj otvoren odnosno može se vidjeti (barem dio ako je sadržaj veći od prostora koji je za kontrolu ostavljen. Stil ove kontrole je 'frame'. Rad je u ostalim elementima sličan kao kod popupmenu-ja. Primjer 6.5.9 Dodati prethodnom grafičkom prozoru listbox kontrolu sa tri opcije. » LBText={'Prva','Druga','Treca'}; » LB=uicontrol(PrvaGP,'Style','listbox','String',LBText,'Position',... [520 100 100 60],'Callback','get(gcbo,''Value'')'); Napomenimo da je gcbo handle tekućeg grafičkog objekta kojoj se pristupa u ovom slučaju same LB kontrole. Zgodno se može koristiti kao gcf (handle tekućeg grafičkog prozora), gca (handle tekućih osa), itd.
6.5.10 TOGGLEBUTTON KONTROLA Još jedna kontrola (nedavno dodata) je togglebutton (sa istoimenim nazivom stila). Po svojim karakeristima podsjeća zapravo na checkbox kontrole i može da bude uključena i isključena odnosno predstavlja hibrid checkbox-a kontrole i prekidača (pushbutton). Primjer 6.5.10 Dodati prethodnom grafičkom prozoru togglebutton koje je na početku isključeno. Kada se uključi uvećava numerički sadržaj jedne od edit kontrola za 10 a kada se isključi vraća vrijednost na početnu. » TG=uicontrol(PrvaGP,'Style','togglebutton','String','Dodaj 10','Position',... [480 180 100 20],'Value',0,'Callback',... 'if(get(gcbo,''Value'')==1),set(Edit2,''String'',num2str(N+10)); else,set(Edit2,''String'',num2str(N));end'); Na slici 6.15 prikazana je ova dodata kontrola koja mijenja sadržaj Edit polja.
113
Slika 6.15. Grafički prozor sa dodatom togglebutton kontrolom.
6.5.11 NEKE VAŽNIJE OSOBINE UICONTROL-a U dosadašnjim primjerima uglavnom smo se zadržali na nekim od osnovnih osobina uicontrol-a. Ovdje ćemo pobrojati neke od preostalih osobina. Napominjemo da bi detaljna obrada ove materije odnijela previše vremena I prostora te se ovdje ograničavamo na najvažnije osobine. U starim verzijama MATLAB-a svaki stil kontrola imao je svoje posebne osobine a u novijim verzijama sve kontrole dijele iste osobine. Stoga neke od osobina se ne koriste kod svake od kontrola. Osobine fonta koji se koristi za string unutar kontrole su: 'FontAngle' može biti 'normal' (podrazumijevano) i'italic', 'FontName' – naziv fonta, 'FontSize' veličina fonta, 'FontUnits' mjera za mjerenje fonta koja može biti 'inches', 'centimeters', 'normalized', 'points' (podrazumijevano) 'pixels' i 'FontWeight' koje može biti 'normal' ili 'bold'. Boje kontrole kontrolišu osobine 'BackgroundColor' i 'ForegroundColor'. Na kontrolu LB iz prethodnog primjera testirajte: » LB.BackgroundColor='r' » LB.ForegroundColor=[0.8 0.1 0.1] Osobina 'Parent' kod uicontrol-a daje roditeljski prozor kojima pripadaju. Na primjer » get(TG,'Parent') može u našem primjeru da produkuje: ans = Figure (2: Program za 2-D prikaze) with properties: Number: 2 Name: 'Program za 2-D prikaze' Color: [0.9400 0.9400 0.9400] Position: [6 6 628 412] Units: 'pixels' Na sličan način kako smo prethodno objašnjavali može da se koristi i osobina 'Children'. Pored 'Callback' MATLAB dozvoljava da se kontrolama (i ostalim elementima interfejsa) asociraju funkcije 'CreateFcn' i 'DeleteFcn' koje se pozivaju neposredno prilikom nastanka ili nestanka kontrole (i drugih elemenata grafičkog prozora). Prva funkcija se koristi obično za podešavanje polaznih osobina kontrole dok se druga funkcija koristi za neke korektnivne akcije prilikom eliminisanja kontrole. MATLAB dozvoljava i naprednije event-driven programiranje odnosno bilo kakav pristup kontroli može da produkuje određenu funkcionalnu aktivnost. Stoga su kontrolama pridružene naredne funkcije 'ButtonDownFcn' (funkcija koja se aktivira kada je pritisnuto dugme), 'KeyPressFcn' (funkcija koja se aktivira kada se pritisne taster), 'KeyReleaseFcn' (funkcija koja se aktivira kada se otpusti taster). Rad sa ovim funkcijama je sličan radu sa 'Callback'-om.
6.6 UIMENU U dosadašnjem radu vidjeli smo da grafički prozor može biti sa standardnim menijem. Ako pogledamo prethodno kreirani grafički prozor sa » get(PrvaGP,'MenuBar') dobijamo ans = figure Ukidanje ovog menija se postiže sa: » set(PrvaGP,'MenuBar', 'none') Naredbom uimenu imamo mogućnost da kreiramo ili dodajemo stavke menija u grafički prozor. Osnovni oblik ove naredbe je: » hu=uimenu('Label','NaslovOpcije','Osobina1','Vrijednost1',...) gdje je hu numerički identifikator stavke menija dok su dalje navedene opcije 'Label' sa nazivom opcije 'NaslovOpcije' i parovi osobina vrijednost. Prirodnije je da se meni definiše za konkretni prozor a u tom slučaju je prvi argument naredbe uimenu numerički identifikator prozora: » hu=uimenu(PrvaGP,'Label','NaslovOpcije','Osobina1','Vrijednost1',...) za slučaj PrvaGP prozora koji je korišćen u primjerima. Podopcije menija se dobijaju istom naredbom sa time da je prvi argument numerički identifikator roditeljske stavke menija 114
» hb=uimenu(hu,'Label','NaslovOpcije','Osobine','Vrijednosti',...) Primjer 6.6.1 Dodati standardnom meniju grafičkog prozora PrvaGP meni Options i u njemu nekoliko podopcija. » Meni(1)=uimenu(PrvaGP,'Label','Options'); » Meni(2)=uimenu(Meni(1),'Label','Funkcija1'); » Meni(3)=uimenu(Meni(1),'Label','Funkcija2'); » Meni(4)=uimenu(Meni(1),'Label','Funkcija3'); » Meni(5)=uimenu(Meni(1),'Label','Izbor funkcije'); » Meni(6)=uimenu(Meni(1),'Label','Colormap'); gdje su podopcije Funkcija 1, Funkcija 2, Funkcija 3, Izbor funkcije i Colormap. Uobičajeno sve opcije menija imaju u imenu jedno podvučeno slovo koje služi za brzo startovanje opcije sa tastature. Ispred tog slova treba stavljati znak &. Primjer 6.6.2 U prethodnom primjeru podvući različite karaktere koji služe za startovanje opcija sa tastature. » Meni(1)=uimenu(PrvaGP,'Label','&Options'); » Meni(2)=uimenu(Meni(1),'Label','Funkcija&1'); » Meni(3)=uimenu(Meni(1),'Label','Funkcija&2'); » Meni(4)=uimenu(Meni(1),'Label','Funkcija&3'); » Meni(5)=uimenu(Meni(1),'Label','&Izbor funkcije'); » Meni(6)=uimenu(Meni(1),'Label','&Colormap'); U ovom primjeru podvučeni su karakteri O, 1, 2, 3, I i C. Važnije osobine menija su: Enable koja ima vrijednost 'on' ako se opcija menija može startovati, 'off' ako se opcija ne može startovati, Position pozicija u meniju. Veoma često se jedan meni dijeli u sekcije, skupine srodnih opcija, koje se dijele separatorima (linijama). Separator je naziv istoimene opcije uimenu-a koja može biti uključena i isključena ('on' ili 'off'). Pored pojedinih trenutno aktivnih opcija postavlja se znak čekiranja . Ovo se podešava osobinom menija Checked koja može takođe imati vrijednosti 'on' i 'off'.
Slika 6.16. Meni iz primjera 6.6.2. Primjer 6.6.3 Opcije menija Funkcija 1, Funkcija 2, Funkcija 3 i Izbor funkcije čine grupu i neka je na početku čekirana prva opcije i neka se međusobno isključuju. Meni(1)=uimenu(PrvaGP,'Label','&Options'); Meni(2)=uimenu(Meni(1),'Label','Funkcija&1','Checked','on','Callback',... 'set(Meni(2:5),''Checked'',''off'');set(Meni(2),''Checked'',''on'');'); Meni(3)=uimenu(Meni(1),'Label','Funkcija&2','Checked','off','Callback',... 'set(Meni(2:5),''Checked'',''off'');set(Meni(3),''Checked'',''on'');'); Meni(4)=uimenu(Meni(1),'Label','Funkcija&3','Checked','off','Callback',... 'set(Meni(2:5),''Checked'',''off'');set(Meni(4),''Checked'',''on'');'); Meni(5)=uimenu(Meni(1),'Label','&Izbor funkcije','Checked','off','Callback',... 'set(Meni(2:5),''Checked'',''off'');set(Meni(5),''Checked'',''on'');'); Meni(6)=uimenu(Meni(1),'Label','&Colormap','Separator','on');
Slika 6.17. Modifikovani meni iz primjera 6.6.3.
6.7 UICONTEXTMENU Mnogi elementi grafičkog interfejsa u Matlab-u posjeduju osobio UIContextMenu. U pitanju je poseban tip menija koji se aktivira desnim klikom na neki od elemenata grafičkog interfejsa. Primjer 6.7.1 Dodati u prethodno kreirani grafički prozor kontekst meni za podešavanje osobina (boje) frejma (kontrole Frame1). cc=uicontextmenu; Frame1.UIContextMenu=cc; mc(1)=uimenu(cc,'Label','purrple','checked','on','callback',… 'set(Frame1,''BackgroundColor'',[0.62 0.22 0.40]);set(mc,''checked'',''off'');set(mc(1),''checked'',''on'')'); mc(2)=uimenu(cc,'Label','green','checked','off','callback',… 'set(Frame1,''BackgroundColor'',[0 1 0]);set(mc,''checked'',''off'');set(mc(2),''checked'',''on'')'); mc(3)=uimenu(cc,'Label','red','checked','off','callback',… 'set(Frame1,''BackgroundColor'',[1 0 0]);set(mc,''checked'',''off'');set(mc(3),''checked'',''on'')'); 115
Objasnimo ukratno primjer. Objekat tipa uicontextmenu suštinski je najlakše definisati bez parametara kako je urađeno prvom naredbom a zatim ga pridružiti osobini UIContextMenu neke od kontrola (suštinski kako će kasnije biti pokazano može se pridružiti bilo kom dijelu grafičkog interfejsa). Zatim dodajemo putem naredbe uimenu opcije ovom meniju. Dakle, da ponovo naglasimo već učena naredba uimenu koristi se za specificiranje opcija. Ovdje smo podesili da se na navedeni način (Slika 6.18) mijenja boja frejma te da se postavljaju označe čekirano pored opcije koja je trenutno aktivna.
Slika 6.18. uicontextmenu za podešavanje Frame1 kontrole. Već smo rekli da se ova opcija može koristiti za sve elemente grafičkog interfejsa praktična na isti način. Npr.: » cx=uicontextmenu; » px=plot(1:10); » pc.UIContextMenu=cx; Sada se kontekst meni odnosi liniju kao element grafičkog interfejsa i može se podešavati na isti način kako sto to u primjeru 6.7.1 uradili za frejm.
6.8 UITOOLBAR, UIPUSHTOOL I UITOGGLETOOL Pregled kontrola i elemenata grafičkog interfejsa u MATLAB-u završavamo sa ovom sekcijom. Napominjemo da postoji mnogo toga što ovim kratkim pregledom ni na koji način nije moglo da bude obuhvaćeno. Nakon ove sekcije prikazaćemo jedan jednostavni demonstracioni program kojim se kreira korisan grafički program sa odgovarajućim interfejsom a zatim prelazimo na kreiranje grafičkog korisničkog interfejsa posebnim programom moji je ugrađen u MATLAB-u. Ispod linije menija u MATLAB-u nalazi se lista grafičkih dugmića preko kojih se mogu zadavati naredbe. Ljudi često posežu za grafičkim intuitivnim predstavama umjesto onih koje su date putem teksta (u ovom slučaju menija). Ova traka – lista naziva se toolbar-om. Za grafički prozor korišćen u prethodnim primjerima možemo provjeriti da koristimo predefinisani toolbar: » get(PrvaGP,'toolbar') ans = auto Ovo je ekvivalentno kao da postavimo toolbar za grafički prozor (auto podrazumijeva automatsko postavljanje a kod grafičkog prozora ta osobina je ekvivalentna sa figure). » get(PrvaGP,'figure') Vidimo da se ovom naredbom ništa nije promjenilo dok se toolbar ukida sa: » get(PrvaGP,'none') Sama naredba uitoolbar kreira prazan toolbar. Toolbar-a može biti više. Dodavanje novog dugmića u toolbar postiže se funkcijom uipushtool. Primjer 6.8.1 U aplikaciju iz prethodnih primjera dodajte toolbar sa jednom ikonicom. Pritisak na ovu ikonicu treba da zatvori aplikaciju I treba da ima odgovarajući tooltip (tekst koji se pojavljuje kada je miš iznad kontrole) „Dosta!“: » ztool=uitoolbar(PrvaGP); » [m,n]=meshgrid(1:19); » b(:,:,1)=(m0.1 & R0.8); » R1=R-0.5; » sum=-sign(R1).*log(1-2*abs(R1)); » LAPL=uint8(double(A)+15*sum); Originalna slika je smještena u promjenljivu A dok su u B1, B2, B3 i B4 smješteni redom rezultati naredbe imnoise za Gausov, multiplikativni, so i biber i Puasonov šum. U promjenljivu B5 su smješteni rezultati primjene Gausovog šuma putem naredbe randn (šum je sa srednjom vrijednošću nula i standardnom devijacijom 15). Narednih nekoliko naredbi odnosi se na primjenu so i biber šuma sa 10% crnih i 20% bijelih impulsa. Da bi ovo odradili morali smo da formiramo slučajnu promjenljivu R sa uniformnom raspodjelom Ono što je iznad 0.8 (približno 20% vrijednosti) je postavljeno na bijelo (255) dok ono što je ispod 0.1 (približno 10%) nije smješteno u odredišnu sliku odnosno uzima vrijednost 0 (crno). Laplasov šum je dobijen putem jednostavnog algoritma konverzije šuma sa uniformnom raspodjelom (na intervalu [-1/2,1/2) (obavite oduzimanje 1/2 od R u Laplasov šum. Rezultati primjenjenih naredbi u prikazani na slici 8.17.
158
8.2.8. KOLORNI MODELI Generalno prikazivanje slika u MATLAB-u je omogućeno za slike u punoj boji (RGB model), sivoskalirane (grayscale), indeksne slike sa odgovarajućom kolornom mapom i binarne slike. Međutim, novije verzije MATLAB-a imaju mogućnost konverzije RGB slike u veći broj kolornih modela kao i inverzne operacije te konverzije među različitim modelima.
Slika 8.16. Slika ‘onion.png’ sa različitim tipovima šuma redom: originalna, slika sa Gausovom, multiplikativnim, so i biber, Puasonovim šumom (sve dobijene sa imnoise naredbom), Gausovim šumom (randn funkcija), so i biber šumom sa različitim vjerovatnoćama soli i bibera, i Laplasovim šumom (generisanim iz šuma sa uniformnom raspodjelom). RGB model se može konvertovati u LAB (naredba rgb2lab), NTSC (rgb2ntsc – ovaj model je bazično RGB model sa nešto različitim frekvencijama za crveno, zeleno i plavo), XYZ (rgb2xyz XYZ je CIE model za kvantifikaciju osvjetljenja i tijela koja se koriste za osvjetljenje), YCrCb (rgb2ycrcb – YCrCb je model boja kod televizijskog signal). Inverzne opcije za ove naredbe su lab2rgb, ntsc2rgb, xyz2rgb i ycrcb2rgb. Grafički prikaz je naravno prilagođen RGB modelu tako da korišćenje imshow ili sličnih naredbi produkuje neobičnim rezultatima. Transformacija RGB slike u indeksnu se obavlja funkcijom rgb2ind. Naredba ima suštinski dva oblika: [B,m]=rgb2ind(A,n) kojom se RGB slika A konvertuje u indeksnu sliku B sa n nivoa. Pored indeksne slike rezultat ove naredbe je i odgovarajuća kolorna mapa m. Alternativni oblik je B=rgb2ind(A,m) kojom se formira indeksna slika sa zadatom kolornom mapom m. Primjer 8.2.7 Sliku ‘onion.png’ prikazati kao indeksnu u 128 nivoa. » A=imread('onion.png'); » [X,m]=rgb2ind(A,128); » subplot(121),imshow(A),xlabel('(a)') » subplot(122),imshow(X,m),xlabel('(b)')
(a) (b) Slika 8.17. (a) Originalna slika ‘onion.png’; (b) indeksna varijanta u 128 nivoa. Indeksna slika se može re-indeksirati koristivši aproksimaciju drugom kolornom mapom. Za ovu namjenu koristi se funkcija imapprox. Kao i prethodno i ova funkcija ima veći broj varijanti. Objasnimo neke od njih: [B,nova]=imapprox(A,mapa,n) na osnovu indeksne slike A, sa mapom mapa pravi sliku B sa novom mapom (nova) koja ima n nivoa; [B,nova]=imapprox(A,mapa,tol) slična prethodnoj samo što u ovom slučaju funkcija sama određuje broj nivoa u novoj kolornoj mapi na osnovu tol – zadate tačnosti odnosno tolerancije; B=imapprox(A,mapa,nova) kreira novu sliku sa mapom nova koju zadajemo na osnovu stare sa mapom map. Naredba može da ima dodatni parametar u obliku stringa ‘dither’ (podrazumijevana vrijednost) kojom se popravlja rezolucija boja po cijenu prostorne rezolucije a ako se ovo želi izmjeniti (spriječiti žrtvovanje gubitka prostorne rezolucije) koristi se opcija ‘nodither’. Demonstrirajmo ovu opciju na narednom primjer. Primjer 8.2.8 Učitati sliku 'onion.png', pretvoriti je u indeksnu sa 128 nivoa, zatim na dva načina izmjeniti kolornu mapu i konačno transformisati ovu sliku primjenom neke alternativne kolorne mape. » A=imread('onion.png'); » [X,m]=rgb2ind(A,128); » [B1,nm]=imapprox(X,m,40); » [B2,nt]=imapprox(X,m,0.1); 159
» size(nt) ans = 92 3 » B3=imapprox(X,m,m.^2); » subplot(221),imshow(X,m) » subplot(222),imshow(B1,nm) » subplot(223),imshow(B2,nt) » subplot(224),imshow(B3,m.^2) Ovaj primjer prvo formira sliku sa novom kolornom mapom od 40 elemenata (prikazana gore desno na slici 8.18), zatim sliku sa toleranciom 0.1 prikazanom dolje lijevo (vidimo da nivoa boja u ovoj slici ima 92), a konačno prikazujemo sliku sa novom kolornom mapom koja je iz originalne dobijena njenim kvadriranjem). MATLAB pored navedenih ima mogućnost konverzije iz RGB-a u NTSC (National Television Systems Committee) i HSV (Hue Saturation Value) modele putem naredbi: » pic1=rgb2hsv(pic); » pic2=rgb2ntsc(pic); NTSC je takođe suštinski RGB model sa unekoliko izmjenjenim verzijama koordinata (vezanih za RGB prostom linearnom relacijom). Inverzne funkcije su hsv2rgb i ntsc2rgb. Koristeći funkciju colormap može se predstaviti indeksna slika. Ovo je tzv. look up tabela u kojoj se nalaze RGB vrijednosti pojedinih kodova. Kolorna mapa ima strogo 3 kolone dok je broj vrsta proizvoljan. Prva kolona označava crvenu, druga zelenu, a treća plavu boju. Funkcijom colormap(map) tekuća slika se prebacuje u izabranu kolornu mapu. MATLAB posjeduje niz predefinisanih kolornim mapa: hsv, hot, bone, copper, pink, colorcube, jet, cool, autumn, spring, winter, summer itd: » colormap(hsv) » colormap(hot) » colormap(bone) » colormap(copper) » colormap(cool) » colormap(winter) » colormap(gray) Ne postoji prepreka da sami napravite kolornu mapu. Postupak je jednostavak mapa mora da ima tri kolone sa vrijednostima od 0 do 1 gdje prva kolona predstavlja nivo crvene (R – red), druga nivo zelene (G – green) i posljenja nivo plave (B – blue). Najmanjim vrijednostima u indeksnoj slici odgovara boja opisana prvom vrstom kolorne mape, itd.
Slika 8.18. Slika dobijena aproksimacijom kolorne mape naredbom imapprox: gore lijevo - originalna indeksna slika; gore desno - slika sa aproksimiranom kolornom mapom u 40 nivoa; dolje lijevo – slika sa aproksimiranom kolornom mapom sa tolerancijom 0.1; dolje desno – slika dobijana sa alternativnom kolornom mapom. Kada je prikazana indeksa slika u svakom trenutku možemo promjeniti kolornu mapu naredbom colormap(mapa) gdje je mapa ona kolorna mapa koja se primjenjuje na sliku koja je trenutno prikazana. 160
Primjer 8.2.3 Učitati sliku ‘board.tif’ i na osnovu nje formirati sivoskaliranu sliku tako što se uprosječe vrijednosti sa pojedinih kanala RGB slike: » A=imread('board.tif'); » A=double(A); » B=uint8((A(:,:,1)+A(:,:,2)+A(:,:,3))/3); » imshow(B)
8.2.9. BOJA PIKSELA Boja piksela se može prikazati na različite načine a jedna od načina je putem naredbe impixel. Npr., za neku učitanu sliku a vrijednosti u specificiranim pikselima se dobijaju naredbom: » rgb=impixel(a,[1 2 4],[34 123 34]) čime dobijamo u konkretnom slučaju osvjetljaje piksela u tačkama a(34,1,:), a(123,2,:) i a(34,4,:). Uočite da drugi argument odgovara rednom broju kolone dok treći odgovara rednom broju vrste. Slična je funkcija improfile kojom se mogu dobiti vrijednosti boja u slici. Postoji više opcija vezanih za ovu naredbu. Ovdje ćemo pomenuti dvije. Pretpostavimo da crtež u aktivnom prozoru predstavlja sliku. Ako se zada c=improfile može se crtati linija po crtežu. Kada se završi sa crtanjem dobija se grafik koji prikazuje vrijednosti kanala boja za izabrane tačke dok se u c smiještaju vrijednosti RGB kanala po izabranom pravcu. Druga mogućnost je da se poziva naredba u obliku improfile(A,x,y) gdje je A slika čiji se profil traži dok su x i y vektori iste dužine koji predstavljaju putanju čiji se profil želi prikazati. Ako naredba improfile u drugom slučaju nema izlazni argument rezultat naredbe neće biti proslijeđen na izlaz već se izgled profila prikazuje u grafiku (pogledati sliku 8.19) a alternativno rezultat se smiješta u promjenljivu koja je na lijevoj strani relacije: improfile(A,x,y).
Slika 8.19. Rezultat funkcije improfile za dio slike kada se u naredni ne koristi lijevi argument (strana) – rezultat.
8.2.10 NEKE STATISTIČKE KARAKTERISTIKE SLIKE Sa mean2(a) dobija se srednja vrijednost slike a (altenativa je mean(mean(a)), std2(a) je standardna devijacija slike, dok je kros-korelacija dvije slike corr2(a,b).
8.2.11 INFORMACIJI O SLICI Postoji više naredbi kojima se možemo informisati o tipu slike. Ako je slika već učitana često je dovoljna informacija ona koja se može saznati narednom whos. Ako slika nije učitana postoje dvije preporučljive funkcije to su iminfo i imtool. Funkcija iminfo kao argument može primiti fajl ili web link na isti način kako to radi naredba imread (ovdje su dati samo neke od osobina dok su ostale kao manje važne eliminisane iz prikaza jer se radi o ekstenzivnom spisku): » info=imfinfo('onion.png') info = Filename: 'C:\Program Files\MATLAB\MATLAB Production Server\R2015a\toolbox\image...' FileModDate: '07-Nov-2009 20:01:52' FileSize: 44638 Format: 'png' FormatVersion: [] Width: 198 Height: 135 BitDepth: 24 ColorType: 'truecolor' FormatSignature: [137 80 78 71 13 10 26 10] Colormap: [] InterlaceType: 'none' Transparency: 'none' SimpleTransparencyData: [] BackgroundColor: [] ImageModTime: '29 Oct 2009 17:11:53 +0000' Title: [] Author: [] Copyright: 'Copyright The MathWorks, Inc.' 161
» info2=imfinfo('https://pbs.twimg.com/media/C0qkNShWgAA4-am.jpg') info2 = Filename: 'https://pbs.twimg.com/media/C0qkNShWgAA4-am.jpg' FileModDate: '06-Mar-2019 13:00:10' FileSize: 280675 Format: 'jpg' FormatVersion: '' Width: 1170 Height: 1147 BitDepth: 24 ColorType: 'truecolor' FormatSignature: '' NumberOfSamples: 3 CodingMethod: 'Huffman' CodingProcess: 'Progressive' Comment: {} Druga naredba sa kojom možemo dobiti informacije o slici je imtool sa tom razlikom što ovdje imamo na raspolaganju interaktivni grafički alat (pogledati sliku 8.20) » imtool('moon.tif')
Slika 8.20. Image Tool – obratite pažnju na toolbar i menije koji su posebno namjenjeni dobijanju adekvatnih informacija o slici koja je prikazana u prozoru.
8.2.12 OSNOVE OBRADE SLIKE Jedna od osnovnih obrada slike je promjena njenog osvjetljaja. Za promjenu osvjetljaja slike može se koristiti više postupaka a jedan mogući je naredba brighten. Posmatrajmo sljedeći primjer. Primjer 8.2.4 Učitati sliku ‘shadow.tif’ a zatim promjeniti njen osvjetljaj » [X,map] = imread('shadow.tif'); » imshow(X,map) » brighten(0.5) » brighten(-0.5) » brighten(-0.7) Sa svakom primjenom naredbe brighten dolazi do promjene osvjetljaja. Negativne vrijednosti smanjuju osvjetljaj dok pozitivne posvjetjavaju sliku. Argument naredbe mora biti u granicama [-1;1]. Uzastopna primjena naredbe brighten sa vrijedostima iste apsolutne vrijednosti a suprotnog predznaka vraća početni osvjetljaj slike. Naredbom brighten moguće je takođe transformasati i kolornu mapu tako što se nova sračuna kao: » nm= brighten(map,c); gdje je map stara kolorna mapa a c je indeks posvjetljivanja/potamnjivanja (u granicama [-1;1]). Kao što se može vidjeti funkcija brighten je prilagođena isključivo indeksiranim slikama. Ako želimo da posvjetlimo ili potamnimo druge oblike slika moramo se malo više potruditi. Primjer 8.2.5 Posvjetliti sliku ‘gantrycrane.png‘ sa faktorom 0.5. » X = imread('gantrycrane.png'); » Y=uint8((double(X)/255).^0.5*255); 162
Procedura je prilično prosta. Prvo svedemo sliku na domen [0,1] dijeljenjem sa maksimalnom vrijednošću (255). Stepenovanje ove funkcije stepenima koji su manji od 1 povećava vrijednosti (posvjetljava) dok sa stepenima većim od 1 smanjuje vrijednosti (potamnjuje) ali zadržava domen [0,1]. Konačno ponovo pomnožimo sa maksimalnom vrijednošću da vratimo u domen slike. Na slici 8.21 prikazan je izgled originalne i posvjetljene slike.
Slika 8.21. Originalna slika i njena posvjetljana varijanta. Za inverziju slike koristi se naredba imcomplement » imshow(imcomplement(X)) dok je u starijim verzijama MATLAB-a korištena naredba iminverse. Za RGB i sivoskalirane slike sa 8 bita po pikselu dobijanje invertovane slike je veoma jednostavno » pic2=uint8(255-double(pic)) U cilju da se odredi slika poslije poređenja sa pragom može se koristiti naredba im2bw: » pic1=im2bw(pic,l); koja konvertuje sivoskaliranu sliku u binarnu sliku gdje je nivo 255*l (255 se odnosi na 8-bitni zapis slike). l je u granicama 0 i 1 l[0;1]. Za l>1 rezultujuća slika je crna, dok je za l plot Data may not have more than 2 dimensions. Ono što možemo prikazati su pojedinačni 2D minori ove matrice. Probajmo sa: » plot(D(1,2,:,:)) 224
??? Error using ==> plot Data may not have more than 2 dimensions. Međutim ponovo nas je dočekala ista poruka o grešci. Naime matrica D(1,2,:,:) je i dalje 4D matrica! što se može provjeriti sa: » size(D(1,2,:,:)) ans = 1 1 2 4 Da bi se navedeni problem izbjegao upotrebljava se naredba squeeze koja rezultuje matricom sa istim brojem elemenata kao što je kod argumenta ali sve dimenzije veličine jedan su eliminisane. Tako naredba » plot(squeeze(D(1,2,:,:))) sada funkcioniše bez problema. Novije verzije MATLAB-a nemaju ovaj problem već automatski eliminišu dimenzije sa kardinalnošću 1. Neke od nama dobro poznatih naredbi kao što je ona za transponovanje ne mogu se baš na jednostavan način primjeniti kod višedimenzionih matrica. Stoga je uveden metod permute koji omogućava promjenu redosljeda dimenzija u matrici. Npr. funkcijom: » X = rand(12,13,14); formirali smo matricu X dimenzija 12134 sa slučajnim brojevima uniformno raspoređenim na intervalu od 0 do 1. Dok naredbom: » Y = permute(X,[2 3 1]); formiramo matricu Y preuređivanjem dimenzija matrice X tako da je prva dimenzija matrice Y odgovara drugoj dimenziji matrice X, druga dimenzija matrice Y odgovara trećoj dimenziji matrice X i konačno trećoj dimenziji matrice Y odgovara prva dimenzija matrice X. Ovo se može provjeriti sa: » size(Y) ans = 13 14 12 Naredba shiftdim može da se upotrijebi na sličan način kao prethodna a liči u nekim slučajevima i na funkciju squeeze. Naredbom shiftdim(A,n) pomjeraju se pozicije u matricu za n dimenzija cirkularno ulijevo ako je n pozitivno ili udesno ako je n negativno. Naredba oblika: » [B,n]=shiftdim(A) eliminiše početne koodinate sa dimenzijom 1 i vraća n koliko je tih dimenzija sa početka eliminisano. Pogledajmo sljedeći primjer: » a = rand(1,1,3,1,2); » [b,n] = shiftdim(a); Ova naredba će vratiti b koje je matrica 3x1x2 dok je n=2 (izbrisanih početnih dimenzija). Ako je drugi argument funkcije shiftdim negativan tada će na početku matrice biti postavljen onoliki broj jediničnih dimenzija kolika je apsolutna vrijednost broja koji je drugi argument. Tako sljedećom naredbom dobijamo polaznu matricu a: » c = shiftdim(b,-n); Prethodnim pozivom funkcije formira se matrica c koja je ista kao polazna matrica a. Pozivom funkcije » d = shiftdim(a,3); dobijamo matricu d matrica dimenzija 12113. Ovdje vrijedi uvesti i naredbu reshape koja se može primjenjivati i kod 2D matrica. Prvi argument ove naredbe je matrica kojoj treba promijeniti oblik dok su ostali argumenti vezani za dimenzije matrice u koju se vrši transformisanje. Neka je polazna matrica: A= 1 4 7 10 2 5 8 11 3 6 9 12 Naredbom: » B=reshape(A,2,6) dobijamo matricu dimenzija 26 na osnovu matrice A tako dobijenu da su elementi u novu matricu smiješteni kolonu po kolonu B= 1 3 5 7 9 11 2 4 6 8 10 12 Ekvivalentna naredba prethodnoj je i B=reshape(A,[2,6]); Na osnovu 2D matrice možemo da dobijemo višedimenzione matrice i obrnuto. Npr: » C=reshape(A,[2,2,3]) C(:,:,1) = 1 3 2 4 C(:,:,2) = 5 7 6 8 C(:,:,3) = 9 11 10 12 Indeksiranje višedimenzionih matrica (kao i sve operacije sa njima) obavljaju kao kod 2D matrica: 225
» C([2 1],:,[3 1]) ans(:,:,1) = 10 12 9 11 ans(:,:,2) = 2 4 1 3 Ako želimo ovdje da dobijemo 2D matricu (jer suštinski u pitanju je takva matrica) odradićemo squeeze(ans). Ovdje vrijedi napomenuti postojanje još jedne funkcije koja je prevashodno namjenjena 2D matricama mada se može koristiti i kod njih i kod višedimenzionih matrica. To je naredba repmat. Format ove funkcije je repmat(A,q). Prvi argument je matrica a drugi argument je koliko puta se ova matrica ponavlja (slaže) po horizontali i vertikali. Može se pozvati kao: » repmat(A(1:2,1:3),2,4) ans = 1 4 7 1 4 7 1 4 7 1 4 7 2 5 8 2 5 8 2 5 8 2 5 8 1 4 7 1 4 7 1 4 7 1 4 7 2 5 8 2 5 8 2 5 8 2 5 8 ili alternativno kao: » repmat(A(1:2,1:3),[2,4]) Predmetna funkcija može se koristiti i za višedimenziono slaganje: » X=repmat(C,[2,1,2]); » size(X) ans = 4 2 6
12.4 KLASE U MATLAB-U
Klasa je objektno orjentisani koncept uobičajen za programske jezike kao što su C++ ili još više Java. Kod ovih programskih jezika dio (u C++) ili kompletan (u Java) kod programa nalazi se u konceptu koji se naziva klasa. Klasa je zapravo tip podataka u čijem sastavu su ugrađene (enkapsulirane) i sve operacije (funkcije ili kako se često zovu metodi) koji se sa promjenljivim klasnog tipa (zovu se objekti ili instance) mogu vršiti. Prije nego objasnimo osnovnu, veoma rudimentarnu sintaksu rada sa klasama vrijedi reći da su svi podaci u MATLAB-u klasnog tipa. Naime, ako je neki podatak cijeli broj MATLAB mu dodjeljuje neku cjeloborjnu klasu, npr. int16 tako da su operacije nad ovim tipom podataka prilagođene cijelim brojevima. Ovo se dalje koristi prilikom pozivanja određenih metoda ili operacija (npr. kod digitalne slike prije nego je pretvorimo u neki format nije dozvoljeno sabiranje). Ono što čini klasu različitom od strukture je postojanje metoda unutar klase. Ovdje ćemo samo u kratko objasniti osnovnu sintaksu klase a zatim idemo korak dalje da objasnimo pojedine element klasinog interfejsa. Opšta definicija klase ima sljedeći oblik: classdef mojaklasa properties %osobine ili atributi %redom osobine klase end %kraj definicije atrubuta-osobina klase methods %spisak i definicije metoda klase end %kraj metoda – funkcija klase end %kraj čitave definicije klase Ovakva definicija klase se smiješta u fajl koji nosi naziv mojaklasa.m koji se mora nalaziti u putanji foldera po kojima se vrši pretraga za funkcijama i klasama. Unutar klase se nalaze osobine (properties) koji se deklarišu navođenjem imena osobina praćenim karakterom ; na primjer: a; b; c; Neke od promjenljivih mogu imati podrazumijevane vrijednost na primjer: d=2; Jedan ili nekoliko metoda koji se nalaze u sekciji methods mogu da nose isto ime kao klasa: function obj=mojaklasa(a,b,c,d) %definicija objekta klase end Ovakvi metodi definiše što će se dešavati sa objektom prilikom njegovog nastanka (inicijalizacije). Na primjer mogući konstruktor za klasu koja ima četiri podatka člana može da bude: function obj=mojaklasa(a,b,c,d) if(nargin > 0) obj.a=a; obj.b=b; obj.c=c; obj.d=d; 226
end end U ovom slučaju objekat klase se inicijalizuje na vrijednosti podataka koje su objektu proslijeđene kao argumenti funkcije. Zgodna osobina MATLAB-a je da funkcije mogu imati proizvoljan broj argumenata te da se sa nargin, nargout, varargin i varargout može manipulisati sa ponašanjem datih funkcija. Ovim se izbjegava u najvećoj mjeri potreba da se preklapaju funkcije što je osobina C++ i drugih sličnih objektno orjentisanih programskih jezika (jezika koji barataju sa klasama). Drugi metodi koji su inherentni klasama mogu da rade različite obrade podataka klasnog tipa. Tako na primjer metod implementiran u tijelo klase: function obj = fudbal(obj,d) if d>obj.b obj.a=obj.a+1; end U predmetnoj funkciji u zavisnosti od vrijednosti argumenta može da se promjene promljenljive članice objekta za koji se funkcija poziva. Novi objekat predmetne klase poziva se konstruktorom: » x=mojaklasa(2,3,4,5); dok se funkcija fudbal poziva putem operatora tačka kao x.fudbal(30);. Prethodna definicija osobina klase dopušta potpuni pristup podacima članovima tako je u potpunosti dozvoljeno pročitati sadržaj podataka članova ili ih izmjeniti: » G=x.a; » x.b=20; Međutim, kao u svim objektno orjentisanim metodima postoji mogućnost kontrole pristupu podacima članovima klase (tzv. prava pristupa). Ovo se postiže tako što se eventualno može uvesti više properties sekcija u kojima se mogu definisati različita prava pristupa za pojedine atribute (osobine): properties(GetAccess = 'public', SetAccess = 'private') % osobine koja se mogu spolja čitati dok se ne mogu mijenjati end properties(GetAccess = 'private', SetAccess = 'private') % osobine koje se ne vide spolja niti im se mogu mijenjati vrijednosti end Postoje kao u gotovo svi poznatijim objektno orjentisanim programskim jezicima tri nivoa vidljivosti odnosno prava pristupa a to su: privatna (vidljiva samo iz klase) 'private', javna (vidljiva iz svih djelova programa) 'public' i zaštićena (vidljiva iz klase i iz izvedenih klasa) 'protected'. U MATLAB-u se razlikuju prava vezana za čitanje osobina (postavljaju se sa GetAccess) i prava vezana za postavljanje vrijednosti osobina (postavljaju se sa SetAccess). U MATLAB-u postoje i neki drugi atributi osobina koji se zaista rijetko koriste osim eventualno 'Constant' i donekle 'Hidden'. Kao konstante osobine se označavaju one koje se ne mogu promjeniti kao što je dato u narednom primjeru: properties(Constant = true) DANA=365; MJESECI=12; GODINA=52; end Moguće je definisati sakrivene osobine koje se ne vide kada se prikazuje objekat. Svi ostale osobine za objekte neke klase se prikazuju funkcijom properties: » properties(x) Metodi su funkcije definisane u klasi koje rade sa podacima članovima objekata te klase. Pretpostavimo da imamo metod dodajA() koja treba da uveća osobinu a za argument p navedene klase. function obj=dodajA(obj,p) obj.a=p+obj.a; end Ako je x objekat klase onda se predmetni metod može pozvati kao x1=x.dodajA(3); odnosno x1=dodajA(x,3). Prvi način pozivanja je prirodniji za ljude koji su familijarni sa C++ i Java-om a treba inače znati da u oba slučaja metod ima dva argumenta (nargin=2) od kojih je u prvom slučaju prvi argument objekat x za koji je funkcija pozvana. Jedna neobična stvar kod MATLAB-a je činjenica da je neophodno da se objekat ažurira jer kod MATLAB-a ne postoji poziv po reference već samo poziv po vrijednosti pa se objekat ne može ažurirati na alternativan način. Dakle, ako se objekat ne vrati kao rezultat funkcije onda neće ni biti ažuriran. Postoji mogućnost da se upotreba vraćanja objekta kao rezultata funkcije izbjegne primjenom slične tehnike kojom smo ažurirali podatke kod grafičkih objekata u Glavi 6. Metodi kao i osobine mogu da budu privatni, zaštiženi ili javni. Privatni metodi nisu dio interfejsa klase koji se koristi van klase već se koriste isključivo iz klase. Često se koriste da bi pojednostavili javne metode koji ih eventualno pozivaju. Zaštićeni metodi nisu vidljivi van klase ali su vidljivi iz klasa koje nasljeđuju našu klasu. Više metoda se može deklarisati kao privatnih, javnih ili zaštićenih u jednom bloku kao što je na primjer: methods(Access = private) function S = FS(obj) sec = obj.minute*60 + obj.hour*60*60 + obj.day*24*60*60; end function TF = isValid(obj) TF = obj.minute >= 0 && obj.minute 10 A = A + i; else A = [A, 4+i]; end %%%Nastavak petlje end Međutim, dozvoljeno je da imamo redukciju istog tipa (sa eventualno različlitim težinama) u dvije grane selekcije unutar parfor petlje: A=0; parfor i = 1:n if i > 10 A = A + i; else A = A + i + 5*k; end %%%Nastavak petlje end U principu kod redukcije je dozvoljeno pozivanje tipa a=f(a,k) gdje je f neka funkcija koja je definisana van parfor petlje. Međutim, primjer za izračunavanje Fibonačijevih brojeva neće da radi na doljenavedeni način jer paralelna izvrašavanja zahtjevaju prethodne vrijednosti koje možda u trenutku pozivanja nisu dostupne f = zeros(1,50);f(1) = 1;f(2) = 1; parfor n = 3:50, f(n) = f(n-1) + f(n-2); end
13.3 IZVRŠAVANJE U POZADINI Veoma čest pristup radu u paralelnim sesijama je slanje nekog programa na izvršavanje "drugom radniku" dok vi nastavljate svoju sesiju bez opterećivanjem izvršavanjem programa koji je proslijeđen "radniku". Na primjer pretpostavimo da je rutina koja se želi proslijediti "drugom radniku" u programu skript.m. Treba samo pozvati naredbu batch kao što je to radniku=batch('skripta'). Kada je posao završen rezultate predmetne procedure možete dobiti naredbom load(radniku, 'promjenljiva') čime je učitana promjenljiva iz posla radniku. Kada se završi posao sa batch procedurom može uništiti naredbom destroy(radniku). U ovakvom načinu izvršavanja podrazumijeva se da je program radniku pisan standardno odnosno da sam po sebi nije paralelizovan. Međutim, mogu se koristiti kombinovano osobine batchprocedura i paralelnog izvršavanja. U tom slučaju podrazumijeva se da u programu koji se poziva putem batch procedure postoje djelovi koda koji se mogu paralelizovati (npr. kako je to prethodno demonstrirano putem parfor naredbe). Batch procedure se u ovom slučaju pozivaju kao: posao = batch('program', 'matlabpool', 3) %u ovom slučaju program se može izvršavati na tri radnika. Kada se program.m završi onda se podaci mogu učitati sa load(posao,'promjenljiva'). Posao se završava sa destroy(posao). U slučaju kada želite da sačekate da se batch procedura završi prije nego što nastavite dalje zvrašavanje programa pozvaćete naredbu wait(posao). Naredba spmd predstavlja situaciju kada isti program radi sa različitim podacima. Na primjer: matlabpool % Paralelno okruženje sa podrazumijevim parametrima spmd % Podrazumijevano se koristi u svim paralelnim izvršavanjima R = rand(4); end Ovim se kreira 44 slučajna matrica za svakog "radnika". Ove matrice su dostupne iz klijentske aplikacije a pristup im se ostvaruje kao da su u pitanju elementi neke ćelijske matrice: X = R{3}; U ovom slučaju R{3} predstavlja matricu R iz trećeg radnika. U naredne dvije naredbe mijenjamo ovu matricu, smiještamo je ponovo u R{3} čime zapravo mijenjamo matricu R za trećeg radnika: X = X + 2; R{3} = X; Ako je MATLAB-ov pool otvoren između spmd iskaza i iste labele podaci se za svakog radnika čuvaju od jednog do drugog spmd iskaza: spmd 230
R = R + labindex % koristi vrijednost R-a iz prethodnog spmd iskaza end Predmetni spmd blokovi se koriste za pokretanje većeg broja radnika koji rade ili pristupaju različitim podacima. Podacima iz pojedinih radnika se može pristupati kao ćelijama na dva načina: AA{n} vraća vrijednost promjenljive AA iz n-tog radnika dok AA(n) vraća ćeliju AA iz n-tog radnika. Uputno je sa naredbom: matlabpool close zatvoriti paralelno izvršavanje kada su svi spmd završeni.
13.4 IZAZOVI I PROBLEMI U PARALELNOM PROGRAMIRANJU U pogledu korišćenja parfor-a postoje brojna ogračenja sa kojima se trebate upoznati u dokumentaciji. Npr. eval vjerovatno neće raditi jer parfor ne može biti što se tu izvršava, clear u dijelu parfor petlje vjerovatno neće raditi jer se ne za što se treba brisati, nije dozvoljeno ugnježdavati parfor petlje dovoljno je uraditi to sa spoljašnjom. Pisanje paralelnih programa je posebna vještina jer se često dešava da paralelni program bude sporiji od onog neparalelnog. Stoga čak i u predmetnom redukovanom interfejsu je veoma bitno proučiti elemente efikasnosti i skalabilnosti programa. Jedno od pitanja sa kojim se susrećemo u MATLAB-u posebno u ogledalu činjenice da MATLAB ne raspolaže sa pokazivačima je gdje kreirati matrice. Ako se radi sa velikim matricama smatra se da je efikasnije da se njeni djelovi kreiraju u iteracijama petlje a ne da se kreira cijela matrica odjednom prije petlje. Naravno odluka o načinu implementacije bitno zavisi od razmatranog problema te od činjenica da li "radnici" mogu da rade sa djelovima matrice ili im treba čitava matrica za rad. Posmatrajmo sljedeća dva primjera. Prvo startujmo mathpool lokalno na sopstvenom računaru. Naredbe tic-toc nam služe da izmjerimo vrijeme izvršavanja. U prvom slučaju formiramo matricu M i R van paralelne petlje pa zatim vršimo sumiranje njenih djelova u petlji. U drugom slučaju kreiramo u paralelnim izvršavanjima niz matrica i zatim vršimo njihovo sumiranje. Na prvi pogled paradoksalno rad sa matricama M i R koje su jednom alocirane je bio dosta sporiji nego kod u kojem su matrice kreirane u svakoj paralelnoj petlji (u ovom slučaju oko 3 puta). Razlozi su djelimično u dimenzijama matrice ali mnogo više u činjenici da je u prvom slučaju jedan dio koda odrađen neparalelno te da je bila potrebna stalna komunikacija sa matricama koje su alocirane van paralelnih tokova. Sličnih manje ili više praktičnih primjera može da se nađe veliki broj pa je uputno pored proučavanja paralelnog programiranja analizirati i testirati izvršavanja na sopstvenoj mašini prije odluke o načinu na koji će se raditi sa paralelnim petljama pri radu sa obimnim podacima. matlabpool >> tic; n = 200; M = magic(n); R = rand(n); parfor i = 1:n A(i) = sum(M(i,:).*R(n+1-i,:)); end toc; Elapsed time is 0.968519 seconds. >> tic; n = 200; parfor i = 1:n M = magic(n); R = rand(n); A(i) = sum(M(i,:).*R(n+1-i,:)); end toc; Elapsed time is 0.397755 seconds.
231
glava četrnaesta
VEZE SA DRUGIM PROGRAMSKIM JEZICIMA U ovom poglavlju opisane su osnovni elementi veze programskog paketa MATLAB sa nekim od programskih sistema i jezika koji su šire dostupni. Poznato je da danas gotovo svi programski sistemi ne funkcionišu samostalno već da je intencija da se ono što radimo u jednom paketu može povezati sa programima i sistemima koji su kreirani u drugim alatima. Ovdje će prvo biti objašnjena veza MATLAB-a sa programskim jezikom C (koja se može proširiti na C++ i druge srodne sisteme). Nakon toga ćemo dati prikaz rada sa MEX funkcijama a poglavlje zaključujemo sa spiskom programskih sistema sa kojima MATLAB-ove nove verzije mogu da komuniciraju a koje uključuju Java, Python, Fortran, COM komponente i aplikacije, Visual C#, Visual Basic i .NET okvir kao i veze prema web okruženju.
14.1 VEZA MATLAB – PROGRAMSKI JEZIK C Čest problem u MATLAB-u je sakriti svoje znanje od drugih korisnika. Takođe, postoji i problem kako neke rutine izvršiti brzinom koja bi bila moguća u C-u ili čak Fortran-u. MATLAB posjeduje sve navedene interfejse i postoji mogućnost da putem više alata a jedan od njih su C MEX funkcije riješite ove probleme. Ovdje ćemo ih upoznati rudimentarno koliko nam prostor ove knjige dozvoljava. Objašnjenja su pisana uglavnom za nekoga koji ima znanje iz programskog jezika C odnosno C++ jer bi ulazak u sve detalje odnio znatno više prostora. Osnovni elemenat ovog rada je mexFunction (primjer ove funkcije možete vidjeti u fajlu ...\extern\examples\mex\mexfunction.c). Zaglavlje ove funkcije je: void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) Argumenti ove funkcije suštinski su ulazni i izlazni argumenti M-fajlova: *prhs[] niz ulaznih argumenata, nrhs broj ulaznih argumenata, *plhs[] – niz ulaznih argumenata, nlhs – broj ulaznih argumenata. Vidimo da u prhs i plhs niz pokazivača na specijalni tip podataka mxArray. Suštinski poziv: » [C, D]=func(A, B) u MATLAB-u funkcije func koja je realizovana u MEX fajlu podrazumijeva sljedeće: A i B-u u MEX fajlu koji realizuje ovu funkciju se pristupa putem pokazivača prhs[0] (indeksiranje u C-u počinje od indeksa 0 i obavlja se u uglastim zagradama) i prhs[1] dok se rezultati smiještaju putem pokazivača plhs[0] i plhs[1]. Posmatrajmo najjednostavniji primjer funkcije koja uzima kao argument skalar i vraća njegovu dvostruku vrijednost. Radi ilustracije posmatrajmo sljedeći primjer (MATLAB raspolaže sa velikim brojem sličnih test funkcija napisanih u najboljem stilu odbrambenog programiranja sa provjerama svih tipova grešaka koje korisnik može da prouzrokuje). U pitanju je jednostavna funkcija koja vraća dvostruku vrijednost argument sa nazivom timestwo. Primjer 14.1.1 Slijedi primjer programse mex funkcije timestwo. #include "mex.h" void timestwo(double y[], double x[]) { y[0] = 2.0*x[0];} void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *x, *y; int mrows, ncols; if (nrhs != 1) { mexErrMsgTxt("Potreban je jedan ulazni argument."); } else if (nlhs > 1) { mexErrMsgTxt("Previse izlaznih argumenata");} mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows == 1 && ncols == 1)) { mexErrMsgTxt("Mora biti realni broj sa dvostrukom tacnoscu."); } plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); timestwo(y,x); } Objasnimo sada ovaj bitan primjer. U C-fajlu smo uključili potrebnu biblioteku mex.h. Zatim smo kreirali funkciju koja daje dvostruku vrijednost drugog argumenta i smješta je u prvom argumentu (operacije se moraju obaviti putem pokazivača). Zatim počinje mexFunction. U njoj imamo nekoliko elemenata kao što su naredbe mexErrMsgTxt koja prekida izvršavanje funkcije i daje prateće objašnjenje. U primjeru je koristimo više puta a u prva dva slučaja je koristimo ako imamo neodgovarajući broj argumenata a u trećem je pozivamo ako smo otkrili da argument nije odgovarajući ili da dimenzije argumenta ne odgovaraju. Metodi mxGetM i mxGetN daju broj redova za podatak koji je proslijeđen putem odgovarajućeg pokazivača. Metodi mxIsDouble i mxIsComplex ispituju tip podataka na koji pokazivač pokazuje. Funkcija mxCreateDoubleMatrix prima tri argumenta koji su redom broj redova, kolona i tip podatka (u ovom slučaju mxREAL). Ovdje smo funkciju mxCreateMatrix upotrijebili da bi formirali pokazivač na rezultat (u ovom slučaju jedini rezultat). Konačno kada sve navedene operacije obavimo sa mxGetPr dobijamo pokazivače koji se mogu koristiti u C funkciji koja je data gore i pozivamo navedenu C 232
funkciju. Navedeni fajl se snima po nazivu funkcije koja je u njemu kao timestwo.c (to se može obaviti i u MATLAB-ovom debugeru ali je potrebno fajl snimiti kao All files jer bi u suprotnom dobio ekstenziju .m). Fajl se prevodi naredbom MEX praćenom opcijom –g a u našem slučaju prije izvršenja » mex -g timestwo.c Prilikom poziva ove naredbe možda ćete biti upitani koji C kompajler da koristite. Možete koristiti ugrađeni kompajler LCC. Nakon kompajliranja možete da pristupate i pozivate navedenu funkciju kao bilo koju drugu Matlab-ovu funkciju. » timestwo(3) ans = 6 U slučaju da vam treba help fajl ili nešto slično napravićete M funkciju sa odgovarajućim zaglavljem koja će umjesto tijela imati samo help (dio teksta pod komentarom). Od M-fajlova se može dobiti C kod i/ili program. Ako vam treba program najbolje je da napišete glavnu Mfunkciju i sve funkcije koje ova poziva (postoji ograničenje da se neke Matlab-ove funkcije posebno one iz toolboxova ne mogu kompajlirati). Kada završite posao pisanja M fajlova (ovdje dajemo primjer funkcije main koja poziva funkciju mrank): function main r = mrank(5) function r = mrank(n) r = zeros(n,1); for k = 1:n r(k) = rank(magic(k)); end kompajliranje se obavlja sa naredbom mcc –m i navođenjem svih M funkcija koje treba kompajlirati: » mcc -m main mrank Pored EXE fajla koji se može izvršavati nezavisno od MATLAB-a (ovdje se zove main.exe) dobijate i funkcije prevedene u C programski jezik (ako je kao posrednik prevodilac korišćen LCC). EXE fajl se može izvršavati nezavisno od MATLAB-a ali ponekad ne mora biti ni naročito efikasan posebno za jednostavne programe pošto dosta vremena na početku izvršavanja odnese učitavanje funkcija. Vrijedi napomenuti da se ova metodologija može koristiti bez razlika ako se konvertovanje obavlja u programski jezik C++. Savremene verzije MATLAB-a imaju ugrađen i alat koji se naziva MATLAB Coder kojim se proces razvoja aplikacija u drugim programskim jezima za podršku MATLAB-u a u provom redu radi ubrzanja ključnih djelova koda značajno olakšava u odnosu na prethodno stanje.
14.2 STRING KAO ARGUMENT FUNKCIJE Posmatrajmo sada slučaj kada se kao argument MATLAB-funkcije želi koristiti string a predmetna funkcija je realizovana putem C funkcije. Ovdje ćemo radi ilustracije upotrijebiti MATLAB-ov test fajl revord.c. Funkcija revord koja se nalazi u okviru fajla koristivši standardne C trikove vrši preokretanje sadržaja stringa. MEX funkcija je opterećana brojnim elementima odbrambenog programiranja: provjeravamo da je broj ulaznih argumenata 1, da je broj izlaznih 0 ili 1, zatim naredbom mxIsChar provjeravamo da li je taj jedini ulazni string, te da li je u pitanju vektor vrsta. Nakon provjera uzimamo dužinu stringa. Sljedeća naredba služi za alociranje memorije za izlazni string. Naredbom mxArrayToString(prhs[0]) ulazni argument (koji se tretira kao MATLAB-ova matrica) se pretvara u string i nakon provjere konverzije poziva C-funkcija revord koja radi aktuelnu operaciju. Prije kraja MEX vršimo smještanja rezultujećeg stringa u odgovarajući izlazni pokazivač naredbom mxCreateString i dealociramo izlazni bafer naredbom mxFree. Primjer 14.2.1 Slijedi primjer programske mex funkcije revord. #include "mex.h" void revord(char *input_buf, mwSize buflen, char *output_buf){ mwSize i; if (buflen == 0) return; for(i=0;i 1) mexErrMsgTxt("Previse izlaznih argumenat."); if ( mxIsChar(prhs[0]) != 1) mexErrMsgTxt("Ulaz mora biti string."); if (mxGetM(prhs[0])!=1) mexErrMsgTxt("Ulaz mora biti vektor vrsta."); buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; output_buf=mxCalloc(buflen, sizeof(char)); input_buf = mxArrayToString(prhs[0]); if(input_buf == NULL) mexErrMsgTxt("Ne mogu da konvertujem u string."); revord(input_buf, buflen, output_buf); plhs[0] = mxCreateString(output_buf); mxFree(input_buf); return;} 233
Nakon kompajliranja ove funkcije možemo da je pozivamo kao i bilo koju drugu MATLAB funkciju. » mex revord.c » x = 'hello world'; » y = revord(x)
14.3 MEX FUNKCIJE SA VIŠE ARGUMENATA Sljedeći problem kojega ćemo razmatrati je prosljeđivanje C funkciji više od jednog argumenta na primjeru funkcije iz MATLAB dokumentacije koja množi skalar sa matricom i daje kao rezultat matricu. Funkcija xtimes množi matricu koja je data putem pokazivača y sa skalarom x i rezultat smiješta u matricu na koji pokazuje pokazivač z. U mexFunction nakon provjeravanja argumenata (posebno protumačite naredbu kojom se provjerava da li je ulazni string skalar i to nekompleksni). Zatim se uzima taj skalar pokazivač na drugi argument i određuju dimenzije matrice argumenta. Naredba mxCreateDoubleMatrix(mrows, ncols, mxREAL); formira matricu navedenih dimenzija sa realnim brojevima. Pokazivač se pridružuje matrici koja će predstavljati rezultujuću matricu nakon čega se poziva xtimes funkcija. Primjer 14.3.1 Slijedi primjer mex funkcije xtimes. #include "mex.h" void xtimesy(double x, double *y, double *z, mwSize m, mwSize n){ mwSize i,j,count=0; for (i=0; i).Grupa sadrži međusobno povezane komande, što znači da bi promjena vrijednosti neke od promjenljivih iz grupe uticala na sve izraze unutar te grupe. Posmatrajmo sledeći primjer. Neka je u jednoj grupi definisana sljedeća sekvenca matematičkih naredbi a=3, b=4-a i c=2*a, dok je u drugoj grupi definisana samo naredba d=a (Slika 15.4a). Primjetimo produženje srednje zagrade [, kao sastavnog dijela grupe, koja obuhvata pomenute tri naredbe, kao i odgovarajuće rezultate. Vrijednost promjenljive b iz druge grupe odgovara vrijednosti promjenljive a iz prve.
Rezultat
Slika 15.3. Razlike u prikazu Maple Input i Standard Math Input-a.
245
a)
b) Slika 15.4. Ilustracija izvršavanja naredbi u okviru različitih grupa. Vratimo se sad u prvu grupu, promjenimo vrijednost promjenljivoj a na 5 i izvršimo tu grupu (Slika 15.4b). Promjenljive b i c ažuriraju svoju vrijednost, dok d zadržava staru vrijednost. Da bi se ažurirala vrijednost promljenljive b potrebno je izvršiti drugu grupu naredbi. Izvršavanje naredbi u okviru jedne grupe najjednostavnije se vrši pozicioniranjem kursora u tu grupu naredbi i pritiskom tastera Enter. Na ovaj način se pored izvršenja date grupe formira nova grupa. Ukoliko ne želimo da se formira nova grupa potrebno je selektovati bilo koju naredbu iz date grupe i izvršiti opciju Edit / Execute / Selection.
15.2.4 OSNOVE SINTAKSE Sintaksa je bitna samo kada se radi sa izabranom opcijom Maple Input iz Insert menija. Odmah u startu treba istaći da je Maple razlikuje mala i velika slova (case sensitive) (X i x su različite promjenljive u Maple-u). Kao što ste već mogli primjetiti, naredbe u Maple-u se završavaju sa tačkom-zarez (;). Pored toga, naredbe se mogu završavati i sa dvotačkom (:), sa tom razlikom da se u slučaju korišćenja tačkezarez ispisuje rezultat izvršene naredbe, dok se u slučaju dvotačke rezultat ne ispisuje, iako se naredba izvrši. Vrijedi odmah istaći da su svi operatori u MAPLE-u isti kao kod MATLAB-a (+, -, *, /, ^) ali da za stepenovanje se koristi i operator ** (2**3 je isto kao 2^3). Slično kao u Matlab-u, promjenljive nije potrebno deklarisati u Maple-u. Operator dodijele := (obratiti pažnju na dvotačku kao sastavni dio operatora) kreira promjenljivu, koja se nalazi na lijevoj strani tog operatora, i toj promjenljivoj dodijeljuje vrijednost koja se nalazi sa desne strane operatora. Na primjer, ukoliko u radnom prostoru ne postoji promjenljiva a, onda će operacija a:=3 kreirati tu promjenljivu i dodijeliti joj vrijednost 3. Ukoliko želimo editovati (modifikovati) neku od postojećih grupa komandi dovoljno je vratiti se na odgovarajuću grupu i napraviti željene modifikacije. Pritiskom na Enter, ili opcijom Edit / Execute / Selection, izvršava se ta grupa komandi. U nastavku će biti objašnjen određen broj često korišćenih naredbi u Maple-u. > a:=sqrt(3);
a := 3 sqrt(argument) je funkcija koja daje kvadratni korijen argumenta, pri čemu se argument navodi u zagradama. Primećujemo da rezultat nije ispisan u numeričkom obliku, već u simboličkom. Da bismo dobili numeričku vrijednost izraza koristimo funkciju evalf i to u sledećem zapisu: > a:=sqrt(3);
a := 3 > evalf(%);
1.732050808
evalf(%) daje numeričku vrijednost posljednjeg izvršenog izraza. U MAPLE-u procenti se koriste da bi se naglasili prethodni izrazi. Tako je % neposredno prethodni, %% pretprošli, %%% još jedan unazad. Pogledajmo sledeći primjer: >2*4; 8 >%*15.76; 126.08 >%%-%; -118.08 >(%%%)^2+%%; 190.08 Ukoliko baratamo sa većim brojem grupa naredbi onda se može desiti da ne znamo koji je poslednji izvršeni izraz, pa se može koristiti oblik naredbe evalf kod koga se izraz od koga se traži vrijednost navodi unutar zagrada. Na primjer: > a:=evalf(sqrt(3));
a := 1.732050808
Funkcija evalf se može pozvati i kao evalf[20](sqrt(3)); čime se podešava da se rezultat prikazuje na 20 preciznih mijesta. Druga korisna funkcija je ifactor koja vrši faktorizovanje argumenta koji je cio broj. Primjer korišćenja ove funkcije je dat u nastavku: 246
> ifactor(10!);
( 2 )8 ( 3 )4 ( 5 )2 ( 7 )
Argument takođe može biti racionalan broj, tj. razlomak sa cjelobrojnim imeniocem i brojiocem, pa u tom slučaju funkcija vrši faktorizovanje i imenioca i brojioca, uz eventualno skraćivanje istih prostih činioca: > ifactor(220/320);
( 11 ) ( 2 )4
Postoji više naredbi koje se koriste za operacije sa cijelim brojevima. Naredba iroot daje korjen broja koji je prvi argument naredbe dok je sam red korjena specificiran drugim argumentom: > iroot(982523,4); 31 Najveći zajednički djelilac se dobija sa: > igcd(2024, 4862); 22 Ostatak pri dijeljenju se dobija sa: > irem(209, 17); 5 dok je količnik cjelobrojnog dijeljenja: > iquo(209, 12); 12 Ako izraz na svome kraju ima mod k operacija će se obavljati u cjelobrojnoj aritmetici sa mogućim brojevima iz skupa {0,…,k-1} odnosno rezultati svih operacija će u C-notaciji biti a%k gdje je a aktuelni rezultat operacije u standardnoj aritmetici (ovo se često naziva kongruencijom). Na primjer: > 13*5 mod 3; 2 Ovdje možemo demonistrirati kako funkcioniše sekvenca naredbi: >seq(i!,i=2..5); 2,6,24,120 Slična funkcija funkciji ifactor je factor, koja vrši faktorizovanje polinoma ili razlomka čiji su imenilac i brojilac polinomi sa cjelobrojnim, racionalnim, kompleksnim ili algebarski zadatim koeficijentima. U nastavku je dato par primjera korišćenja ove naredbe: > factor(x^4+3*x^3-6*x^2-8*x);
x ( x1 ) ( x2 ) ( x4 )
> factor((x^3-y^3)/(x^4-y^4));
x2x yy2 ( yx ) ( x2y2 )
> factor(x^3+2);
x 32
Funkcija koja ima suprotno dejstvo od funkcije factor je funkcija expand, koja razvija izraz, koji joj se prosljeđuje kao argument, u obliku sume proizvoda. Na primjer, ukoliko se funkciji proslijedi polinom u faktorizovanom obliku, onda će ona vratiti taj polinom u razvijenom obliku: > expand(x*(x+1)*(x-2)*(x+4));
x 43 x36 x 28 x
Druga korisna mogućnost funkcije expand je razvoj matematičkih funkcija, u koje spadaju sin, cos, tan, sinh, cosh, tanh, exp, ln itd. U nastavku je dato par primjera korišćenja ove naredbe: > expand(sin(x+y));
sin( x ) cos( y )cos( x ) sin( y )
> expand(cos(2*x));
2 cos( x ) 21
> expand(exp(a+ln(b)));
ea b
Funkcija normal se koristi za svođenje razlomaka na zajedničku razlomačku crtu uz eventualno pojednostavljivanje izraza kako je to urađeno u narednom primjeru: >normal(x^5/(x+1)+x^4/(x+1)); x^4 Naredba divide vraća tačno ako su dva polinoma od interesa djeljivi: > divide(x^4*y^2+x^3*y^2-x^2*y^2+13*x^2+13*x-13+y*x^2+x*y-y, x^2+x-1); true Naredba postavlja polinom u redosljed po opadajućim koeficijentima: > p1:=x^2+x^3-x+x^4; p1 : x 2 x 3 x x 4 247
> sort(p1); x 4 x3 x 2 x Ako polinom je zavisan od više promjenljivih može se naglasiti po kojoj promjenljivoj se vrši postavljanje u red: > sort(a^2*x^3+x^2+x+x*a+b,[a]); x3 a 2 xa a x 2 b Postoji mogućnost da se sortiranje vrši prvo po jednom promjenljivoj pa zatim po drugoj: > sort(a^2*x^3+x^2+x+x*a+b,[x,b]); a 2 x3 x 2 ax b a Uočili smo da je ln prirodni logaritam (kao u standardnoj matematici). Logaritam sa drugim osnovama dobija se naredbom log[b](x) gdje je b osnova logaritma. I funkcije ifactor, factor i expand podržavaju % kao argument, pri čemu se onda pozvana funkcija izvršava za poslednji izvršeni izraz. Vrijednost polinoma za određenu vrijednost argumenta se može izračunati korišćenjem naredbe eval. Sljedećih par primjera jasno ilustruju njeno korišćenje. > polinom:=x^3+3*x+2;
polinom := x33 x2
> eval(polinom, x=3);
38
> polinom:=x*y+3*z+2;
polinom := x y3 z2
> eval(polinom, [x=1,y=2,z=t]);
43 t
> e:=sin(x)/x;
e :=
sin( x ) x
> eval(e,x=0); Error, division by zero Poslednji primjer predstavlja dobar uvod za naredbu limit, koja određuje graničnu vrijednost od izraza koji joj se prosljeđuje kao argument. Najčešći oblik korišćenja ove naredbe je limit(f,x=a), gdje je f funkcija od koje se traži granična vrijednost, a x=a je tačka u kojoj se traži granična vrijednost. Na primjer: > e:=sin(x)/x;
e :=
sin( x ) x
> limit(e,x=0);
1
> limit((sin(x)-x)/(x^3),x=0);
-1 6
> limit(exp(x),x=-infinity);
0
Sledeća naredba koju ćemo obraditi je sum, u zapisu sum(izraz,argument), koja izračunava vrijednost sume čiji je opšti član definisan izrazom izraz, dok je argument promjenljiva po kojoj se vrši sumiranje. Ukoliko je zadat samo naziv argumenta onda je u pitanju neodređena suma, a ako su zadate i granice argumenta to je određena suma. U nastavku je dato par primjera korišćenja ove naredbe: > sum(k^2,k);
1 3 1 2 1 k k k 3 2 6
> sum((1+n)/(1+n^2), n=1..10);
2745615458 846523925
> sum((-1)^k/k^2,k=1..infinity);
1 2 12
Neodređena suma
f (k ) ima za rezultat funkciju g(k), takvu da je g(k+1)-g(k)=f(k) za svako k. Preporučuje se, a često je i neophodno, da
se i izraz i argument pišu unutar jednostrukih navodnika, da bi se izbegao eventualni uticaj ranije definisane vrijednosti argumenta na traženu sumu. Na primjer, pretpostavimo da je prije računanja vrijednosti sume iz prethodnog primjera promenljiva k uzela vrijednost 5: > k:=5;
k := 5
> sum((-1)^k/k^2,k=1..infinity); Error, (in sum) summation variable previously assigned, second argument evaluates to 5 = 1 .. infinity > sum('(-1)^k/k^2','k'=1..infinity); 248
1 2 12
Kao što vidimo, ovaj problem se prevazilazi upotrebom jednostrukih navodnika. Slična naredba naredbi sum je product, u zapisu product(izraz, argument), koja izračunava vrijednost proizvoda čiji je opšti član definisan izrazom izraz, dok je argument promjenljiva po kojoj se vrši množenje. Ukoliko je zadat samo naziv argumenta onda je u pitanju neodređen proizvod (sa sličnim pravilima kao kod sume), a ako su zadate i granice argumenta to je određen proizvod. U nastavku je dato par primjera korišćenja ove naredbe: > product(i,i=1..5);
120
> product(i^2/(i^2+1),i=1..5);
72 221
> product(k^2,k);
( k ) 2
Važi potpuno ista primjedba vezana za upotrebu jednostrukih navodnika u naredbi product kao u naredbi sum. Naredba koja vrši pojednostavljivanje izraza primjenom matematičkih pravila je simplify, u zapisu simplify(izraz), gde je izraz matematički izraz koji se pojednostavljuje i koji može biti algebarski, trigonometrijski ili stepeni izraz. Posmatrajmo nekoliko uobičajenih poziva ove naredbe: > simplify(cos(x)^5+sin(x)^4+2*cos(x)^2-2*sin(x)^2-cos(2*x));
cos( x ) 5cos( x ) 4
> simplify(exp(a+ln(b*exp(c))));
be
( ac )
> f := -1/3*x^5*y + x^4*y^2 + 1/3*x*y^3 + 1: simplify(f, {x^3 = x*y, y^2 = x+1});
1x4x 2x
Izuzetno korisna naredba je solve, u zapisu solve(izraz,argument), koja rješava izraz izraz (koji može biti matematički izraz, jednačina, nejednačina ili sistem jednačina) u zavisnosti od argumenta argument, ili više njih. U slučaju sistema jednačina jednačine se i nezavisno promjenljive navode u vitičastim zagradama {}. U nastavku je pokazano nekoliko najčešćih upotreba ove naredbe: > jed:=x^4-5*x^2+6*x-2=0;
jed := x 45 x 26 x20
> solve(jed,x);
1, 1, 3 1, 1 3
> solve(jed,{x});
{ x1 }, { x1 }, { x 3 1 }, { x1 3 }
> nejed:=2*x^2+4*x-5>0;
nejed := 02 x 24 x5
> solve(nejed,{x});
1 1 { x1 14 }, { 1 14 x } 2 2
> solve({x+y=3,x-a*y=1},{x,y});
{ x
3 a1 1 , y2 } 1a 1a
> solve({u+v+w=1,3*u+v=3,u-2*v-w=0},{u,v,w});
4 -2 3 { u , w , v } 5 5 5
Ukoliko je f(x) izraz zavisan od promjenljive x, onda je solve(f(x),x) ekvivalentno sa solve(f(x)=0,x): > f:=x^4-5*x^2+6*x-2;
f := x45 x 26 x2
> solve(f,{x});
{ x1 }, { x1 }, { x1 3 }, { x1 3 }
Sa naredbom solve može da postoji problem u slučaju da ona prikaže rješenja neke jednačinu u formi specijalnih funkcija. Npr. >solve(x^4+x+1=0,x); RootOf(_Z4_Z+1,index=1), RootOf(_Z4_Z+1,index=2), RootOf(_Z4_Z+1,index=3), RootOf(_Z4_Z+1,index=4) RootOf je MAPLE funkcija sa kojom MAPLE može da izvodi sve neophodne operacije (na primjer diferenciranje). Nažalost, korisnicima rezultat iskazan na ovaj način malo što znači pa je pogodno rješenje prikazati numerički a za to nam pomaže evalf(%). Alternativno rješenje u obliku realnih brojeva može se dobiti naredbom fsolve bez potrebe da postupno rješavamo da bi došli do numeričkog rješenja: > fsolve({x1+x2=5/6,2*x1+5*x2=7/8},{x1,x2}) {x1=1.0972222, x2=.2638888888} 249
Funkcija fsolve ima mnoge dodatne parametre i mogućnosti. Ako recimo želimo samo nekoliko rješenja neke jednačine onda željeni broj rješenja možemo specificirati putem maxsols, možemo da specificiramo region u kojem tražimo rješenje odnosno tačku oko koje tražimo rješenje. Primjeri ovih funkcionalnosti: > equ:=y^4-3*y^2-2*y+1=0: > fsolve(equ, y); 0.336532, 1.94039 > fsolve(equ, y, 'maxsols'=1); 0.336532 > fsolve(equ, y, {y=1..2}); 1.94039 Što se tiče diferencijalnog i integralnog računa, Maple takođe posjeduje određen broj korisnih naredbi. Naredba diff, u zapisu diff(funkcija,x1,x2,...,xn), traži parcijalni izvod funkcije funkcija po argumentima x1,x2,...,xn. Najčešća upotreba ove naredbe je u obliku diff(f(x),x), pri čemu se traži prvi izvod funkcije f(x) u zavisnosti od argumenta x. Navedimo par primjera: > diff(sin(x),x);
cos( x )
> diff(sin(x),y);
0
> diff(arcsin(a/x),x);
a
x2
1
a2 x2
Kada je n veće od 1, onda se diff poziva rekurzivno za svaki od argumenata. To znači da je diff(f(x,y),x,y); ekvivalentno pozivu diff(diff(f(x,y),x),y). Izvodi višeg reda se izračunavaju korišćenjem operatora $. To znači da se k-ti izvod funkcije f(x) u zavisnosti od argumenta x dobija naredbom diff(f(x),x$k). Drugi način da se to uradi je da se argument x navede k puta, tj. diff(f(x),x,x,...x). U nastavku je prikazana upotreba i jednog i drugog metoda za traženje trećeg izvoda funkcije sin(x). > diff(sin(x),x$3);
cos( x )
> diff(sin(x),x,x,x);
cos( x )
Pored funkcije diff() može se koristiti i operator D. Pretpostavimo da je definisana funkcija: >f:=x->x*exp(x); x f:=xxe >D(f); x x xe +xe Naredba int, u zapisu int(funkcija,argument), traži integral funkcije funkcija po argumentu argument. Ukoliko je zadat samo naziv argumenta onda je u pitanju neodređeni integral, a ako su zadate i granice argumenta to je određeni integral. Slijedi par primjera: > int(x-sin(x),x);
1 2 x cos( x ) 2
> int(sin(x),x=0..Pi);
2
> int(exp(-x^2),x=0..infinity);
1 2
Za rješavanje diferencijalnih jednačina koristi se funkcija dsolve. Pretpostavimo da želimo da riješimo jednačinu: y '' 2 y ' sin( x) prvo moramo da definišemo ovu jednačinu: >expr:=diff(y(x),x$2)-2*diff(y(x),x)=sin(x); d2 d y( x) 2 y ( x ) sin( x ) dx 2 dx
>dsolve(expr,y(x)); 1 2 1 y ( x ) sin( x) cos( x) e 2 x _ C1 _ C 2 5 5 2 _C1 i _C2 su konstante koje se pojavljuju u rješenju ove diferencijalne jednačine (jednačina je drugog reda pa postoje dvije konstante). Postoji mogućnost specificiranja graničnih uslova za diferencijalne jednačine. Pogledajmo sljedeći primjer neka je jednačina y '' 2 y ' sin( x) Neka su granični uslovi y(0)=1 i y’(0)=1. Jednačina se sada može riješiti putem dsolve na sljedeći način: >expr:=diff(y(x),x$2)-2*diff(y(x),x)=sin(x); d2 d y( x) 2 y ( x ) sin( x ) dx 2 dx
>init:=y(0)=1, Dy(0)=1; 250
y(0)=1, Dy(0)=1 >dsolve({expr, init}, y(x)); 1 2 3 y ( x ) sin( x ) cos( x) e2 x 5 5 5 U Maple-u se mogu rješavati parcijalne diferencijalne jednačine. Osnovna naredba za ovu namjenu je pdsolve: > PDE:=x*diff(f(x,y),y)-y*diff(f(x,y),x)=0; PDE : x f ( x, y ) y f ( x, y ) 0 x y > pdsolve(PDE); f(x,y)=_F1(x2+y2) Što se tiče grafičkog prikaza rezultata izuzetno je korisna naredba plot, u zapisu plot(funkcija,argument), koja crta funkciju funkcija na zadatom intervalu vrijednosti argumenta argument. Slijedi par primjera korišćenja ove naredbe: > plot(cos(x)+sin(x),x=0..Pi); > plot(sin(t),t); Korespodendni grafici su prikazani na slici 15.5.
Slika 15.5. Primjeri grafičkog prikaza putem naredbe plot u MAPLE-u. U poslednjem primjeru nismo definisali granice intervala nezavisno promjenljive t. U tom slučaju se uzimaju podrazumijevane granice t=10..10. Grafici funkcija tri promjenljive se prikazuju naredbom plot3d koja ima tri argumenta: funkciju koja se crta, granice po jednoj odnosno granice po drugoj koordinati: >plot3d(x*y,x=-10..10,y=-10..10); Na svaki crtež se mоže obaviti desni klik i po potrebi izvršiti eksportovanje u fajl u nekom pogodnom formatu. Ako želite da nacrtate funkciju (bilo jedne promjenljive bilo dvije promjenljive) prvo morate da zadate funkciju pa zatim da izvršite crtanje: >f:=(x,y)->x^3+y^4; >plot3d(f(x,y),x=-5..5,y=-5..5); Naredbe za grafički prikaz (crtanje) posjeduju mogućnosti da se na istom grafiku prikažu više od jedne linije te se mogu vršiti i podešavanja izgleda grafika. Na primjer: >plot([x^2,-x^2],x=-10..10,color=[blue,red]); Ovom naredbom se crtaju dvije linije (funkcije) od kojih se prva prikazuje plavom linijom dok se druga prikazuje crvenom. Neke naprednije opcije MAPLE-a vezane za grafiku su smještene u paket plots koji se (kao i ostali paketi) uključuje naredbom with (MAPLE daje mogućnost uključivanja pojedinih naredbi po potrebi kako ne bi usporavale sistem ako se ne koriste): >with(plots); >graph1:=plot(x^2,x=-10..10,color=blue); >graph2:=plot(-x^2,x=-10..10,color=blue); >display([graph1,graph2]); Način prikaza naredbi i pridruživanje vrijednosti rezultatu kod linija graph1 i graph2 je pogodan jer u formi rezultata vidimo parametre grafika koji nam mogu sugerisati način na koji se može vršiti dalje podešavanje dijagrama što ćemo mi izbjeći u daljem objašnjavanju. Veoma simpatična i moćna naredba iz istog paketa je animate. Ova naredba ima barem tri argumenta, funkciju, granice po jednoj promjenljivoj i granice po drugoj promjenljivoj koje će se koristiti prilikom animacije grafika. Na primjer: >animate(x^2-t*x+t,x=-5..5,t=-2..2); Najvjerovatnije grafik će imati uobičajeni oblik ali ako napravite desni klik na njega i odaberete opciju animate dobićete animirati prikaz funkcije koja je argument gdje pojedini frajmovi su dati za različite vrijednosti t. Broj frejmova možete zadati kao: >animate(x^2-t*x+t,x=-5..5,t=-2..2,frames=100); Animirati se mogu i funkcije 2 promjenljive uz korišćenje naredbe animate3d koja ima četiri argumenta (posljednji je parametar koji se odnosi na razlike u pojedinim frejmovima): >animate3d(x^2/t^2-t^2/(y^2+1),x=0..5,y=0..5,t=1..5,frames=100); Kada se želi isključiti paket to se radi naredbom unwith(x); gdje je x u ovom slučaju naziv paketa koji se isključuje. U svim primjerima do sad smo koristili operator dodijele :=, čime smo definisali određeni izraz i dodijelili ga promjenljivoj sa lijeve strane tog operatora. Pored ovog 251
zapisa, u čestoj upotrebi je i drugi zapis, zapis kojim se definiše funkcija (takođe je bio uveden u nekim primjerima). Posmatrajmo sljedeći primjer: > f:=x->2*x^2+3;
f := x2 x 23
Na ovaj način definišemo funkciju f(x), vrlo slično matematičkoj definiciji funkcije kao preslikavanja. Funkciju možemo pozivati i na sljedeće načine: > f(2);
11
> f(y-1);
2 ( y1 ) 23
> f(t^3);
2 t 63
Prethodni zapisi ne rezultuju ni u čem smislenom u slučaju korišćenja operatora dodijele :=, što jasno pokazuje sljedeća sekvenca naredbi: > f:=2*x^2+3;
f := 2 x 23
> f(2);
2 x( 2 ) 23
> f(y-1);
2 x( y1 )23
> f(t^3);
2
2 x( t 3 ) 3 Primjer definisanja funkcije dvije promjenljive g(x,y), i par njenih poziva, je dat u nastavku: > f:=x->2*x^2+3;
f := x2 x 23
> g:=(x,y)->f(x)+f(y);
g := ( x, y )f( x )f( y )
> g(x,y);
2 x 262 y 2
> g(2,4);
46
> g(2,t^2);
142 t 4
Razvoj u Taylorov red se obavlja naredbom taylor. Npr: > taylor(x-sin(x),x); 1 3 1 5 x x O( x 6 ) 6 120
Ako želite da specificirate red do kojega se vrši to se može uraditi kao taylor(x-sin(x),x,10); odnosno dodavanjem trećeg argumenta ove naredbe: > taylor(x-sin(x),x, 10); 1 3 1 5 1 1 x x x7 x 9 O ( x10 ) 6 120 5040 362880
Rješenja u obliku simboličkih izraza mogu se koristiti kao funkcije. Za to nam može poslužiti naredba unapply. Posmatrajmo rješavanje sledeće jednačine: > solution=solve(q^2-r*s+q/s-5,q);
1 1 1 4rs 3 20 s 2 1 1 1 4rs 3 20s 2 , 2 s 2 s Rješenja su očigledno funkcije dvije promjenljive. Uzećemo prvo od ova dva rješenja (solution[1] ovo je indeksiranje vektora a o tome će biti više riječi kasnije) i to ćemo proglasiti funkcijom dvije promjenljive: > f:=unapply(solution[1], r, s); solution :
1 1 1 4rs 3 20s 2 2 s Sada možemo zapisati: > f(x,y); f : (r , s )
1 1 1 4 xy 20 y 2 y > f(1, (1/2)^0.5); 1.784299805 3
2
252
Brisanje promjenljivih iz radnog prostora se vrši korišćenjem naredbe unassign: > a:=2;
a := 2
> a;
2
> unassign('a'); > a;
a
Kao što se vidi, ime promjenljive se navodi pod jednostrukim znacima navoda. Brisanje svih promjenljivih iz radnog prostora se vrši naredbom restart. Izvršavanje ove naredbe je praktično ekvivalentno restartovanju Maple-a. Rad sa kompleksnim brojevima u MAPLE-u se obavlja na sličan način kao i u MATLAB-u sa time da se koristi konstanta I za kompleksnu jedinicu: >(2+3*I)/(4+5*I); 7 22 I 41 41 Da bi se validno radilo sa vektorima i matrica te sa ostalim karakteristikama linearne algebre preporučuje se uključivanje linalg paketa: >with(linalg); Vektor se može zadati na više načina: > a:=vector([1, 2, 3, 4,5]); [1, 2, 3, 4, 5] Druga varijanta > b:=vector(4); formira vektor sa četiri nespecificirana člana: array(1..4, []) Indeksiranje elemenata vektora je na uobičajeni način: > a[2]; 2 MAPLE ipak ima mnogo posredniji pristup vektorima i matricama u odnosu na MATLAB gdje su matrice osnovni tipovi podataka. Najveći broj operacija nad vektorom provodi se primjenom naredbom evalm. Forme ove naredbe su evalm(c*v); gdje je c skalar a v je vektor za množenje vektora skalarom odnosno evalm(v1 ± v2); za sabiranje ili oduzimanje dva vektora iste dužine. Skalarni proizvod za vektore iste dužine se dobija sa dotprod(v1, v2); dok se vektorski proizvod za vektore dužine tri dobija naredbom crossprod(v1, v2);. > v1:=vector([1, 3 2]); [1 3 2] > v2:=vector([-4, -2 , -1]); [-4 -2 -1] > evalm(2*v1); [2 6 4] > evalm(-3*v2); [12 6 3] >evalm(v1-v2); [5 5 3] > evalm(v1+v2); [-3 -2 1] > dotprod(v1,v2); -12 >crossprod(v1,v2); [1 -7 10] Matrica se u MAPLE-u defiše narednom matrix sa time da joj moraju biti specificirane dimenzije i da se matrice ovdje pune vrstu po vrstu a ne kolonu po kolonu kao u MATLAB-u. Npr. (zapamtite da je i matrica definisana u paketu linalg): > A:=matrix(2,2,[1, 3, 5, 4]); 1 3 5 4
Matrici se mogu definisati dimenzije i na sljedeći način: > A:=matrix([[1,3],[5,4]]); 1 3 5 4
Znači u ovom slučaju su dimenzije matrice zadate implicitno jer su specificirane njene dimenzije na osnovu dužina vektora u pojedinim vrstama. Naredba swaprow vrši zamjenu dva reda matrice (postoji slična naredba swapcol, ovdje ćemo raditi samo naredbe za redove ali zapamtite da postoje pandani za kolone). Na primjer: > swaprow(A, 1, 2); 5 4 1 3
Naredba delrows(A, i..j); briše redove od i-tog do j-tog. Primjer: 253
> A:=matrix(3,3, [1, 1, 1, 2, 2, 2, 3, 3, 3]); 1 1 1 2 2 2 3 3 3
> delrows(A,1..2);
3
3 3
Naredba addrow(A,r1,r2,m); je blago dosta neobična. Kod nje se r1-red matrice mijenja sa m*A(r1,:)+A(r2,:) (ovdje smo iskoristili MATLAB notaciju). Posmatrajmo sljedeći primjer: >A2:=addrow(A,1,2,-2); 1 1 1 0 0 0 3 3 3
Inverzna matrica se dobija naredbom inverse(A);, transponovana je transpose(A);, determinanta det(A) dok je množenje matrice skalarom evalm(c*A);: > A:=matrix(2,2,[1,3,5,6]); 1 3 5 6
> inverse(A); 2 3 5 9
1 3 1 9
> det(A); -9 > transpose(A); 1 5 3 6
> evalm(2*A); 2 6 10 12
Naredba za množenjem matrica je multiply(A, B); (pravila o dimenzijama moraju se poštovati), dok se za sabiranje i oduzimanje matrica koristi naredba evalm: > A:=matrix(2, 2, [1, 2, 3, 4]); 1 2 3 4
> v:=vector(2, [1, 1]); [1 1] > multiply(A,v); [3 7] >B:=matrix(2,2,[-1,-2,-3,-4); 1 2 3 4
>evalm(A+B); 0 0 0 0
>evalm(A-B); 2 4 6 8
> multiply(A, B); 7 10 15 22
U paketu linalg postoji nekoliko funkcija za određivanje sopstvenih vektora i sopstvenih vrijednosti. Funkcija eigenvalues(A); daje sopstvene vrijednosti matrice A: > A:=matrix(3,3,[2,3,4,5,6,7,8, 7, 6); 2 3 4 5 6 7 8 7 6
> v:=eigenvalues(A); 0, 7 85, 7 85
Ako želimo da sračunamo sopstvene vektore koristimo naredbu eigenvectors(A);. Posmatrajmo primjer: > A:=matrix(2,2,[2, 3, 4, 5]); 254
2 3 4 5
> V:=eigenvectors(A); 7 1 57,1, 1 2 2 1
1 1 7 1 57 , 57,1, 2 6 2 2
1 1 57 2 6
Ova naredba daje kao rezultat uređene trojke kojih ima onoliko koliko je dimenzija matrice. Prvi element u trojki je sopstvena vrijednost, drugi je algebarski multiplicitet (nećemo objašnjavati) a treći elemenat je sopstveni vektor koji odgovara sopstvenoj vrijednosti tako su redom prva sopstvena vrijednosti i sopstveni vektor pa zatim druga sopstvena vrijednost i sopstveni vektor dobijeni sljedećim naredbama: > V[1][1]; 7 1 57 2 2
> V[1][3]; 1
1 1 57 2 6
> V[2][1]; 7 1 57 2 2
> V[2][3]; 1
1 1 57 2 6
Sistemi linearnih jednačina se mogu rješavati na različite načine. Jedan način je da se sračuna inverzna matrica matrice sistema pa da se dobijeno rješenje pomnoži sa vektorom slobodnih članova. Ovaj pristup je obično nešto sporiji pa se preporučuje primjena naredbe linsolve koja se može javiti u različitim oblicima. > A:=matrix([[1,2],[1,3]]): > b:=vector([1,-2]): > linsolve(A,b); [7, -3] > B:=matrix([[1,1],[-2,1]]): > linsolve(A, B); 7 1 3 0 Dobijena matrica u ovom slučaju predstavlja rješenje linearne jednačine: AX=B. Jedna veoma interesantna naredba u Maple-u je convert. Ovom naredbom se prvi argument konvertuje u skladu sa pravilima koja su specificiranam drugim argumentom a ostali argumenti mogu biti pomoćni. Za potpuni opis ove naredbe preporučujem vam da konsultujete dokumentaciju. Ovdje ćemo dati samo neke primjere. Prvi primjer predstavlja konverziju dekadnog u binarni broj: > convert(9, binary); 1001 Sljedeća varijanta koja specificira da se argument sumira: > convert([1, 2, 3, 4],`+`); 10 Sada ćemo formirati niz polinoma putem naredbe seq a zatim ćemo odrediti proizvod tih polinoma: > f:=seq(x[i]^i, i=1..4); f : x1 , x2 2 , x33 , x4 4 > convert([f], `*`); x1 x2 2 x33 x4 4 U prethodne dvije varijante naredbe obratite pažnju na oblik apostrofa! Sljedeća forma ove naredbe konvertuje decimalni broj u razlomak: > convert(1.23456, fraction); 3835 3152 Uzmimo sada količnik dva polinoma i pretvorimo ga u sumu racionalnih razlomaka prvog reda: > f:=(x^3+x)/(x^2-1); x3 x f : 2 x 1 > convert(f, parfrac,x); 1 1 x x 1 x 1 Kod naredbe taylor imali smo element koji predstavlja ostatak nekog reda. Postoji mogućnost da se naredbom convert sa drugim agumentom polynom forsira izostavljanje ovog ostatka: > s:=taylor(x-sin(x),x); 255
1 3 1 5 x x O( x 6 ) 6 120 > convert(s, polynom); 1 3 1 5 x x 6 120 Drugi argument exp forsira prikazivanje u obliku exp funkcije što je veoma pogodno kod hiperbolnih i trigonometrijskih funkcija: > f:=sinh(x)+sin(x); f:=sinh(x)+sin(x) > convert(f, exp); 1 x 1 x 1 ( Ix ) 1 e e I e ( Ix ) 2 2 2 e Već u okviru Matlabovog simboličkog alata upoznali smo se sa Maple-ovom mogućnošću da se pretpostavke o promjenljivoj ugrade u realizaciju operacija. U samom Maple-u ove funkcije su usavršene pa ćemo sa dijelom postavljanja pretpostavki ovdje upoznati. > assume(a>0); > signum(a); 1 Ako se promjenljiva za koju postoji pretpostavka javlja u izrazu biće označena karakterom ~ (tilda): > sqrt(a^2); a~ Informacija o promjenljivoj se može dobiti sa about(a) gdje ćemo dobiti informaciju o uvedenim pretpostavkama: > about(a); Originally x, renamed x~: is assumed to be: RealRange(-infinity,Open(0)) Pretpostavke mogu biti složenije evo nekih primjera: > assume(x>0, x assume(15 assume(x,nonnegint); Kada se želi prekinuti sa pretpostavkama koristi se naredba unassign koju smo već upoznali: > unassign('x','y'); Na kraju materijala uradimo jedan primjer, koji obuhvata dobar dio prethodno izloženih naredbi. s :
2
Primjer 15.2.1 Definisati funkciju f ( x) xe x , nacrtati njen grafik u intervalu nezavisno promjenljive x[-5,5], odrediti prvi i drugi izvod funkcije, pronaći nule drugog izvoda (prevojne tačke), kao i vrijednost drugog izvoda za x=1. Nakon toga odrediti integral funkcije g ( x ) f ( x ) arctan( x ) u granicama od 0 do 1. Rješenje: > f:=x->x*exp(-x^2);
f := xx e
2 ( x )
> plot(f(x),x=-5..5); Na slici 15.6 prikazana je navedena funkcija.
2
Slika 15.6. Funkcija f ( x) xe x prikazana u Maple-u. > izvod1:=x->diff(f(x),x);
izvod1 := xdiff( f( x ), x )
> izvod1(x);
e
2 ( x )
2 x2 e
2 ( x )
256
> izvod2:=x->diff(f(x),x$2);
izvod2 := x
2 f( x ) x 2
> izvod2(x);
6 x e
2 ( x )
4 x3 e
2 ( x )
> prevoji:=solve(izvod2(x)=0,{x});
1 1 prevoji := { x0 }, { x 6 }, { x 6} 2 2
> vrijed:=eval(izvod2(x),x=1);
vrijed := 2 e
( -1 )
> g:=x->f(x)+arctan(x);
g := xf( x )arctan( x )
> g(x);
xe
2 ( x )
arctan( x )
> vr_int:=int(g(x),x=0..1);
1 ( -1 ) 1 1 1 vr_int := e ln( 2 ) 2 2 4 2
> evalf(vr_int);
.7548848526
MAPLE (kao i većina drugih matematičkih softverskih paketa) nije alat koji je prevashodno namijenjen programiranju koje zahtjeva korišćenje složenih sekvenci selekcija i ciklusa. Međutim, navedeni koncepti su neophodnost svakog matematičkog softverskog alata tako da smo prinuđeni da ih upoznamo makar rudimentarno u MAPLE-u. Sintaksa if selekcije podsjeća dobrim dijelom na programski jezik Pascal: if uslov then iskaz fi; Napominjemo da su if, then i fi ključne riječi. Složenija selekcija se dobija sa: if uslov_A then do iskaz1; iskaz2; od; elif uslov_B then do iskaz3; od; elif uslov_C then do iskaz4; od; else do iskaz5; iskaz6; od; fi; do, od, then i fi su sve ključne riječi. Najsloženiji oblik brojačkog ciklusa u MAPLE-u je: for i from 1 to 1000 by 2 while (x < 100000) do iskaz1; iskaz2; od; Jednostavniji oblici ove naredbe su: for i to 1000 do iskaz1; iskaz2; od; 5 Posmatrajmo primjer određivanja nule funkcije f(x)=x -3x+1 sa početnom tačkom x0=1 putem Newtonove metode (ovo je čisto ilustracija korišćenja kontrole toka programa): f := x -> x^5 - 3*x + 1; f1 := x -> 5*x^4 - 3; x0 := 1.0; for i from 1 to 100 while ( abs(f(x0)) > 0.000001) do x0 := x0 - f(x0)/f1(x0); od; x0; 257
f(x0); Sami za vježbu protumačite navedeni primjer. Sa ovim bismo zaokružili materijal vezan za aplikaciju Maple. Naravno, Maple pruža mnogo više od ovdje izloženog. Nadamo se da izloženi materijal predstavlja dobar uvod a studentu ostaje da se sam upusti u napredne mogućnosti ovog programa.
15.3. MATHEMATICA 4.0 Prilikom startovanja matematičkog paketa Mathematica otvara se prozor kao na slici 15.7.
Slika 15.7. Prozor Mathematica. Da bi se unijele naredbe, potrebno je kliknuti u prozor, a zatim kucati potpuno isto kao u bilo kom tekst procesoru. Pošto se unese operacija prozor izgleda kao na slici 15.8. Da bi se izvršila operacija porebno je pritisnuti Shift+Enter. Kada je završeno izvršavanje operacije, na ekranu se pojavljuje rezultat kao na slici 15.9. Moguće je ponavljati ovaj postupak za svaku novu naredbu na slici 15.10.
Slika 15.8. Unošenje iskaza u MATHEMATIC-a.
Slika 15.9. Izvršavanje iskaza.
Slika 15.10. Izvršavanje više iskaza.
15.3.1 SINTAKSA U Mathematica programskom paketu operacije se izvršavaju unošenjem naziva funkcija i njihovih argumenata, što se naziva puna forma zapisa. Npr. operacija sabiranje se piše kao: 5 Drugi način zapisa bi bio: 5 I složenije funkcije se mogu na sličan način predstaviti. Množenje 7 sa 2+3 se može napisati kao: 35 ili 35 Primijetimo da se razmak tumači kao operacija množenja. Tako se 7 5 tumači kao množenje 7 i 5 (7*5), dok 75 bez razmaka označava broj 75. U najvećem broju slučajeva prilikom unosa se kombinuje puna i skraćena forma.
15.3.2 OSNOVNE FUNKCIJE 258
Funkcije u Mathematica-i obično počinju velikim slovima dok su ostale razlike sa drugim programskim alatima minorne. Osnovne funkcije: Abs[x], Exp[x], Log[x], Log[b,x] (ovo je logaritam sa osnovom b), Sin[x], Cos[x], Tan[x], Sqrt[x], Round[x], Random[] (pseudoslučajni broj na intervalu 0 do 1), Min[x,y,…], Max[x,y,…] (minimum i maksimum liste argumenata), FactorInteger[x] (faktorizacija po prostim brojevima), IntegerPart[x] (cjelobrojni dio), FractionalPart[x] (necjelobrojni dio), Mod[n,k] (ostatak pri dijeljenju), n! (faktorjel), Binomial[n,m] (binomni koeficijenti n!/(k!(n-k)!), Pi (Ludolfov broj), E (Ojlerov broj), Degree (stepen ugla /180), Infinity (beskonačno), … Pored osnovnih funkcija postoje i mnoge napredne koje se mogu uključiti putem paketa. Na primjer paket koji posjeduje niz funkcija za rad sa hemijskim elementima: {-1,1}] ParametricPlot[{t^2,t^3-2t},{t,-2,2}] ParametricPlot[{2(t-Sin[t]),2(1-Cos[t])},{t,-4Pi,4Pi}] ParametricPlot[{2(t-Sin[t]),2(1-Cos[t])},{t,0,2Pi}] Poslednji grafik se naziva cikloidom. Postoji mogućnost da na jednom grafiku prikažemo više parametarskih funkcija kao u sljedećem primjeru gdje su pored krive prikazane i njene tangente: ParametricPlot[{{t^2,t^3-2t},{t,Sqrt[3](t-3)},{t,-Sqrt[3](t-3)}},{t,-5,5},PlotRange->{-5,5}]
15.3.11 POLARNE KRIVE Naredba za crtanje polarnih krivih je PolarPlot: PolarPlot[1,{t,0,2Pi}] Ovom se naredbom se crta kružnica sa jediničnim poluprečnikom. Polarni crteži ne mogu se prikazati u granicama kao što su –Inf do Inf ali mogu u granicama koje su uže od [0,2Pi]: PolarPlot[1,{t,0,Pi}] PolarPlot[1,{t,-Pi/4,Pi/4}] PolarPlot[1,{t,-2Pi,2Pi}] PolarPlot[Cos[t],{t,0,2Pi}] PolarPlot[Sin[t],{t,0,2Pi}] PolarPlot[1+Cos[t],{t,0,2Pi}] PolarPlot[1+Sin[t],{t,0,2Pi}] PolarPlot[Cos[2t],{t,0,2Pi}] PolarPlot[Cos[3t],{t,0,2Pi}] PolarPlot[Cos[4t],{t,0,2Pi}] PolarPlot[Cos[5t],{t,0,2Pi}]
15.3.12 INTEGRALI Integrali se računaju korišćenjem naredbe NIntegrate. Argumenti naredbe NIntegrate su funkcija čije rješenje tražimo (npr. Exp[x]) i lista koja daje promjenljivu po kojoj se rješava i granice integrala (npr. {x, 0, 1})
Za granice je moguće postaviti i beskonačnu vrijednost. Npr.
263
15.3.13 SIMBOLIČKI RAČUN - POLINOMI Dvije osnovne operacije sa polinomima su Factor i Expand. Naredbom Factor faktorizujemo polinom, dok naredbom Expand iz faktorizovanog prelazimo nazad u razvijeni oblik. Npr. za polinom [x^2 + 3xy +2y^2] naredbama Factor i Expand dobijamo:
Dvije osnovne operacije sa racionalnim funkcijama su Together i Apart. Naredbom Together racionalnu funkciju predstavljamo kao sumu sa zajedničkim brojiocem, dok naredbom Expand vršimo frakcionu dekompoziciju. Npr. za funkciju 1/(x+y) + 1/(2x+y) + 1/(3x+y) Together i Apart dobijamo:
Nabrojimo ovdje neke od naredbi koje se koriste kod pojednostavljivanja izraza: ExpandAll[izraz] (razvija kompletan izraz a ne samo stepene i proizvode), Cancel[izraz] (dijeli imenilac i brojilac sa zajedničkim djelicioma), Collect[izraz,x] (faktorisanje po stepenima x), FactorTerms[izraz, x] (izbacuje članove koji ne zavise od x), TrigExpand[izraz] (razvija trigonometrijske funkcije unutar izraza), TrigFactor[izraz] (vrši faktorisanje trigonometrijskih izraza), TrigToExp[izraz] (trigonometrijske izraze prikazuje u obliku eksponencijalnih izraza), ExpToTrig[izraz] (obrnuta konverzija eksponencijalnih funkcija u trigonometrijske), Coefficient[izraz, oblik] (daje vrijednost člana uz neki eksponent u izrazu), Exponent[izraz, oblik] (maksimalni stepen datog oblika u izrazu), Part[izraz, n] isto što izraz[[n]], Numerator[izraz], Denominator[izraz] (brojilac i imenilac izraza), Short[izraz, n] (kod veoma velikih izraza vrši prikazivanje prvih n redova veoma dugačkih izraza).
15.3.14 RJEŠENJA POLINOMA Za rješavanje jednačina u simboličkom obliku se koristi naredba Solve. Npr. rješenja jednačine x^2 – 2 = = 0 se mogu dobiti na sljedeći način:
Rješenje u obliku 2 se naziva radikal. Međutim, nekada nije moguće predstaviti rješenja u obliku radikala. Npr. rješenja jednačine x^5 – x + 1 = = 0 se predstavljaju na sljedeći način:
Numeričke vrijednosti rješenja se dobijaju funkcijom N
15.3.15 ALGEBARSKE FUNKCIJE Osnovna naredba za rješavanje algebarskih funkcija je Solve. Prvi argument predstavlja lista jednačina, a drugi lista promjenljivih. Npr. rješenja jednačina x(x+z) = c i z - 2 = 0 se mogu dobiti na sljedeći način:
Rješenja linearnih jednačina c11x + c12y = b1 i c21x + c22y = b2 se mogu dobiti na sljedeći način:
264
Funkcija Eliminate radi slično naredbi Solve ali sa ciljem da iz skupa jednačina eliminiše pojavu neke (ili nekih promjenljivih). Ako se u procesu eliminacije dobija rješenje ono će biti prikazano a u suprotnom biće prikazan simplifikovan sistem jednačina pojednostavljen u smislu redukcije navedenih promjenljivih. Sintaksa ove funkcije je: Eliminate[{sistem jednačina}, {promjenljive koje se eliminišu}] Slična je naredba Reduce (ima isti set argumenata) koja daje samo pojednostavljeni skup jednačina (eventualno rješenja) po promjenljivima koje su drugi argument ove funkcije (drugi argument su promjenljive po kojima se sistem rješava a ne promjenljive koje treba eliminisat).
15.3.16 INTEGRALI I DIFERENCIJALI Integrali se računaju korišćenjem naredbe Integrate. Argumenti naredbe Integrate su funkcija čije rješenje tražimo (npr. Exp[x]) i promjenljiva po kojoj se vrši integraljenje:
Diferencijal (izvod) dobija se naredbom D:
4
3
2
Uradimo sledeći primjer. Uzmimo funkciju f(x)=x -3x +2x -x na intervalu [0,2]. Odredimo joj minimum i maksimum u navedenom intervalu. Odredimo nule prvog izvoda: Solve[D[x^4-3x^3+3x^2-4,x]==0] {{x->1/4},{x->1},{x->1}} Potencijalni globalni minimumi i i maksimumi su tačke x=1/4 i x=1. Odredimo sada drugi izvod u navedenim tačkama: D[x^4-3x^3+3x^2-4,x,x] 6-18x+12x2 Formirajmo sada funkciju: f[x_]:=6-18x+12x^2 f[1/4] 9/4 f[1] 0 Iz predmetnog se može zaključiti da je 1/4 maksimum dok je x=1 prevojna tačka odnosno da nije ni minimum ni maksimum navedene funkcije.
15.3.17 SUME I PROIZVODI Sumiranje se u Matemathica primjenjuje sa Sum[izraz, {i, imin, imax}] čime se vrši sumiranje izraza po promjenljivoj i od imin do imax. Iterator sa kojim se prolazi kroz izraze ne mora da uzima ekskluzivno cjelobrojne vrijednosti već može biti bilo koji necjelobrojni increment di: Sum[izraz, {i, imin, imax, di}]. Ista naredba može biti upotrijebljena za iteriranje kroz više od jedne promjenljive Sum[izraz, {i, imin, imax, di}, {j, jmin, jmax, dj}]. Ova posljednja naredba zapravo predstavlja dvostruku sumu po dvije promjenljive i i j. Na veoma sličan način radi funkcija Product koja se odnosi na računanje proizvoda izraza. Posmatrajmo sljedeći primjer: Sum[(1/2)^i,{i,1,n}] 2-n(1+2n) Sum[(1/2)^i,{i,1,Infinity}] 1
15.3.18 KOMPLEKSNI BROJEVI U MATHEMATICA-I Konstanta I (veliko slovo) predstavlja kompleksnu jedinicu: Sqrt[-1] I Kompleksni brojevi se mogu zadati na uobičajeni način i podliježu svim operacijama koje su definisane u MATLAB-u: a=2+3I Conjugate[a] 2-3I Čudna stvar koja se u Mathematica-i dešava je sljedeća: Conjugate[x + y I] Conjugate[x + I y] Ovo očigledno nije informativan i željeni rezultat ali je potpuno tačan jer nismo saopštili softveru da su x i y realni brojevi (što smo mi na neki način pretpostavili). Ako želite da promjenljive u kompleksnim izrazima tretirate kao realne onda koristiti naredbu ComplexExpand: ComplexExpand[ Conjugate[x + y I] ] x-Iy
265
15.3.19 REDOVI I LIMESI Funkcija putem koje se vrši razvoj neke funkcije u red je: Series[f, {x, x0, red}] Ovim se obavlja razvoj funkcije f, po promjenljivoj x, u okolini tačke x0 do reda red. U ovom izrazu se pojavljuje ostatak koji se može izbjeći tako što se na rezultat funkcije primjeni funkcija Normal.
15.3.20 GRAFICI Najednostavniji dvodimenzionalni grafik se dobija naredbom Plot. Npr. grafik funkcije sin(x) u intervalu 0 do 6 dobijamo sljedećom naredbom: Funkcija je prikazana na slici 15.13.
Slika 15.13. Grafički prikaz slika Sin[x]. Sa naredbom PlotRange mijenjamo interval na ordinati na kojoj prikazujemo funkciju (slika 15.14):
Slika 15.14. Grafički prikaz funkcije Sin[x] u osama podešenim sa PlotRange. Logaritamske grafike dobijamo naredbom LogPlot: Prikazana na slici 15.15. Slične namjene su i funkcije LogLogPlot[] i LogLinearPlot[]. Sami ispitajte njihovo funkcionisanje. Na istom grafiku se može vizuelizirati više od jednog crteža. Na primjer: splot = Plot[ Sin[x], {x, 0, 2 Pi} ] cplot = Plot[ Cos[x], {x, 0, 2 Pi} ] Show[splot, cplot] Prilikom crtanja grafika moguće im je istovremeno postaviti granice kao na primjer: splot = Plot[ Sin[x], {x, 0, 2 Pi} ] cplot = Plot[ Cos[x], {x, 0, 2 Pi} ] tplot = Plot[ Tan[x], {x, 0, 2 Pi} ]
266
Slika 15.15. Slika u logaritamskoj skali. Show[splot, cplot, tplot, PlotRange -> { {0, 10}, {-10, 10} }] Modifikator PlotRange se pojavljuje u sljedećem obliku: PlotRange -> { { , }, { , } } Primjer dvije funkcije na istom dijagramu: Plot[{(1-x)/(1+x),x+1/9},{x,-5,5},PlotRange->{-4,4}] Trodimenzionalne grafike dobijamo naredbom Plot3D. Npr. grafik funkcije xcos(x) u intervalu -1 do 1 po x-osi i 0 do 2 po y-osi dobijamo sljedećom naredbom (slika 15.16):
Slika 15.16. 3D grafik. Uporedite sljedeća dva crteža: Plot3D[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2} ] Plot3D[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2}, PlotRange -> {0, 2} ] PlotRange se može podešavati i na sljedeći način: Plot3D[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2} ] Show[ %, PlotRange -> {{0, 1}, {0, 1}, {0, 2}} ] Osobina PlotPoints definiše "finoću" mreže koja se koristi za iscrtavanje Plot3D[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2}, PlotPoints-> 30 ] Show[ %, PlotRange -> {{0, 1}, {0, 1}, {0, 2}} ] Konturni crtežu u Mathematica-i dobijaju se funkcijom ContourPlot. Tako se funkcija Exp[-(x^2 + 3 y^2)] u zoni oko koordinantnog početka prikazuje kao ContourPlot[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2} ] Kod ove naredbe mogu se primjeniti svi modifikatore koje smo već sreli kod naredbe Plot3D. ContourPlot[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2}, PlotPoints -> 30 ] Crtež sa više tačaka je blaži i izgleda realističnije. Za eliminisanje nijansi sivog koje mogu da izgledaju loše na grafiku možemo upotrijebiti: ContourPlot[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2}, PlotPoints -> 30, ContourShading -> False ] Izolinije istih vrijednosti na konturnom crtežu podešavaju se sa: ContourPlot[ Exp[-(x^2 + 3 y^2)], {x, -2, 2}, {y, -2, 2}, 267
PlotPoints -> 30, ContourShading -> False, Contours -> {0.2, 0.4, 0.6, 0.8}, PlotRange -> {0, 2} ] Parametarske funkcije se mogu crtati funkcijom ParametricPlot[{fx, fy}, {t, tmin, tmax}]. Ovdje fx i fy predstavljaju funkcionalni zapis koji zavisi od parametra t u granicama [tmin, tmax]. Slično se može kreirati i parametarski crtež u 3D sa tom razlikom da ovdje koordinate zavise od dva parametra (u našem primjeru nazivaju se t i u): ParametricPlot3D[{fx, fy, fx}, {t, tmin, tmax}]. Na primjer sljedeći crtež nam prikazuje torus: ParametricPlot3D[{Cos[t] (3+Cos[u]), Sin[t] (3+Cos[u]), Sin[u]}, {t, 0, 2Pi}, {u, 0, 2Pi}] U slučaju da neka od navedenih naredbi ne radi prethodno treba uključiti paket sa dodatnim grafičkim mogućnostima: A=[1 3 4;1 0 -1;2 5 4] A = 1. 3. 4. 1. 0. - 1. 2. 5. 4. -->max(A) ans = 5. Kao što vidimo naredba max(A) u SciLab-u daje kao rezultat maksimum čitave matrice a ne maksimum pojedinih njenih kolona. Za svaki slučaj ako imate kod napisan u MATLAB-u možete ga uvijek izvršiti u SciLab-u (ili gotovo uvijek u zavisnosti od toga koje toolbox-ove koristiti) putem opcije Applications/MATLAB to ScieLab Conversion tool koja je prikazana na slici 16.8.
Slika 16.8. Alat za konverziju MATLAB fajlova u SciLab. 275
Ako se želi postići ista funkcionalnost kod ove (kao i kod drugih sličnih naredbi) kao u MATLAB-u koristićemo opciju: -->max(A,’c’) čime se operacija vrši po kolonama dok ako je drugi argument ’r’ operacija se vrši po redovima. U daljem tekstu dajemo kratak pregled nekih bitnijih razlika između SciLab-a i MATLAB-a. Suštinski jedina bitna razlika koja se brzo uočava između MATLAB-a i SciLab-a je činjenica da je u SciLab-u statistike se ne primjenjuju po kolonama matrice već se sve naredbe odnose na čitavu matricu. Druga bitna izmjena je da funkcije se u SciLab-u grupišu u fajlovima a da nazivi ovih fajlova ne moraju biti vezani za naziv funkcije. Na ovaj način se kontroliše broj fajlova koji se kreiraju u okviru ovog alata što je kod MATLAB-a bio enorman problem sa rastom ovog programskog alata. Organizacija funkcija u Scilab-u je u nekoliko drugačija nego u MATLAB-u. Poznato je pravilo da svaka funkcija u MATLAB-u (ili skoro svaka) je smještena u jedan .m fajl. Naziv funkcije mora da korespondira nazivu fajla. Ovakav način rada nosi i značajne nedostatke. Naime, ovako se na disku formira veliki broj malih tekstualnih fajlova. Fajl sistemi su takvi da alociraju određenu minimalnu memoriju za smještaj fajlova a mali tekstualni fajlovi su daleko ispod toga kapaciteta pa stoga se značajni smještajni kapaciteti ne koriste na racionalan način. Ovo kod današnjih desktop ili laptop računara nije veliki problem ali može biti ograničavajući faktor tamo gdje je memorija za smještaj podataka oskudna. Drugi problem ovakve realizacije je potreba da se po putanji traže ovakvi fajlovi što može da traje određeno (znatno) vrijeme tokom kojega se ispituje veliki broj fajlova sa kojima naš program nema nikakvu vezu. Dakle, pretraga se po putanji na hard disku može vršiti za desetine hiljada fajlova a da aktuelna potreba postoji samo za nekoliko. Stoga je SciLab uradio to na klasičniji programerski način. Više funkcija se smjesti u isti fajl sa ekstenzijom .sci (npr. fajl.sci) a zatim taj konkretni fajl sa nekoliko funkcija koje su nam potrebne učita sa: -->getf("fajl.sci") čime sve funkcije iz fajla postoju dostupne za korišćenje u našem programu. Ovakav način organizovanja fajlova u SciLab-u donosi i određeni gubitak komfora. Naime, ne mogu se programi (script fajlovi) izvršavati navođenjem njihovih ime a već se mora koristiti naredba exec: -->exec(“skriptfajl”) Komentari u SciLab-u su kao u C++-u //. Ugrađene promjenljive u SciLab-u kao što su i, j i inf moraju biti sa % kao prefiksnom %i, %j i %inf. Stringovi u SciLab-u se tretiraju kao promljenive posebnog tipa a ne kao u MATLAB-u nizovi karaktera. Ako posjedujemo niz stringova u SciLab-u svaki može imati različitu dužinu. Posmatrajmo definisanje matrice sa tri stringa nejednake dužine u SciLab-u: --> a(1)="Marko" a = Marko --> a(2)="Pero"; --> a(3)=Nikola; Undefined variable: Nikola --> a(3)="Nikola"; --> a a = !Marko ! ! ! !Pero ! ! ! !Nikola ! --> a(2) ans = Pero --> a(1,:)='Marko' a= Marko --> a(2,:)='Pero' Drugi metod u MATLAB-u ne bi radio jer su dužine stringova različite dok u SciLab-u funkcioniše bez problema. Dakle, kao što vidimo stringovi se tretiraju kao matrice stringova gdje svaki član ima svoju dužinu. Vrijednosti logičkih izraza i logičke promjenljive u MATLAB-u su 0 i 1 dok su u SciLab-u logičke konstante %T i %F (true i false – tačno i netačno). MATLAB radi sa polinomima kao sa nizovima. Ovakav rad nije moguć u SciLab-u. Naredba kojom se kreira polinom u SciLab-u je poly. Naredba ima tri argumenta gdje se treći može izostaviti (podrazumijevano je string “roots“. Prvi argument ove naredbe je vektor koji predstavlja ili koeficijente polinoma ili korjene polinoma (zavisno od trećeg argumenta). Posmatrajmo primjere: --> z=poly([2 1 3],'x',"coeff") z = 2 2 +x +3x 276
--> z1=poly([2 1 3],'x',"roots") z1 = 2 3 -6 +11x -6x +x --> z2=poly([2 1 3],'y') z2 = 2 3 -6 +11y -6y +y Prvom naredbom se formira vektor sa navedenim koeficijentima po redu od najmanjeg stepena u listi koeficijenata. Drugi argument je promjenljiva po kojoj je polinom formiramo (u prvoj naredbi je to x). U drugoj naredbi dobija se polinom sa nulama (jer je treći argument “roots”). Treća naredbe formira polinom po promljenljivoj y a kako je treći argument izostavlja i podrazumijeva se da je “roots”. Naredbe plot i plot3d u MATLAB-u i SciLab-u su veoma slične. Posmatrajmo sledeća dva primjera. --> x=linspace(0,1,50); --> y=x^2; --> plot(x,y) --> z=sqrt(x); --> plot3d(x,y,z) Rezultati sa grafičkim prikazima koji su slični onima iz MATLAB-a prikazano je na slikama 16.9 i 16.10.
Slika 16.9. Izgled plot dijagrama u SciLab-u.
Slika 16.10. Izgled plot3d dijagrama u SciLab-u. 2 2 Posmatrajmo sada kako se može da iskoristimo SciLab naredbe da prikažemo konturni dijagram f(x,y)=x +y za x[0,1] i y[0,1]. Prvo definišemo predmetnu funkciju (uočimo da ^ i ** su ekvivalentni operatori u SciLab-u). --> function f = myquadratic2arg ( x1 , x2 ) > f = x1**2 + x2**2; 277
> endfunction Formirajmo sada nezavisno promjenljive x=linspace(0,1,50); y=linspace(0,1,50); a nakon toga prikažimo kontrurni dijagram (četiri argumenta su: dva nezavisno promjenljive, funkcija koja se crta i broj kontura): contour(x,y,myquadratic2arg,20) Na slici 16.11 prikazan je konturni dijagram.
Slika 16.11. Konturni dijagram u SciLab-u. Grafici se mogu označavati na različite načine. Najjednostavniji je da se to uradi jednom naredbom kao što je: --> xtitle('Naslov','x-osa','y-osa') Tri argumenta ove naredbe su naslov, tekst ispod x-osta i tekst pored y-ose. Ovdje nećemo objašnjavati druge naredbe za grafički prikaz u SciLab-u. Dobijena slika se može konvertovati u druge formate putem više naredbi kao što su: vektorski xs2png (konverzija u png), xs2pdf (u pdf), xs2svg (u svg), xs2eps (u eps), xs2ps (u ps), xs2emf (u emf); bitmapirani xs2fig (fig fajl), xs2gif (u gif), xs2jpg (u jpg), xs2bmp (u bmp), xs2ppm (u ppm). Na primjer: --> xs2png(0,'slika.png') Drugi argument ove naredbe je naziv fajla u koji se vrši konverzija dok je prvi argument redni broj prozora koji se konvertuje. SciLab ima alternativu Simulink-a. Alternativa se naziva Scicos i nije kompatibilna sa Simulink-u. Još jedna stvar zahtjeva oprez kod primjene SciLab-a a to je sličnost naredbi iz MATLAB-a ali manje ili više različita sintaksa. Međutim, ljubitelji MATLAB sintakse mogu da koriste MATLAB naredbe kao, na primjer, MATLAB-ova naredba sum se može koristiti u sintaksi mtbl_sum. Na primjer, --> mtlb_sum(1:10) ans = 55. Slično postoje mnoge naredbe koje mogu da se izvrše u MATLAB stilu sa dodatkom mtlb_ ispred naredbe. U svakom slučaju činjenica da je SciLab sličan MATLAB-u, u osnovnoj varijanti da je besplatan te da postoji određena podrška za njega kvalifikuje ga da bude u upotrebi u zajednici matematičara, inženjera, ekonomista, medicinara i drugih kojima napredni matematički proračuni trebaju.
16.5 PYTHON – OSNOVNI POJMOVI U posljednjih nekoliko godina kao edukator u oblasti programiranja primjetio sam da studenti rješavaju pojedine postavljene probleme mnogo efikasnije u Python-u nego u drugim programskim jezicima. Python se može koristiti i kao matematički programski alat što će ovdje biti rudimentarno obrađeno. Ovdje samo nekoliko podataka. Osnovna ideja Pythona je da se kod bude jasan i čitljiv sa što je moguće jednostavnijom sintaksom ali istovremeno bez potrebe da se programer tjera da prihvati konkretnu programersku paradigmu (radi i kao OO i kao strukturni i u uslovima drugih programerskih paradigmi). Cilj je bio i da bude zabavan za programiranje (ime potiče ne od zmije već od Letećeg cirkusa Monti Pajtona). Python je freeware i u trenutku pisanja ovog dodatka dostupan je na adresi www.python.org. Nakon prelaska na ovu stranicu odaberite odgovarajuću verziju – opcija Download (obično se nude dvije: posljednja i pretposljednja sa dobro fiksiranim bagovima). Danas postoje i samo raspakujuće i samoinstalirajuće verzije tako da nakon nekoliko minuta downloada i isto toliko instalacije imate Python na računaru. Python posjeduje rudimentarni GUI komandni interfejs a posjeduje i komandni prozor za izvršavanje. Nakon startovanja otvara se komandni prozor sa promptom >>>: 278
>>>2+3 5 >>>x=2 >>>x+3 5 Kao što vidite naredbe se izvršavaju slično kao u MATLAB-u u okviru komandnog interpretera. Ako vam trebaju programi pišite ih u py-fajlovima koji se na primjer izvršavaju sa dvostrukim klikom na njih (biće pozvan python.exe i izvršena odgovarajuća skripta). Dodjeljivanje vrijednosti promjenljivim je uobičajeno (u narednom primjeru imamo tri promjenljive od kojih je posljednja string, oznaka # označava komentar do kraja reda): >>>S1=2 >>>S2=2.5 >>>S3="String" #komentar Operatori operacija su uobičajeni osim što pored standardnog dijeljenja postoji i dijeljenje cijelih brojeva //: >>>4/5 0.8 >>>4//5 0 U Pythonu je dozvoljena konkatenacija izraza kao u programskom jeziku C: >>>x=y=z=0 Dalje kompleksni brojevi se uvode na sličan način kao u MATLAB-u (kompleksna jedinica je j ili J) mada se može koristiti i funkcija complex: >>>x=3+4J >>>abs(x) 5 >>>x.real 3 >>>x.imag 4 >>>y=complex(0,1) >>>y (0+1j) Za konverziju podataka koriste se funkcije koje nose naziv posmatranog tipa podataka float(), int(), double(). Konverzija kompleksnog broja u float nije predviđena i u zavisnosti što nam treba možemo koristiti abs(z) odnosno z.real. Poslednji rezultat u Pythonu se uvijek može pozvati kao _ što je ponekad pogodno u različitim izrazima: >>> tax = 12.5 / 100 >>> price = 100.50 >>> price * tax >>> price + _ >>> round(_, 2) Python je veoma komforan za rad sa stringovima. Ovdje navodimo čitav niz primjera za ovo: >>> 'spam eggs' >>> 'doesn\'t' >>> "doesn't" >>> '"Yes," he said.' >>> "\"Yes,\" he said." >>> '"Isn\'t," she said.' U slučaju da se string nastavlja preko nekoliko redova potrebno je na kraju reda postaviti kosu crtu \ (backslash). Dugački stringovi mogu da budu uokvireni na početku i kraju sa tri navodnika """ ili apostrofa ''' a u tom slučaju nije potrebno navoditi ni znake za novi red tamo gdje bi ih inače navodili ako koristimo kosu crtu na kraju pojedinih redova dugačkog stringa. Ako prije početka stringa piše karakter r on neće biti štampan ali će se moći odštampati naredbom print i u tom slučaju kontrolne sekvence kakva je \n neće biti prevedene već će biti ostavljene u izvornom obliku: hello = r"Ovo je veoma dugačak string koji sadrži\n\ nekoliko linija teksta kako bi to uradili u C-u." Naredba print hello bi štampanje vršila zajedno sa kontrolnom sekvencom \n. Stringovi se mogu nadovezivati sa + i ponavljati sa *: >>> word = 'Help' + 'A' >>> word 'HelpA' >>> '' '' 279
Kod string literala važi da su dva susjedna string literala automatski nadovezana word = 'Help' 'A' daje 'HelpA' što ne važi za ostale tipove stringova. Indeksiranje stringova počinje od 0 a posebni tip karakter ne postoji već je u pitanju string dužine karakter: >>> word[4] 'A' >>> word[0:2] 'He' >>> word[2:4] 'lp' Sa word[:2] indeksiraju se prva dva simbola riječi dok je word[2:] sve osim prva dva simbola. Ono što je veoma bitno je da Python ne dozvoljava izmjene postojećeg stringa pa će naredbe: >>>word[0] = 'x' >>>word[:1] = 'Bla' dovesti do greške u izvršavanju. Međutim, postojeći string se može veoma elegantno koristiti za dobijanje novih: >>> 'x' + word[2:] >>> 'Nesto'+word[4] >>> word[:2]+word[2:] Posljednji primjer daje ponovo kompletnu riječ. U slučaju da indeksiramo van granica riječi dobićemo samo riječ do njenog kraja odnosno nećemo dobiti karaktere koji ne postoje wоrd[2:100] daje 'lpA'. Indeksi mogu biti i negativni brojevi -1 je posljednji karakter, -2 pretposljednji itd. Pogledajte sledeće primjere: >>> word[-1] >>> word[-2] >>> word[-2:] # daje posljednja dva karaktera >>> word[:-2] # Sve osim posljednja dva karaktera >>> word[-0] #isto što i word[0] >>> word[-100:] #ovo je korektno i daće polaznu riječ >>> word[-10] #pristup pojedinačnom karakteru koji je van opsega dovešće do greške Radi jednostavnijeg pamćenja indeksa posmatrajmo Tabelu 16.1. 'H' word[0] word[-5]
'e' 'l' 'p' 'A' word[1] word[2] word[3] word[4] word[-4] word[-3] word[-2] word[-1] Tabela 16.1. Indensiranje stringova u Python-u.
Dužina stringa se dobija funkcijom len(word). U Pythonu se može raditi sa Unicode stringovima (stringovima koji poznaju razne karakter setove uključujući našu ćirilicu i latinicu itd). String koji je Unicode treba da prije samog stringa uokvirenog apostrofima nalazi slovo u kao npr. u'Unicode string'. Unutar ovakvih sekvenci mogu se nalaziti kontrolne sekvence i Unicode karakteri u'string \u0035'. Funkcija unicode() omogućava pristup svim karakter setovima unutar unicode-a. Funkcija str() vrši konverziju stringa (ako je moguća) u ASCII karakter set. Konverzije u unicode se mogu obavljati npr. sledećim naredbama: u"äöü".encode('utf-8') '\xc3\xa4\xc3\xb6\xc3\xbc' Funkcija unicode() se može koristiti za prekodiranje nekog stringa iz jednog u Unicode format: unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8') u'\xe4\xf6\xfc' Python na veoma elegantan način formira liste prostim navođenjem liste (moguće raznorodnih) elemenata unutar: >>>a = ['spam', 'eggs', 100, 1234] >>>a ['spam', 'eggs', 100, 1234] >>> a[0] 'spam' >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['eggs', 100] >>> a[:2] + ['bacon', 2*2] ['spam', 'eggs', 'bacon', 4] >>> 3*a[:3] + ['Boo!'] ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!'] >>> a[:] 280
['spam', 'eggs', 100, 1234] Za razliku of stringova moguće je izmjeniti pojedinačni element liste: >>> a ['spam', 'eggs', 100, 1234] >>> a[2] = a[2] + 23 >>> a ['spam', 'eggs', 123, 1234] Listi se mogu dodavati novi elementi ili brisati stari: >>> a[0:2] = [1, 12] >>> a [1, 12, 123, 1234] >>> a[0:2] = [] >>> a [123, 1234] >>> a[1:1] = ['bletch', 'xyzzy'] >>> a [123, 'bletch', 'xyzzy', 1234] >>> a[:0] = a >>> a [123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234] >>> a[:] = [] >>> a [] Nad listama se može primjenjivati funkcija len(): >>> a = ['a', 'b', 'c', 'd'] >>> len(a) 4 Liste se mogu ugnjezditi: >>> q = [2, 3] >>> p = [1, q, 4] >>> len(p) 3 >>> p[1] [2, 3] >>> p[1][0] 2 >>> p[1].append('xtra') >>> p [1, [2, 3, 'xtra'], 4] >>> q [2, 3, 'xtra'] Programiranje u Python-u je slično kao u drugim programskim jezicima ali ipak sa znatnim razlikama koje vrijedi istaći između Python-a i standardnog programiranja. Započnimo sa primjerom realizacije Fibonačijevog niza: >>> a, b = 0, 1 >>> while b < 10: ... print (b) ... a, b = b, a+b Ovdje imamo nekoliko novih karakteristika. Pokazali smo da dvije promjenljive u istom iskazu mogu dobiti vrijednosti (u ovom slučaju biti inicijalizovane). Napominjem da se izrazi na desnoj strani prvo sračunaju pa da se tek nakon toga pridružuju vrijednostima na lijevoj strani. Iskazi na desnoj strani se izračunavaju sa lijeva u desno. Uslovi u Pythonu su tačni kao logički izrazi koji su ispunjeni odnosno kao iskazi koji su različiti od nule. Uslov može biti string ili lista gdje je bilo što sa nenultom dužinom tačno. Operatori poređenja su kao u C-u: , =, !=, ==. Bitna činjenica je da uvlačenje iskaza u jednoj grupi je obavezno u Python-u odnosno predstavlja način za grupisanje djelova koda. Uvlačenje se postiže putem tab-ova. Tekst editori obično posjeduju opciju za automatsko uvlačenje. Prilikom interaktivnog unosa prazna linija predstavlja kraj selekcije. Naredbom print piše se vrijednosti iskaza argumenta. Osnovna razlika u odnosu na ostale iskaze ogleda se u činjenici da se putem print-a može istovremeno štampati više iskaza, stringova itd. Na primjer: >>> i = 256*256 >>> print('Vrijednost i je', i) Vrijednost i je 65536 print iskaz koji se završava zarezom sprečava prelazak ispisa u naredni red: >>> a, b = 0, 1 281
>>> while b < 1000: ... print(b) ... a, b = b, a+b 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 Sintaksa if selekcije je data sljedećim primjerom: >>> x = int(input("Unesi cijeli broj: ")) Unesi cijeli broj: 42 >>> if x < 0: ... x = 0 ... print('Negativan postavljen na nulu') ... elif x == 0: ... print('Nula') ... elif x == 1: ... print('Jedan') ... else: ... print('Vise') Djelova elif može biti više dok je else opcion. Uočimo da je za razliku od drugih programskih jezika elif zamjena za elseif i else if. for ciklus se unekoliko razlikuje od onog u C-u i sličnim jezicima (mada C++ podržava ovakav način iteriranja) jer je iteriranje u Python-u prilagođeno bilo kojoj sekvenci uključujući stringove i liste: >>> a = ['cat', 'window', 'defenestrate'] >>> for x in a: ... print (x, len(x)) Za iteriranje preko liste brojeve može se koristiti pogodna ugrađenja funkcija range() koja ima više oblika: >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(5, 10) [5, 6, 7, 8, 9] >>> range(0, 10, 3) [0, 3, 6, 9] >>> range(-10, -100, -30) [-10, -40, -70] Za iteriranje preko indeksa sekvence mogu se kombinovati range() i len(): >>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range(len(a)): ... print (i, a[i]) Postoji još jedna alternativa a to je funkcije enumerate(). break kao u C-u prekida tekući for ili while ciklus dok continue ponovo radi kao u C-u odnosno započinje narednu iteraciju ciklusa. Ciklusi mogu imati i stavku else: koja se izvršava kada se petlja završava (kada uslov nije zadovoljen ili nema elemenata u listi) ali ne i kada se prekida putem break-a. Posmatrajmo sljedeći primjer: >>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print (n, 'jednako', x, '*', n/x) ... break ... else: ... print (n, 'je prost broj') Važno je uočiti da ovdje else: pripada ugnježdenom for-u a ne if-u. pass ne radi ništa već se koristi kada je iskaz potreban sintaksno ali ne treba ništa da radi: >>> while True: ... pass # program će raditi dok ga ne prekinete sa (Ctrl+C) Naredba pass se koristi i za kreiranje "praznih" klasa kao na primjer: >>> class MyEmptyClass: ... pass Funkcije se kreiraju na sljedeći način (ovdje demonstrirano na primjeru funkcije koja računa Fibonačijeve brojeve): >>> def fib(n): ... a, b = 0, 1 ... while a < n: ... print (a) ... a, b = b, a+b Funkcija se sada može pozvati kao: >>> fib(2000) 282
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 Ključna riječ def započinje definiciju funkciju. Praćena je imenom funkcije i u zagradama listom formalnih argumenata. Iskazi u tijelu funkcije moraju biti uvučeni i započinju sa narednom linijom. Prvi red funkcije može biti string npr. """Štampa Fibonacci niz do n.""" koji služi kao dokumentacija. Ime funkcije kao u R-u predstavlja tip podataka tako da se može pridružiti drugoj promjenljivoj kao: >>> f = fib >>> f(100) 0 1 1 2 3 5 8 13 21 34 55 89 Logika koju nasljeđujemo iz drugih jezika nam kaže da fib nije funkcija već procedura pošto ne vraća vrijednosti. Međutim, u Python-u čak i funkcije bez return iskaza vraćaju vrijedost odnosno vraćaju rezultat None: >>> fib(0) >>> print (fib(0)) None Funkcija koja vraća listu brojeva može se formirati na veoma jednostavan način: >>> def fib2(n): # return Fibonacci series up to n ... """Vraca listu koja sadrži Fibonaccijev niz do n.""" ... result = [] ... a, b = 0, 1 ... while a < n: ... result.append(a) ... a, b = b, a+b ... return result ... >>> f100 = fib2(100) >>> f100 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] Primjer je demonstrirao neke nove Python karakteristike: return praktično može da vrati rezultat bilo kojeg tipa a ako ne vraća nikakav rezultat podrazumijeva se da je to None; metod append na kraj objekta nadovezuje novi objekat. Ovaj metod je brži od alternativnog koji bi mogao da glasi result=result+[a]. Kao kod MATLAB-a moguće je definisati funkcije sa promjenljivim brojem argumenata (ova karakteristika ima sličnosti sa MATLAB-om i C++-om). def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise IOError('refusenik user') print(complaint) Ova funkcija se može pozivati na više načina: ask_ok('Do you really want to quit?'), ask_ok('OK to overwrite the file?', 2), ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!'). U prvom slučaju koriste se dva podrazumijevana argumenta, u drugom slučaju koristi se samo posljednji podrazumijevani argument dok se u trećem slučaju ne koriste podrazumijevani argumenti. Ključna riječ in u ovom primjeru testira da li u sekvenci postoji tražena riječ. Za razliku od programskog jezika C++ ovdje se podrazumijevani argumenti ne moraju navoditi redom prilikom poziva funkcije već postoji alternativa da se navede naziv argument znak pridruživanja (jednakosti) i vrijednost. Posmatrajmo sljedeće primjere: def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): print ("-- This parrot wouldn't", action) print ("if you put", voltage, "volts through it.") print ("-- Lovely plumage, the", type) print ("-- It's", state, "!") Dozvoljeni pozivi su: parrot(1000) parrot(voltage=1000) parrot(voltage=1000000, action='VOOOOOM') parrot(action='VOOOOOM', voltage=1000000) parrot('a million', 'bereft of life', 'jump') parrot('a thousand', state='pushing up the daisies') Sljedeći pozivi su, međutim, nedozvoljeni: parrot() # jedan argument nije podrazumijevan 283
parrot(voltage=5.0, 'dead') # nakon argumenta datog po imenu i drugi mora biti takav parrot(110, voltage=220) # jedini nepodrazumijevani argument je voltage pa se ovako duplira parrot(actor='John Cleese') # ne postoji argument actor Dokumentacija za funkcije u Python-u se formira na veoma sličan način kao dokumentovanje funkcija u MATLAB-u: >>> def my_function(): ... """Do nothing, but document it. ... ... No, really, it doesn't do anything. ... """ ... pass ... >>> print (my_function.__doc__) Do nothing, but document it. No, really, it doesn't do anything. Sada ćemo pokušati da sublimiramo neke važne činjenice koje se tiču lista i drugih struktura podataka. Elementi se na kraj liste dodaju metodom append kao list.append(a). Ako se lista želi dopuniti drugom listom koristi se metod extend u obliku list.extend(L). Dodavanje novog elementa na poziciju prije i-te se postiže metodom insert u obliku list.insert(i,x). Ako je i=0 dodavanje se vrši na početku liste. Metod list.remove(x) eliminiše iz liste element sa vrijednošću x. Metod list.pop([i]) iz liste eliminiše element na poziciji i (uz vraćanje njegov vrijednost). Ako i nije specificirano eliminiše se posljednji element u listi. Metod list.index(x) vraća poziciju elementa sa vrijednošću x iz liste (ako ga nema dolazi do greške). Metod list.count(x) prebrojava koliko se puta pojavljuju elementi sa vrijednošću x. Metod za sortiranje liste je list.sort() dok se lista "prevrće" u reversni redosljed metodom list.reverse(). Primjer nekih od navedenih metoda: >>> a = [66.25, 333, 333, 1, 1234.5] >>> print (a.count(333), a.count(66.25), a.count('x')) 210 >>> a.insert(2, -1) >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a [333, 1234.5, 1, 333, -1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5] Postojanje ugrađenih metoda koje smo gore pobrojali jasno ukazuje na brojne mogućnost veoma efikasnog rada sa listama. Na primjer lista se može koristiti kao stek što je demonstrirano narednim primjerom: >>> stack = [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> stack [3, 4, 5, 6, 7] >>> stack.pop() 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack.pop() 5 >>> stack [3, 4] Lista se može koristiti kao red. Sa time da je pametno koristiti ugrađenu kolekciju deque (collections.deque) kako bi imali brze metode za dodavanje i brisanje sa oba kraja: >>> from collections import deque >>> queue = deque(["Eric", "John", "Michael"]) 284
>>> queue.append("Terry") >>> queue.append("Graham") >>> queue.popleft() # Eliminisanje prvoga iz reda >>> queue.popleft() # Eliminisanje drugoga iz reda >>> queue # Ostatak elemenata u redu deque(['Michael', 'Terry', 'Graham']) Tri veoma bitne i korisne funkcije za rad sa listama su filter(), map() i reduce(). Metod filter(function, sekvenca) vraća niz koji se sastoji od onih elemenata sekvence za koje je funkcija (function) tačna. Za stringove funkcija vraća string a za većinu ostalih podataka vraća list-u. Na primjer računamo niz brojava koji nisu djeljivi sa 2 i 3: >>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23] Funkcija map(function,sekvenca) primjenjuje funkciju function na sve elemente sekvence i vraća niz rezultata: >>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] Moguće je jednovremeno proslijediti više od jedne sekvence kao na primjer: >>> seq = range(8) >>> def add(x, y): return x+y ... >>> map(add, seq, seq) [0, 2, 4, 6, 8, 10, 12, 14] Funkcija reduce(function, sequence) vraća vrijednost koja dobijena pozivanjem binarne funkcije na prva dva elementa niza, pa zatim rezultat na sljedećeg itd >>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55 U slučaju da niz nema elemenata dolazi do izuzetka a ako ima samo jedan element to je ujedno i rezultat. Treći argument ove naredbe se može vratiti da bi indicirao početnu vrijednost a u slučaju pozivanja funkcije sa tri argumenta nad praznim nizom neće doći do izuzetka: >>> def suma(seq): ... def add(x,y): return x+y ... return reduce(add, seq, 0) ... >>> suma(range(1, 11)) 55 >>> suma([]) 0 Postoji više načina da se liste kreiraju na koncizan način. Posmatrajmo sljedeći primjer: >>> squares = [] >>> for x in range(10): ... squares.append(x**2) ... >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] Isti rezultat se može postići na sljedeći način: squares = [x**2 for x in range(10)] Ekvivalentno se može koristiti i naredba squares=map(lambda x: x**2, range(10)). Vidimo efikasan način formiranja liste sa ugnježdenim for iskazom ali se mogu koristiti i kombinacije sa if selekcijom: >>> >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] U pozivima se mogu pozivati različite funkcije kao na primjer: >>> from math import pi >>> [str(round(pi, i)) for i in range(1, 6)] ['3.1', '3.14', '3.142', '3.1416', '3.14159'] Inicijalni izraz u listama se može da proizvoljni izraz uključen drugu listu. Posmatrajmo primjer 34 implementira kao lista 3 elementa dužine 4 285
>>> matrix = [ ... [1, 2, 3, 4], ... [5, 6, 7, 8], ... [9, 10, 11, 12], ... ] Sljedeće naredbe će transponovati redove i kolone: >>> [[row[i] for row in matrix] for i in range(4)] [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] Ovaj primjer se može alternativno napisati kao: >>> transposed = [] >>> for i in range(4): ... transposed.append([row[i] for row in matrix]) ... >>> transposed [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] što je isto što i: >>> transposed = [] >>> for i in range(4): ... # the following 3 lines implement the nested listcomp ... transposed_row = [] ... for row in matrix: ... transposed_row.append(row[i]) ... transposed.append(transposed_row) ... >>> transposed [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] Preporučljivo je da se umjesto kompleksnih iskaza koriste ugrađene funkcije kao u slučaju dolje: >>> list(zip(*matrix)) [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] Sami proučite korišćenje opcije sa argumentum koji se prosljeđuje uz operator * kao u prethodnom primjeru. Putem operatora del možemo izbrisati elementi navodeći mu indeks >>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a [] Zainteresovani za izučavanje Python-a mogu da pogledaju bogatu dokumentaciju na internetu i sam help dok je za našu namjenu ovo i više nego dovoljno.
16.6 R-CODE – UVOD (KREIRANO NA OSNOVU ZVANIČNE DOKUMENTACIJE) R code je alat/okruženje sa pratećim programskim jezikom (naziva se S) koji je namijenjen opštoj upotrebi u matematičkim disciplinama. Međutim, ovaj alat se može smatrati osnovnim sredstvom (gotovo opšteprihvaćenim) za matematičku statistiku a veoma su popularne i njegove grafičke mogućnosti. Nažalost, ovaj alat zahtjeva određenu pripremu za korištenje (predznanje iz statistike). Suštinski R code ima elemente alata koje smo već učili (Matlab, Mathematica, Maple i programskih jezika kakav je na primjer C). Naredba se završava sa enterom ili ;. Komentari se označavaju sa # i važe do kraja red. Linije koje se nastavljaju u narednom redu na kraju imaju +. Radno okruženje dosta liči na ono u Matlabu vezano za komfor izvršavanja prethodnih naredbi. Programi se mogu pisati u R-fajlovima i oni se izvršavaju naredbom source("nazivfajla.R"). Svi entiteti od značaja u R-kodu se naziva objektima (promjenljive, matrice, stringovi, funkcijei strukture). Naredba objects() lista objekte koji su trenutno aktivni u R-u (ovi objekti se čine radni prostor). Objekti se iz memorije brišu naredbom rm(obj1, obj2, obj3) odnosno u zagradama se navodi spisak objekata koji treba da se eliminišu iz memorije. Radni prostor se može snimiti za kasniju upotrebu i u narednoj sesiji učitati. Osnovni tip podataka u R-u je vektor koji se zadaje na sljedeći način: x