na tej povezavi
Transcription
na tej povezavi
Octave za zacetnike 1 Kaj je Octave? Octave je najveckrat opisan kot Prostokodni klon bolj znanega programskega okolja Matlab. Ustvarjen je z namenom izvajanja racunalniskih operacij nad vektorji in matrikami. Ceprav je mogoce komu pojem vektor in matrika neznan, pa se izkaze, da se lahko vecino problemov v elektrotehniki ter prav tako v fiziki, matematiki in ostalih naravoslovnih vedah izrazimo matematicno z matrikami in vektorji. Beseda Prostokodni pa pomeni, da je izvorna koda programa javno dostopna na spletu in s tem jo lahko pregleda, popravlja in dopolnjuje kdorkoli ima interes zato. Program si lahko zastonj povlecete z njihove domace spletne strani www.octave.org. Program deluje tako v Windows okolju kot tudi v Linux, MacOS X in Solaris. Navodila, kako se program namesti ter zazene dobite z poizvedbo v Googleu: Installing Octave on >vstavi tvoj priljubljen operacijski sistem<. Ko program zazenete, sem vam na zaslon izpise: GNU Octave, version 2.1.57 (i386-pc-linux-gnu). Copyright (C) 2004 John W. Eaton. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type ‘warranty’. Additional information about Octave is available at http://www.octave.org. Please contribute if you find this software useful. For more information, visit http://www.octave.org/help-wanted.html Report bugs to <bug-octave@bevo.che.wisc.edu> (but first, please read http://www.octave.org/bugs.html to learn how to write a helpful report). octave:1> In to je po mojem mnenju najmanj intuitiven vmesnik, kar ste/smo ga srecali za katerikoli programski paket. Vendar pa z nekaj znanja matematike ter nekaj osnov programiranja hitro postane ucinkovito orodje za numericno racunanje. 2 2.1 Osnovna uporaba programa Octave Kot Kalkulator Octave podpira naslednje aritmeticne operatorje: +,-,*,/,** sestevanje,odstevanje,mnozenje, deljenje ter potenciranje (2**3 = dva na tri) Tako lahko vpisete izraz: Octave:1>1+1 Ali pac: Octave:1>(4-5)*2+3**2 2.2 Funkcije Uporabo programa lahko razsirimo z vgrajenimi funkcijami, ki jih uporabljamo na slednji nacin: ime_funkcije(stevilo) Imena nekaterih funkcij so zapisana na zadnji strani, na primer: Octave:1>log(5) ans = 1.6094 Octave2>sqrt(pi) ans = 1.7725 Octave3>ans ans = 1.7725 Octave4>%komentar V tem primeru opazimo kar nekaj novih stvari: • Funkcije imajo 'logicna' imena – log kot logaritem ter sqrt kot 'square root' – kvadratni koren. Pogoste so se sin, tan, cos, exp (e**x), log10 (desetiski logaritem), abs (absolutna vrednost),... • log funkcija je kar naravni logaritem. To je standard v matematiki na tem nivoju, za spremembo od srednjih sol, kjer se za log uporablja desetiski logaritem, ln pa za naravni. • Obstojajo konstante, ki so ze privzeto dolocene. Nekaj teh je pi, e, i in j - obe kot sqrt(-1) – osnovno imaginarno stevilo • Rezultati se navidez izracunajo dokaj nenatancno. Za pi je lahko v mnogo primerih okrajsava na 3.1416 premalo natananca. Vendar je ta natancnost v resnici na priblizno 15 mest – kar se izkaze za dovolj natancno. Se posebej ce upostevamo, da se napake na nasih merilnih napravah pojavljajo ze na drugem ali tretjem decimalnem mestu. • Decimalna vejica v anglescini ne obstaja. S tem ne obstaja tudi v angleskih programih. Uporablja se piko. Vedno. • Karkoli zapisemo za znakom % se obravnava kot komentar in Octave ta del lepo preskoci. 2.3 'Posebna' stevila Octave:1>1/0 %Pri deljenju z 0 dobimo rezultat neskoncno (Infinity) ans = Inf Octave:2>0/0 %v nekaterih matematicno nedefiniranih operacijah je rezultat NaN – not a number ans = NaN Octave:3> (2 +3*i) – (4 + i) %racunanje z kompleksnimi stevili deluje ans = -2 -2i 2.4 Poimenovanje spremenljivk Vsako stevilo v Octave lahko podobno kot v drugih programskih jezikih zapisemo v neko spremenljivko. Operator, ki spremenljivki priredi neko vrednost ali jo vanjo vpise je = . Primer: Octave1>x=1.2 * sin(40*e + log(2.4**2)) x = - 0.60298 Octave2>x**2 x = 0.36358 Octave3>3+2 ans = 5 Octave4>tan(ans) ans = -3.3805 Tokrat opazimo: • spremenljivko lahko uporabimo kasneje - kot pri matematiki ali fiziki v srednji soli. • Prav tako lahko iammo podobno kot v sredni soli znotraj sinusne funkcije logaritem in druge matematicne funkcije • Ce pozenemo racunalnisko operacijo in rezultat eksplicitno ne zapisemo v nobeno spremenljivko, se vredno se vedno vpise v zacasno spremenljivko ans. Ta se prepise takoj ob naslednji racunski operaciji, kjer spet ne shranjujemo rezultata 2.5 Uporabne funkcije: Ukaz who uporabite, ce vas zanima, katere spremenljivke ob dolocenem trenutnku obstajajo. Ukaz whos vam ponudi se nekaj vec podrobnosti o spremenljivkah. Ukaz format long izpise rezultat natancneje – kot ze receno, na priblizno 15 decimalnih mest Ukaz format short Pa izpise rezultate ponovno v klasicni obliki Ukaz clear <spremenljivke> Izbrise navedene spremenljivke. Ce ukaz clear pozenete brez drugega dela (spremenljivk), se izbrisejo vse spremenjlivke Ukaz save <ime_datoteke> <spremenljivke> Ta ukaz v datoteko z danim imenom shrani dane spremenljivke. Ce spremenljivk ne vnasamo, se avtomaticno shranijo vse. Te lahko kasneje nalozite nazaj v program z: Ukaz load <ime_datoteke> Primer za vse dane funkcije na naslednji strani octave:1> elektrina1 = 3 * 10**-9 elektrina1 = 3.0000e-09 octave:2> elektrina2 = -5 * 10**-9 elektrina2 = -5.0000e-09 octave:3> epsilon = 10**-9/(36* pi) epsilon = 8.8419e-12 octave:4> r = 10**-2 r = 0.010000 octave:5> save vaja1 octave:6> format long octave:7> who Variables in the current scope: ans elektrina1 elektrina2 epsilon r octave:8> clear octave:9> who %vidimo, da ne obstaja nobena spremenljivka vec octave:10> load vaja1 octave:11> F = (1/epsilon*4*pi)*(elektrina1*elektrina2/r**2) F = -0.213183455063530 octave:12> format short octave:13> F F = -0.21318 2.6 Ostali triki • Ce zelimo hitro priklicati ze uporabljene ukaze pritisnite tipko 'gor'. Uporaba je logicna :) • Mnogokrat si ne zelimo prikazati vse rezultate. Ce na koncu celotnega ukaza pripisemo podpicje, se ukaz preprosto ne izpise • Nekatere funkcije niso cisto samointuitivne ali preprosto ne vemo, kaj naredijo. Octave ima vgrajen sistem dokumentacije funkcije, katerega priklicemo z ukazom: ◦ help <ime_funkcije> ◦ Branje the strani zahteva znanje anglescine • Ce je zaslon zaseden in ne najdete vrstice za vpisovanje novih ukazov, pritisnite q. • Ce octave dela nek izracun predolgo casa in zelite to prekiniti, kombinacija tipk ctrl+C preklice trenutno operacijo. • Za izhod iz programa Octave obstaja vec nacinov, jaz uporabljam ukaz quit ali kombinacijo tipk ctrl+D • Izraz a=a+1 je pravilen. To je posledica tega, da se sestevanje izvede pred zapisovanjem nove vrednosti v 'a'. Zato se prvo sesteje stara vrednost a + 1 in dobljeno se Po Tem zapise v novi a. 3 Vektorji in Matrike Verjetno srednjesolska publika pozna vektorje iz fizike ter iz matematike kot neko pozicijo v prostoru, katero najveckrat predstavimo kar s puscico. V sami matematiki pa je vektor preprosto samo zbirka stevil. Vektor je lahko 3 dimenzionalni (x,y,z), lahko pa je vektor tudi n-dimenzionalni (x1,x2,x3,...,xn). Matrico pa definiramo kot zbirko stevil, le da so te zbrane v pravokotno (ali kvadratno) zgradbo. Tako je primer 3*2 matrike : 1 2 8 2 5 4 V octave je vektor 1*n oziroma n*1 dimenzionalna matrika Nekaj strogo matematicnih osnovnih definicij: • Vsota: Vsota matrike A + B je enaka vsoti clenov na istih pozicijah. Tako lahko sestevamo le enako velike matrike (razlika podobno) 2 3 6 8 6 4 + 5 4 2 5 8 1 = 7 7 8 13 14 5 • Razlika je definirana na podoben nacin • Skalarni produkt vektorjev (ki ga poznamo iz srednje sole) je definiran na naslednji nacin: (x1,x2,x3,...,xn)*(y1,y2,y3,...,yn)=x1*y1 + x2*y2 + x3*y3 + … + xn*yn • Mnozenje matrike s stevilom izracunamo tako, da vsak element matrike pomnozimo s tem stevilom Pozor: Mnozenje matrik je definirano na nekoliko drugacen nacin, medtem ko deljenje ter potenciranje matrik sploh ni definirano. Za vec informacij o tem je potrebno znanje Osnov Linearne Algebre (snov Matematike 2 na FE). Kako to znanje uporabiti v Octave je razlozeno v dodatni literaturi na koncu tega dokumenta. 3.1 Octave in Matrike/Vektorji Sestavimo prvi vektor! Octave:1>A = [1 2 3] A= 1 2 3 Ta vektor je 3 dimenzionalni ter vrsticni (row) vektor Sestevanje vektorjev je preprosto Octave:1> A+A ans = 2 4 6 Ce zelimo vrsticni vektor pretvoriti v stolpcni (column) vektor je ukaz zopet preprost Octave:1> A' ans = 1 2 3 Definirajmo se matriko: Octave:1> M=[1 2 3;3 4 5;5 6 7] M= 1 2 3 3 4 5 5 6 7 Pri matriki torej presledek pomeni nov element v vrstici, podpicje pa novo vrstico. Matriko lahko sestevamo ali odstevamo podobno kot vektorje: Octave:1> M - [3 3 2;2 2 3;1 1 0] ans = -2 -1 1 1 2 2 4 5 7 octave:3> ans - [3 3 4;4 2 1] error: operator -: nonconformant arguments (op1 is 3x3, op2 is 2x3) Opazimo, da Octave ne podpira sestevanja dveh matrik drugacne zgradbe Poskusimo izracunati skalarni produkt: octave:2> I=[4 4 2 1] ; octave:3> J=[-2 3 0 0] ; octave:4> I * J error: operator *: nonconformant arguments (op1 is 1x4, op2 is 1x4) octave:5> I * J' ans = 4 octave:6> J' * I ans = -8 -8 -4 -2 12 12 6 3 0 0 0 0 0 0 0 0 Vidimo, da pravilni rezultat dobimo samo z mnozenjem vrsticnega vektorja z stolpicnim. Zadnji rezultat – J'*I Ce zelimo pomnoziti vsak element matrike z istoleznim elementom v drugi matriki uporabimo operacijo '.*' . Podobno za deljenje in potenciranje uporabimo './' in '.**' . Te operatorje uporabimo tudi v primeru ko zelimo neko stevilo mnoziti (potencirati,deliti) z vektorjem. octave:1> JAZ = [1 2;1 2]; octave:3> TI = [4 1;3 2]; octave:4> JAZ.*TI ans = 4 2 3 4 octave:5> JAZ./TI ans = 0.25000 2.00000 0.33333 1.00000 octave:6> JAZ.**TI ans = 1 2 1 4 octave:17> 2.**TI ans = 16 2 8 4 octave:8> TI*2 ans = 8 2 6 4 Operacija ' ne deluje samo na vektorjih, ampak tudi na matrikah. Operaciji se rece transponiranje. Transponiranje matriki zamenja vrstice in stolpce: octave:12> A = [1 1 3;3 2 1] A= 1 1 3 3 2 1 octave:13> A' ans = 1 3 1 2 3 1 3.2 Funkcije za ustvarjanje vektorjev in matrik Te so zelo pogosto uporabne v resnicnih problemih. Ce zelimo ustvariti vektor, ki vsebuje cela stevila med n in m, uporabimo operator : na nacin:\ octave:1> G = -3:5 G= -3 -2 -1 0 1 2 3 4 5 Ce med n in m vstavimo nek delta (n:delta:m), potem se ta interval razdeli na intervalcke velikosti delta. octave:2>G = 3:0.1:4.5 G= Columns 1 through 8: 3.0000 3.1000 3.2000 3.3000 3.4000 3.5000 3.6000 3.7000 4.1000 4.2000 4.3000 4.4000 4.5000 Columns 9 through 16: 3.8000 3.9000 4.0000 Vektorje in matrike lahko sestavljamo iz drugih vektorjev in matrik: octave:7> a = [1 2 3]; octave:8> b = [a 4] b= 1 2 3 4 octave:9> AB = [a 0;b] AB = 1 2 3 0 1 2 3 4 octave:10> ABC= [AB;AB ] ABC = 1 2 3 0 1 2 3 4 1 2 3 0 1 2 3 4 Funkciji linspace ter logspace vzameta 3 vrednosti: spodnjo a, zgornjo b ter stevilo elementov n. Linspace potem naredi n dimenzionalni vektor, ki ima vse elemente linearno razporejene med dvema vrednostima. Logspace seveda naredi isto, le da elemente razporedi logaritemsko. octave:12> x = linspace(0,100,5) x= 0 25 50 75 100 Funkciji ones ter zeros vzameta dvoje vrednosti N&M, ki predstavljata dimenziji matrike. Ones potem naredi N*M matriko enic, zeros pa N*M matriko nicel. 3.3 Branje vektorjev in matrik Ideja je preprosta. Kot pri ustvarjanju novih vektorjev/matrik uporabljamo oglate oklepaje, tako za priklic dolocenega elementa uporabimo navadne oklepaje. Znotraj oklepajev ni nujno samo stevilo, ampak tudi vektor, ce zelimo brati vec vrstic/stolpcev na enkrat. Primer: octave:19> a = [1:5 7] a= 1 2 3 4 5 7 octave:20> a(3) ans = 3 octave:21> a(3:5) ans = 3 4 5 octave:22> a=[a;a;a] a= 1 2 3 4 5 7 1 2 3 4 5 7 1 2 3 4 5 7 octave:23> a(4,3) error: A(I): Index exceeds matrix dimension. octave:23> a(3,4) ans = 4 octave:24> a(1:2,[4 6]) ans = 4 7 4 7 Ce ste vajeni drugih programskih jezikov, se ponavadi elementi vektorjev (array) zacnejo z 0. V Octave se stetje zacne z 1. Povedano drugace a(0,0) nikoli ne obstaja. 4 Slikce! Grafi (anglesko plot) se lahko izrisejo na veliko nacinov. Delimo jih na 3D ter 2D grafe. Tu bom obravnaval samo 2D grafe. Za info na risanju prostorskih grafov poglejte funkcije plot3, mesh ter contour. Ogledali si bomo funkcijo plot. Ta vzame 2 vektorja – X = (x1,x2,x3,...,xn) ter Y = (y1,y2,y3,...,yn). Potem na graf izrise tocke (x1,y1), (x2, y2 ), (x3, y3), …, (xn,yn) ter jih med sabo poveze. Primer: octave:1> x = 0:0.1:4*pi; octave:2> plot(x, sin(x)) Okrasimo graf! • Plot funkcija sprejme se tretji argument (poleg dveh vektorjev). Tretji argument je besedna zveza (to pomeni, da je vpet v narekovaje). Primer 'ro' nam da 'r' – rdec in 'o' – pikcast graf. Vse mozne kombinacije so zbrane v tabeli na zadnji strani. • Funkcija title() nam napise naslov grafa • Funkciji xlabel() ter ylabel() dopiseta se ime x in y osi • Funkcija grid on doda v odzadje mrezo , grid off to mrezo nazaj izbrise • legend() pa kot ime namiguje doda grafu legendo Primer: octave:6> plot(x, sin(x), 'b') octave:7> xlabel('Kot v radianih') octave:8> ylabel('Sinus kota') octave:9> title('Sinus med 0 in 4pi') octave:10> legend('Sinus') Ce zelimo narisati na eno sliko vec grafov to preprosto naredimo z ukazom hold on in potem ponovno klicemo plot. Ko narisemo na sliko vse grafe, poklicemo se hold off. octave:12> plot(x, sin(x), 'r') octave:13> hold on octave:14> plot(x, log(x), 'o') octave:15> plot(x, tan(x), 'g') octave:16> axis([0 4*pi -5 5]) octave:17> legend('Sinus', 'Logaritem', 'Tangens') Z ukazom axis poves, do katerih mej naj se graf izpise. Zadnje: Graf shranis z ukazom print <ime_datoteke.png> -dpng . 5 Kontrolni stavki Po pravici povedano sploh nevem kako se tem stavkom rece pravilno po slovensko. Pac pojdimo z izrazom kontrolni stavki naprej. Torej octave podpira kar nekaj stavkov, tudi takih, ki jih ne bomo obravnavali, glavni trije pa so, kot v vsakem visje nivojskem programskem jeziku If-else stavek, ter zanki While in For. Pa zacnimo! 5.1 If...else stavek V inzinirskem svetu si veckrat zelimo, da nas program naredi na osnovi nekega testa razlicne operacije. Kot primer vzemimo: Funkcija Absolutno(x): if x>=0 x=x elseif x<0 x = x * -1 end Kaj smo naredili? • if x>=0 – Ta del preveri ce je x vecji ali enak 0. Operator >= imenujemo primerjalni operator ter lista teh operatorjev je na zadnji strani. Kar vrne prav vsak primerjalni operator je 0 ali 1. 0 ce je izjava napacna (v tem primeru ce je x manjsi od nic) ali 1, ce je izjava pravilna. If nato v primeru 1ke izvede operacijo, v nasprotnem primeru pa se premakne naprej • elseif x<0 – Tukaj preveri, ce je x manjsi od 0. Ter nato spet v primeru da je vrednost primerjalnega izraza 1 izvede operacije, v nasprotnem primeru pa skoci naprej. Ker se v tem primeru pogoja izkljucujeta, nam v drugem primeru sploh ni potreba preverjati, ce je x<0. To naredimo tako da stavek • elseif x<0 zamenjamo z else. Tudi nasplosno je dobro na konec bloka if...else dodati zadnji else, ce ne za kaj drugega za to, da preverja napake. Tukaj bi lahko dodali else disp('Nekaj je slo narobe') • end – Vsak blok se v octave zakljuci z zakljucnim stavkom end. Se nekaj pomembnih dejstev: • Ni pomembno kako je tekst zamaknjen (angl. White space) – v nekaterih programskih jezikih je to pomembno. V tem primeru bi lahko x=x* -1ter x=x pisal brez zamikanja • Ko je enkrat eno if preverjanje pravilno – se izvede ta del kode, potem se naprej preverjanja ne izvajajo, ampak octave skoci do end-a in nadaljuje od tam naprej • Stevilo elseif-ov je neomejeno. Oziroma je omejeno, vendarle le z vaso domislijo oz. Matematicnim problemom, ki ga programirate • Mogoce se sprasujete kaj je disp('Nekaj je slo narobe'). Funkcija disp() vzame neko besedno zvezo ovito v narekovaje ter jo izpise na zaslon. • Med if pogojem in naslednjim elseif-om je lahko vecje/poljubno stevilo ukazov. Splosna zgradba tega bloka je: If pogoj stavki elseif pogoj stavki elseif pogoj ... else stavek end Se nekaj kompleksnejsih primerov: if: • x==0 %Ce je x enak nic – pazi dvojni enacaj • x~=0 %x ni enak 0 • 3<x<10 %ne dela. V vsakem primeru je rezultat 1. Zakaj? Zato, ker se stavek izvede povrsti – ena operacija za drugo. Prvic se izvede 3<x. Tu bo rezultat lahko 0 (ce bo x<3) ali pa 1 (v obratnem primeru). Nato se izvede se (3<x)<10. Tu bo rezultat znotraj oklepaja v vsakem primeru manjsi od 10. Zato ta blok ne deluje kot pricakujemo. Pa vseeno si zelimo vedeti, kaksen mora biti pogoj za if, da se bo izvedel samo ce bo x med 3 in 10. Pa dajmo: • 3<x & x<10 %Dela! Kar znak & pomeni je IN HKRATI (presek) • 3>x | x>10 %Tu pa je se primer za 3>x ALI x>10. Torej | pomeni ALI (unija) • Poskusite sami :) 5.2 For zanke Tokrat pa zacnimo z splosno zgradbo: for spremenjlivka = vektor stavki end For zanka se uporablja v primerih, ko zelima da se neka operacija izvede veckrat zaporedoma. Primer: Funkcija y = f(x) % !! x je naravno stevilo vektor1 = 1:x temp = 1 for stevke = vektor1 temp = temp * stevke end y = temp Pojdimo od zacetka do konca. Vendar pa vzpodbujam, da poskusate ugotoviti, kaj ta funkcija izracuna kot y. 1. y=f(x) Torej imamo funkcijo, ki je odvisna od x. 2. vektor1 = 1:x Za osvezitev spomina: operator : ustvari vektor. V tem primeru ustvari vektor od 1 do x. Torej 1:4 vrne [1 2 3 4] 3. temp = 1 Ce kdo tukaj isce obrazlozitev te vrstice svetujem, da se vrne na zacetek tega vodica in zacne znova 4. for stevke = vektor1 Koncno nekaj novega. Ta vrstica pomeni, da se bo zanka for izvedla za vsak element vektorja 'vektor1'. Ce sledimo primeru x = 4 se bo torej zanka izvedla 4-krat. Vsakic ko se bo izvedla, bo imela spremenljivka 'stevka' drugacno vrednost. Najprej 1, potem 2,... do x. 5. temp = temp * stevka Uf tale je pa tezka. Ponovimo: kakrsnekoli racunske operacije se izvedejo preden se zapisuje novo vrednost v 'temp'. Ta vrstica torej vzame prejsno vrednost temp, to pomnozi s 'stevka' in potem to vrednost zapise nazaj v 'temp'. 6. Ko se torej ta zanka x-krat izvede pridemo do konca – end. 7. y=temp Torej je vrednost y pri y=f(x) enaka koncni vrednosti temp. Sedaj pa sledimo poteku algoritma: Denimo da je x=4. V for zanki ima prvic spremenljivka stevka vrednost 1. izvede se stavek temp = temp*stevka oziroma temp=1*1. 'temp' ostane 1. Prisli smo do konca stavkov znotraj ene ponovitve, zato sledi druga. Tokrat ima stevka vrednost 2. 'temp' se prenese iz prejsnega cikla, torej temp=1 Torej se izvede temp=1*2. Tokrat se v 'temp' zapise vrednost 2. V tretji ponovitvi stevka zavzame vrednost 3, temp se vedno 2. Torej temp=2*3 ali temp = 6. Naprej stevka = 4, temp = 6, sledi temp = 6*4 = 24. Prisli smo do konca ponovitev in imamo y(4) = 24. Nagradno vprasanje brez nagrade je = kako se imenuje funkcija ki racuna f(4) = 1*2*3*4. In odgovor je... Faktorel stevila (ali fakulteta stevila, odvisno od tega katerega asistenta imas pri vajah pri predmetu Matematika 1) Upam, da vam je jasno delovanje For zanke. V nasprotnem primeru si se enkrat preberite zadnjo stran. Ce vam spet ni jasno, pa si najdite pomoc z googlom =for loop explanation. 5.3 While zanka Torej to je se zadnja zanka, obravnavana v tem tekstu. Njena funkcija je podobna for zanki. Splosna oblika je: while izraz stavki end Podobno kot for zanko bom tudi to razlozil na primeru: x=1 n=0 epsilon = 0.0001 while x>epsilon x=x/2 n=n+1 end disp(n) Recimo da nas zanima, kolikokrat moramo prepoloviti neko stevilo, da bo padlo pod doloceno vrednost – epsilon. Zanka se bere: Dokler je x vecji od epsilona prepolovi ta x ter n povecaj za 1. Ko prides do konca pokazi n. Za zanimivost tudi povem, da se da vsako for zanko zapisati kot while zanko. n=1 x = [nek vektor] while n<length(x) a=x(n) stavki... n=n+1 end ------------Je enako kot-------------x = [nek vektor] for a=x stavki... end S tem da length(x) izracuna stevilo elementov v vektorju. Vidimo, da je for le skrajsana oblika specificne vrste while zanke (imamo vektor in korakamo cez elemente vektorja). V Razlog za njen obstoj je pac enormna kolicina podobnih while zank, ki jih lahko prepisemo for zanko in to v krajsi ter bolj berljivi obliki. Za dodatno izobrazevanje priporocam • switch blok • do...while 6 Octave Funkcije Pridejo dnevi, najveckrat so dezevni in imamo zeljo zapisati neko funkcijo ki jo Octave ne pozna. Jaz trenutno zelim napisati funkcijo sin_v_stopinjah(x). Namrec resnicno se mi ne ljubi vedno znova pretvarjati stopinje v radiane in te potem uporabljati v funkciji sin(x). Torej kako naj octave prepricam v obstoj neke nove funkcije z imenom sin_v_stopinjah(x), ki bi mi izracunala to kar zelim. No tu je recept: function y = sin_v_stopinjah(x) % Ta funkcija mi izracuna sinus, ko je x podan v stopinjah y = sin(x*(2*pi)/360) end 1. function y = sin_v_stopinjah(x) V tej vrstici povemo da bo funkcija imela ime -||-, vracala pa bo y. 2. %komentar Ta komentar se pokaze, ko klicemo help(sin_v_stopinjah) 3. y = sin(x*(2*pi)/360) Ta vrstica pa naredi vso racunanje. Pa ceprav ga v tem primeru ni veliko, pa nam lahko za vecje projekte take majhne funkcije prihranijo veliko prepisovanja. Pa tudi veliko funkcij vgrajenih v octave je podobno osnovnih, saj klicejo druge funkcije znotraj programa. Se par pomembnih kvadratkov: White Space tudi tu ni pomemben Funkcija lahko vrne vec vrednosti in/ali odvisnih spremenljivk. Vrne jih kot vektor. Primer: Function [a,b] = neko_ime(x,y,z) a = f(x,y,z) b = g(x,y,z) end Funkcijo lahko shranimo v posebno .m datoteko in jo uporabimo drugic, ali jo prodajamo po razredu bolj lenim studentom. Dodatne informacije so v spodaj navedeni literaturi Lahko tudi prepisemo ze vgrajene funkcije, vendar to pocetje ni priporoceno. Ce bi bilo po moje, bi bilo prepovedano! Primer: Function s = log(x) s = log10(x) end Za vajo: Napisi funkcijo za faktorel(x). Ampak jo napisi z while zanko. 7 Octave skripte Veckrat si zelimo, da bi zaporedje ukazov zapisali v neko datoteko, ter to datoteko nato celotno izvedli, ne pa vsako vrstico posebej prepisovali v octave. Za namen tega vodica ustvarimo novo mapo v C:\octave_scripte\. Tukaj res da na prvo mesto postavljam uporabnike Windows, ampak upam da se znajdejo tudi uporabniki iz drugih OSov Sedaj odprimo nas najljubsi tekstovni urejevalnik (priporocam notepad++ za Windows uporabnike ali Gedit za uporabnike Linuxa.) ter napisemo krajso skripto: Pot do te datoteke se sedaj glasi: C:\octave_tutorial\skripta.m Sedaj imamo dva nacina kako izvedemo te ukaze: 1. se preden zacnemo octave v komandno vrstico vpisemo octave "C:\octave_tutorial\skripta.m" Ta ukaz izvede le kaj je ukazov v skripti in na koncu zapre program. Pri tem shrani sliko graf.png isto mapo 2. odpremo octave z ukazom octave Vpisemo ukaz cd C:\octave_tutorial\ Tretji in zadnji ukaz je skripta Ta ukaz spet izvede iste ukaze, le da tokrat octave ostane odprt. Pa tudi ukaz: print C:\octave_tutorial\graf.png -dpng lahko spremenimo v print graf.png -dpng Namrec z ukazom cd si izberemo mapo, v kateri se bodo vse slike in tekst shranjeval, ce ne bomo eksplicitno povedali da se mora v neko druga mapo. 7.1 Funkcije .m Prav tako kot celotne skripte, lahko tudi doloceno funkcijo shranimo v neko datoteko. Denimo ustvarimo datoteko C:\octave_tutoria\coulonova_sila.m . Tokrat naj datoteka vsebuje: function F = coulonova_sila(r,e1,e2) if length(r)~=3 disp('Vektor r ni podan z tremi koordinatami.') else A = (4*pi*8.987551368 * 10**9)**(-1); E = e1 * e2; R = r.**(-2); F = A*E*R end end Sedaj lahko v octave vpisemo octave:1> cd C:\octave_tutoria\ octave:2> coulonova_sila([1 2 3],1,1) ans = 8.8542e-12 2.2135e-12 9.8380e-13 Seveda ce preverimo na kalkulator, funkcija izracuna pravilno vse tri vektorje. 8 8.1 Druge uporabne funkcije Sistem linearnih enacb Snov Matematike 2 bo med drugim, kako resiti sistem n-tih enacb z n neznankami. Povedali boste da lahko tak sistem enacb: 3x + 4y - z = 1 -x – 6y + 2z = 0 0x + 3y + 5z = -3 x,y,z = ?? Prepisemo v tako (cudno) obliko 3 4 −1 1 ∗ X = −1 −6 2 0 0 3 5 −3 Kjer je X Navpicni vektor X = [x;y;z] Napisimo to v octave in izracunajmo vektor X octave:1> A = [3 4 -1; -1 -6 2; 0 3 5]; octave:2> B = [1 0 -3]'; %navpicni vektor octave:3> %Uporabimo operator \ (pazi narobe obrnjena posevnica) octave:4> X = A\B ans = 1.0000e+00 1.1102e-16 -3.0000e+00 Dobili smo torej rezultate x = 1, y = -3. Medtem ko y na prvi pogled mogoce ni razvidno, y je namrec 0.0000000000000001102. Kar seveda z veseljem zaokrozimo na 0. Tudi kasneje boste opazili pojav, da 0 tezko zadanemo. Vedno zgresimo za zelo majhne odstotke odstotkov. Kako preverimo pravilnost rezultata? Z ukazom A * ans bi nam moral dati vektor B 8.2 Integriranje Numericno integriramo dano funkcijo z imenom moja_ne_cisto_prva_funkcija od minimuma 0.3 do maksimuma 3.2 s funkcijo quad takole: octave:1> quad('moja_ne_cisto_prva_funkcija', 0.3, 3.2) 8.3 Odvajanje Recept: octave:1> x = -10:0.1:10; octave:2> dy = diff(funkcija(x)); octave:3> dx = diff(x); octave:4> odvodY = dy ./ dx; Obrazlozitev: • drugi korak: diff(vektor) = [vektor(2)-vektor(1) vektor(3)-vektor(2) ... vektor(n)-vektor(n-1)] Torej naredi vektor z n-1 cleni. Ti cleni so enaki razliki med sosednjima clenoma • Zadnji korak deli odseke med sabo. Torej to ni odvod v smislu limita h->0 marvec h=dx. Ce ne verjamite, naredite odvod cosinusa in preverite, ce dobimo sinus. 8.4 Iskanje nicel polinoma Kaj bi dali v srednji soli za to stvar sredi kontrolne pri matematiki? Torej ideja je: 3 2 x −2∗x +6 x−3=0 Pretvorimo v vektor x = [1 -2 6 -3] In ga vrzemo v funkcijo roots() dobimo ans = 0.71025 + 2.16157i 0.71025 - 2.16157i 0.57951 + 0.00000i 8.5 Polno drugega Skozi studij boste odkrivali nove in nove matematicne metode za opis naravnih pojavov ter obdelavo teh podatkov. In tam vam bo velikokrat prisel ta odlicni odprtokodni paket prav. 9 Literatura Google – Vse, ampak res vse lahko izves z dobrim google (ali bing ali ddg.gg) iskalnim terminom. Tukaj praksa dela mojstra help – Vedno pa ni potreba po googlanju. Vse preveckrat pridejo help strani na pomoc Octavetut – http://goo.gl/6AQUy. Na podlagi tega tutoriala sem sestavil ta vodic. Vsekakor ustrezno dodatno branje za tiste ki si zelijo vec. Tukaj gre zahvala Cambridge univerzi, ker ima svoj lastni vodic prosto na voljo. GNU Octave manual http://www.gnu.org/software/octave/doc/interpreter/ . Uradni manual za ta program. To je nekako ogromna knjiga, ki predvideva ogromno predznanja matematike. Vendar pa je tu se bolj na siroko in z primeri razlozena vsaka funkcija (v primerjavi z vgrajenim help-om), tako da vsekakor odlicen vir. MATLAB – Je program, ki je navdihnil nastanek Octave. Ima zelo podobno (v vecini primerih isto) sintakso kot Octave (sintaksa je nacin vnosa funkcij. Od tega, da uporablja oglate oklepaje za matrike, do tega da ima iste funkcije za risanje grafov, racunanje integralov,...). Zato je vsaka knjiga za MATLAB tudi dobra osnova za ucenje tukaj uporabljenega programa In se veliko knjig, clankov, navsezadnje pa se tudi Octave iz dneva v dan spreminja in dopolnjuje, tako da nikoli ne bomo vedeli vsega, kar zmore :) Na zadnji strani je objavljen se kratki Cheetsheet, oziroma zaradi manjka slovenske besede plonki. Licenca tega dokumenta je Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)