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)