Python Skripta

117
PYTHON U RA ˇ CUNARSKOM INŽENJERSTVU stefan ivi ´ c , bojan crnkovi´ c i jerko škifi ´ c Numeriˇ cke metode, priprema, obrada i vizualizacija podataka 6. travnja 2013.–v0.1

Transcript of Python Skripta

Page 1: Python Skripta

P Y T H O N U R A C U N A R S K O M I N Ž E N J E R S T V U

stefan ivic , bojan crnkovic i jerko škific

Numericke metode, priprema, obrada i vizualizacija podataka

6. travnja 2013. – v0.1

Page 2: Python Skripta

Stefan Ivic, Bojan Crnkovic i Jerko Škific: Python u racunarskom inže-njerstvu, Numericke metode, priprema, obrada i vizualizacija poda-taka, c© 6. travnja 2013.

Page 3: Python Skripta

S A D R Ž A J

i osnove python-a 1

1 uvod 3

1.1 Instalacija 3

1.1.1 Instalacija na Linux platformi 3

1.1.2 Instalacija na Windows platformi 4

1.2 Dodatni paketi 4

1.2.1 Dodatni paketi na Linux platformi 4

1.2.2 Dodatni paketi na Windows platformi 4

1.2.3 Instalacija pomocu upravitelja paketa 5

1.3 Editori i razvojna okruženja 5

1.3.1 Spyder 5

1.3.2 PyDev 5

1.3.3 Kate 6

2 python ljuska i .py skripte 9

2.1 Pokretanje Pythona 9

2.2 Python ljuska kao kalukulator 9

2.3 Python skripte 10

2.3.1 Upotreba posebnih znakova 10

2.4 Moduli 10

2.5 Ispravljanje grešaka u Pythonu 12

3 tipovi podataka 15

3.1 Brojevi 16

3.2 String 17

3.3 Liste 19

3.4 Tuple 21

3.5 Dictionary 22

3.6 Skupovi 23

4 operatori 25

4.1 Aritmeticki operatori 25

4.2 Relacijski operatori ili operatori usporedivanja) 26

4.3 Operatori dodjeljivanja 26

4.4 Logicki operatori 27

4.5 Clanski operatori 27

4.6 Operatori identiteta 28

5 osnovne naredbe za unos i ispis podataka 29

5.1 print 29

5.2 input 30

5.3 raw_input 30

6 uvjetna grananja 31

6.1 if 31

6.2 else 32

iii

Page 4: Python Skripta

iv sadržaj

6.3 elif 33

7 petlje 37

7.1 for 37

7.2 while 38

7.3 break 39

7.4 continue 39

8 funkcije 41

8.1 Definiranje i pozivanje funkcija 41

8.2 Vracanje vrijednosti iz funkcije 42

8.3 Argumenti sa zadanim vrijednostima 43

8.4 Keyword i non-keyword argumenti 44

8.5 Ugnježden definicija funkcije 44

8.6 Lambda funkcije 45

9 python standard library 47

9.1 Matematicke funkcije 47

ii numpy polja i matrice 49

10 zadavanje polja u numpy-u 51

10.1 array 51

10.2 arange 52

10.3 linspace 53

10.4 zeros 53

10.5 ones 54

10.6 eye 54

10.7 diag 55

10.8 meshgrid 56

11 manipulacije sa numpy poljima 57

11.1 Manipulacije sa dimenzijama polja 57

11.2 Transponiranje 58

11.3 Dodavanje i brisanje elemenata polja 59

12 numpy matrice 61

iii priprema , obrada i vizualizacija podataka 63

13 osnovni 2d grafovi 65

13.1 Linijski grafovi 65

13.2 Naprednija kontrola linijskih grafova 69

13.3 Svojstva prozora, prostora crtanja i osi 70

13.4 Dodavanje teksta i pomocnih objekata 71

13.4.1 Naslov 71

13.4.2 Legenda 71

13.5 Spremanje grafova 71

13.6 Polarni grafovi 71

13.7 tips and tricks 71

iv numericke metode 73

14 rješavanje nelinearnih funkcija 75

Page 5: Python Skripta

sadržaj v

14.1 Metoda bisekcije 75

14.2 Newtnova metoda 76

14.3 Brentova metoda 76

15 interpolacije 77

15.1 1D interpolacija 77

15.2 2D i N-D interpolacija 78

v rješavanje modela temeljenih na odj i pdj 81

16 pocetni problemi 83

16.1 Modeliranje otvorenog vodotoka 83

16.1.1 Stacionarno strujanje 85

16.1.2 Maningova formula 86

16.1.3 Uniformno strujanje i normalna dubina 87

16.1.4 Kriticna dubina 89

16.1.5 Hidraulicki skok 89

16.1.6 Numericko rješavanje 91

17 rubni problemi 93

17.1 Savijanje grede 93

17.2 Stacionarno provodenje topline u štapu 95

vi optimizacijske metode 97

18 evolucijski algoritmi 99

vii dodaci 101

a appendix test 103

Page 6: Python Skripta

P O P I S S L I K A

Slika 1 Spyder razvojno okruženje 6

Slika 2 Kate tekstualni editor 7

Slika 3 Dijagram toka if naredbe 31

Slika 4 if-else dijagram toka 32

Slika 5 Dijagram toka za složeni uvjet grananja 34

Slika 6 Dijagram toka while petlje 38

Slika 7 Matplotlib elementi 65

Slika 8 Graf napravljen izvodenjem izvronog koda 29 66

Slika 9 Graf napravljen izvodenjem izvronog koda 30 69

Slika 10 Prikaz legende ma grafu 71

Slika 11 Primjer razlicitih 1D interpolacija 78

Slika 12 Primjer 2D interpolacije 80

Slika 13 Skica poprecnog presjeka otvorenog vodotoka 84

Slika 14 Energetske linije u strujanju fluida otvorenimvodotokom 84

Slika 15 Pravokutni poprecni presjek kanala 87

Slika 16 Trapezni poprecni presjek kanala 88

Slika 17 M-krivulje vodnog lica 91

Slika 18 S-krivulje vodnog lica 91

Slika 19 Numericko rješenje strujanja u otvorenom ka-nalu pravokutnog presjeka 92

Slika 20 Progib elasticne linije grede 95

vi

Page 7: Python Skripta

P O P I S TA B L I C A

Tablica 1 Primjeri oznacavanja brojeva 17

Tablica 2 Aritmeticki operatori 25

Tablica 3 Relacijski operatori 26

Tablica 4 Operatori dodjeljivanja 26

Tablica 5 Logicki operatori 27

Tablica 6 printf formatiranje 29

Tablica 7 Opis nekih funkcija math modula 47

Tablica 8 Opis nekih funkcija cmath modula 47

Tablica 9 Vrste linija 67

Tablica 10 Simboli boja 67

Tablica 11 Vrste markera 68

Tablica 12 Vrijednosti Manningovog koeficijenta za razli-cite izvedbe kanala. 86

vii

Page 8: Python Skripta

P O P I S I Z V O R N O G K O D A

Izvorni kod 1 Podrška za posebne znakove u Python skrip-tama 10

Izvorni kod 2 Korištenje objekata modula 11

Izvorni kod 3 Upotreba dbg modula 13

Izvorni kod 4 Dodavanje i brisanje elemenata liste 20

Izvorni kod 5 Primjer kombiniranje operatora dodjeljivanja,operatora usporedivanja i logickih operatora 27

Izvorni kod 6 Razliciti primjeri ispisa 29

Izvorni kod 7 Jednostavan primjer upotrebe if naredbe 31

Izvorni kod 8 Pisanje složenijeg uvjetovanog grananja 32

Izvorni kod 9 Primjer upotrebe else naredbe 33

Izvorni kod 10 Primjer kombinacije naredbi if, elif i else 34

Izvorni kod 11 Upotreba for naredbe 37

Izvorni kod 12 Naredba for s listom stringova 37

Izvorni kod 13 Naredba for i stirng 37

Izvorni kod 14 Naredba for s listom stringova 38

Izvorni kod 15 Upotreba while naredbe 38

Izvorni kod 16 Upotreba else naredbe u petlji 39

Izvorni kod 17 Upotreba break naredbe 39

Izvorni kod 18 Upotreba continue naredbe 39

Izvorni kod 19 Definicija i pozivanje jednostavne funkcije 41

Izvorni kod 20 Definicija funkcije koja prima argument 42

Izvorni kod 21 Definicija funkcije koja prima više argumenatai vraca vrijednost 42

Izvorni kod 22 Funkcija koja vraca razlicite tipove 43

Izvorni kod 23 Funkcija koja vraca više vrijednosti korsiteci tu-ple 43

Izvorni kod 24 Funkcija sa zadanim argumentom 43

Izvorni kod 25 Spremanje elemenata dijagonale matrice u vek-tor 55

Izvorni kod 26 Mijenjanje dimenzija polja 57

Izvorni kod 27 Mijenjanje dimenzija polja 58

Izvorni kod 28 Transponiranje matrica 58

Izvorni kod 29 Jednostavan graf 66

Izvorni kod 30 Kontrola linija i markera 68

Izvorni kod 31 Prikaz legende na grafu 71

Izvorni kod 32 Primjer pronalaženja korijena funkcija metodombiskecije 75

Izvorni kod 33 Primjer razlicitih 1D interpolacija 77

Izvorni kod 34 Primjer linearne i kubicne 2D interpolacije 79

Izvorni kod 35 Strujanje u pravokutnom kanalu 91

viii

Page 9: Python Skripta

Popis izvornog koda ix

Izvorni kod 36 Rješavanje elasticne linije savijanja 94

Page 10: Python Skripta

x Popis izvornog koda

Page 11: Python Skripta

A C R O N Y M S

DRY Don’t Repeat Yourself

API Application Programming Interface

UML Unified Modeling Language

xi

Page 12: Python Skripta
Page 13: Python Skripta

Dio I

O S N O V E P Y T H O N - A

Python je skriptni programski jezik opce namjene.

Page 14: Python Skripta
Page 15: Python Skripta

1U V O D

Zašto Python? Postoje mnogi razlozi zašto odabrati Python kao inže-njerski alat

• Odlican za pocetnike a istodobno mocan za strucnjake

• Skalabilan, pogodan za velike projekte, kao i one male

• Omogucuje brz razvoj

• Cross-platform, omogucuje razvoj i izvršavanje koda na gotovosvim platformama i arhitekturama

• Ugradiv u kodove pisane u drugim programskim jezicima

• Proširiv sa drugim programskim jezicima

• Objektno orjentiran

• Uredna i elegantna sintaksa

• Stabilan

• Bogatstvo dostupnih paketa i biblioteka

• Specijelizirani paketi za numeriku, statistiku, obradu podatakai vizualizacije

• Otvoreni besplatni kod koji održava velika zajednica progra-mera i znanstvenika

1.1 instalacija

1.1.1 Instalacija na Linux platformi

Gotovo sve Linux distribucije sadže Python pakete u osnovnim repo-zitorijima, ali i vcina distribucija ima inicijalno instaliran Python.

Na openSUSE distribuciji, Python se može instalirati jednostavnomnaredbom:

sudo zypper in python

Nakon instalacije Pythona, možemo provjeriti koja je putanja pythonizvršne datoteke

user@machine:~> type python

python is /usr/bin/python

3

Page 16: Python Skripta

4 uvod

1.1.2 Instalacija na Windows platformi

Za instalaciju Pythona na Windows platformi potrebno je preuzetiinstalacijsku datoteku sa http://www.python.org. Nakon preuzima-nja, pokretanjem instalacijske datoteke zapocinje isntalacijki programkoji omogucuje uredivanje postavki Python instalacije.

Uobicajena je instalacija Pythona zajedno sa dodatnim paketima,na Windows platformi, preko neke od dostupnih Python distribucija(vidi poglavlje 1.2.2.1).

1.2 dodatni paketi

Velika snaga Pythona je dostupnost velikog broja paketa raznih na-mjena. Za inženjerske potrebe, potrebni su dodatni paketi koji omo-gucavaju matricni racun, numericke metode, statisticku obradu po-dataka, vizualizacije, izradu animacija i druge specijalizirane moguc-nosti.

Osnovni paketi, koji ce biti korišteni u ovoj skripti, su:

• Numpy (http://www.numpy.org/),

• SciPy (http://www.scipy.org),

• matplotlib (http://matplotlib.org/) i

• IPython (http://ipython.org/).

Za instalaciju dodatnih python paketa postoje alati za upravlja-nje Python paketima. Najpoznatiji su easy_install, koji dolazi savecinom Python distribucija te pip. pip se može instalirati pomocueasy_install-a:

user@machine:~> sudo easy_install pip

1.2.1 Dodatni paketi na Linux platformi

Za instalaciju dodatnih paketa na openSUSE distribuciji pokrenite na-redbu:

user@machine:~> sudo zypper in python-numpy python-scipy \\

python-matplotlib IPython

1.2.2 Dodatni paketi na Windows platformi

1.2.2.1 Python distribucije

Python distribucije su objedinjane instalacije pythona, raznih dodat-nih paketa te cesto i tekstualnih editora ili razvoijnih okruženja. Dis-tribucije su vecinom ciljane za Windows platformu zbog neprakticnevišestruke instalacije svakog pojedinog softwarea.

Page 17: Python Skripta

1.3 editori i razvojna okruženja 5

Neke od najpopularnijih Python distribucija su:

• pythonxy (http://code.google.com/p/pythonxy/)

• ActivePython (http://www.activestate.com/activepython)

• Entought Python (http://www.enthought.com/python/)

• winpython (http://code.google.com/p/winpython/)

• PortablePython (http://portablepython.com/)

1.2.3 Instalacija pomocu upravitelja paketa

Python upravitelji paketa omogucuju jednostavno instalaciju, osvje-žavanje ili deinstalaciju raznih Python paketa. Iako upravitelji paketanisu dio Pythona, cesto bar jedan upravitelj dolazi sa osnovnom ins-talacijom Pythona.

Valja izdvojiti dva upravitelja python paketa:

• setuptools https://pypi.python.org/pypi/setuptools

• pip https://pypi.python.org/pypi/pip

Primjer instalacije paketa pomocu upravitelja setuptools sa nared-bom easy_install:user@machine:~> sudo easy_install ime_paketa

Primjer instalacije paketa sa naredbom pip:user@machine:~> sudo pip install ime_paketa

1.3 editori i razvojna okruženja

Python koristi pokrece kod iz obicnih tekstualnih datoteka koje jemoguce uredivati u mnogim tekstualnim editorima.

Razvojna okruženja (eng. Integrated Development Environment, IDE),osim što omogucavaju uredivanje koda, sadrže niza alata za lakši ibrži razvoj kao što su jednostavno pokretanje koda iz IDE-a, debug-iranje koda, pracenje ispisa i dr.

1.3.1 Spyder

Spyder (http://code.google.com/p/spyderlib/) je interaktivno ra-zvojno okruženje za Python namjenjeno za znastvenu i inženjerskuprimjenu. Spyder je dostupan za vecinu platformi.

1.3.2 PyDev

PyDev (http://pydev.org/) je dodatak za Eclipse (http://www.eclipse.org/) razvojno sucelje koji nudi mogucnosti za rad sa Python-om.

Page 18: Python Skripta

6 uvod

Slika 1: Spyder razvojno okruženje

1.3.3 Kate

Kate (http://kate-editor.org/) je mocan tekstualni editor, iako radii na Windows platformi, primarno je namjenjen za Linux platformu.

Na openSUSE-u, Kate se može instalirati naredbom:

user@machine:~> sudo zypper in kate

Page 19: Python Skripta

1.3 editori i razvojna okruženja 7

Slika 2: Kate tekstualni editor

Page 20: Python Skripta
Page 21: Python Skripta

2P Y T H O N L J U S K A I . P Y S K R I P T E

Python je interpretirani jezik, a jednostavni Python izrazi mogu se iz-voditi u interaktivnom programskom okruženju pod nazivom ljuska.

2.1 pokretanje pythona

Najjednostavniji nacin za otvaranje Python ljuske (eng. shell) na Win-dows platformi je pokrenuti IDLE, dok je ne Linux platformi dovoljnopokrenuti Python naredbu u terminalu/konzoli. Nakon pokretanjaPythona prikazuju se osnovne informacije o Pythonu (verzija) te tzv.prompt koji je simboliziran sa tri strelice u desno (> > >).

user@machine:~> python

Python 2.7.3 (default, Apr 14 2012, 08:58:41) [GCC] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

2.2 python ljuska kao kalukulator

Python ljuska odmah izvršava unešene naredbe nakon pritiska natipku Enter (Return). Najjednostavniji Python izrazi su matematickeoperacije pomocu kojih možemo koristiti Python ljusku kao kalkula-tor. Izracun te ispis rezultata matematickih izrazi dešava se u novomretku terminala ili IDLE-a:

>>> 1+1

2

>>>

Matematicke operacije, naravno, možemo medusobno kombinirati ipri tome koristiti zagrade za definiranja redoslijeda operacija. Oprez! Prilikom

dijeljenja cijelihbrojeva rezultat jecijeli broj! Koddecimalnih brojevaobavezno koristitidecimalnu tocku.

>>> 1/5

0

>>> 1./5.

0.2

>>> 1./(5.+2)

0.14285714285714285

>>>

Ljuska može raditi i bazicne operacije sa tekstom tj. nizovima znakova(string).

>>> "Kratki " + "probni " + "tekst."

’Kratki probni tekst.’

>>>

9

Page 22: Python Skripta

10 python ljuska i .py skripte

2.3 python skripte

Python skripte su tekstualne datoteke s ekstenzijom *.py koje sadržePython kod. Izvršavanje .py skripte, zapravo, se pokrece linija po li-nija kao da se je unosi u Python ljusku. Ovo je ocita prednost, pogo-tovo prilikom pokretanja više od nekoliko naredbi.

Datoteke sa ekstenzijom .py, osim kao skripte, koriste se i za defini-ranje vlastitih modula što je detaljnije opisano u poglavlju 2.4.

Osnovni nacin pokretanja python skripte je pokretanje Pythona saspecificiranim .py fajlom:user@machine:~$ python imeskripte.py

Python ce se pokrenuti i izvršiti kod zapisan u skripti.Nakon završetkaizvodenja skriptepomocu python

skripta.py Pythonse gasi!

Ako je prva linija skripte:1 #!/usr/bin/python

tada se na Unix sustavima može izvršavati u terminalu. Za pokretanjeskripte u terminalu nužno je da skripta koristi Unix oznaku za krajreda te da ima dozvole za izvršavanje:user@machine:~$ chmod +x imeskripte.py

Ako je .py datoteka izvršna, tada se može direktno izvršavati:user@machine:~$ ./imeskripte.py

Na Windows sustavima datoteke s ekstenzijom *.py su kod inta-lacije Pythona pridružene programu python.exe. Python skripta sepokrece dvostrukim lijevim klikom miša na skriptu.

2.3.1 Upotreba posebnih znakova

Da bi se koristilo posebne znakove (npr. slova sa kvacicama ili sim-boli) u stringovima, potrebno je u prvoj ili drugoj liniji skripte upisatiposeban komentar:# -*- coding: utf-8 -*-

Izvorni kod 1: Podrška za posebne znakove u Python skriptama

1 #!/usr/bin/python

2 # -*- coding: utf-8 -*-

3

4 print ’Sada možemo koristi slova sa kvacicama!’

5 print ’Ali i razne simbole kao što su ◦ & $’

2.4 moduli

Modul je Python objekt, definiran u odredenoj datoteci, koji sadrži de-finicije varijabli, funkcija i klasa. Obicno su varijable, funkcije i klaseodredenog modula specijalizirane namjene, pa se module može inter-pretirati kao grupiranje koda i najcešce je taj kod slicne namjene.

Page 23: Python Skripta

2.4 moduli 11

Npr. modul math (obraden u poglavlju 9.1) sadrži varijable pi i ekoje predstavljaju matematicke konstante te niz matematickih funk-cija kao što su sqrt, log, pow, exp, sin, cos itd.

Da bi se objekti odredenog modula mogli koristiti u kodu, potrebnoje ucitati (importirati) modul ili ucitati odredeni objekt iz modula.

Ucitavanje modula vrši se pomocu naredbe import cija je osnovnasintaksa

import module_name

gdje je module_name ime modula.Nakon što je modul ucitan, može se koristiti objekte modula (va-

rijable, funkcija i klase) tako da se unese ime modula, tocka te imeobjekta koji se želi koristiti.

Jednom naredbom import može se ucitati više modula na slijedecinacin:

import module1, modul2, modul3

Ucitanom modulu se može dodijeliti novo ime. To se može napra-viti pomocu kljucne rijeci as:

import module_name as new_name

nakon cega se modul može koristiti pomocu novog imena.Moduli cesto sadržavaju velik broj objekata, a njihovim ucitavanjem

bespotrebno se troše memorijski i procesorski resursi. Kako bi se izbje-glo ucitavanje cijelog modula, moguce je iz odredenog modula ucitatisamo odredene objekte:

from module_name import object_name

Ako se direktno ucita objekte iz modula, tada ih se koristiti samopreko imena objekta. Kao i sam modul, moguce je ucitati objekt nekogmodula pod novim imenom:

from module_name import object_name as object_new_name

Za ucitavanje svih objekata odredenog modula koristi se:

from module_name import *

Izvorni kod 2: Korištenje objekata modula

1 #!/usr/bin/python

2

3 # importiraj sys modula

4 import sys

5 print sys.platform # ispisi platformu (operaticni sustav)

6 print sys.version # ispisi verziju Pythona

7

8 # importiraj modul math kao m

9 import math as m

10 print m.pi # ispisi vrijednost broja pi

11 print m.sin(m.pi/2.0) # ispisi vrijednost kosinusa kuta pi/2

12

13 # iz modula datetime importiraj objekt date

Page 24: Python Skripta

12 python ljuska i .py skripte

14 from datetime import date

15 print date.today() # ispisi danasnji datum

16

17 # iz modula random importiraj funkciju random kao nasumicni

18 from random import random as nasumicni

19 print nasumicni() # ispisi nasumicni broj

20

21 # Importiraj sve objekte iz modula string

22 from string import *23 print uppercase # ispis svih velikih slova

24 print lowercase # ispis svih velikih slova

25 print digits # ispis svih znamenaka

linux2

2.7.3 (default, Apr 14 2012, 08:58:41) [GCC]

3.14159265359

1.0

2013-03-05

0.952486831091

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789

2.5 ispravljanje grešaka u pythonu

Python ima modul pdb („Python DeBugger") koji pomaže kod otkri-vanja i ispravljanja gršaka u kodu skripte. Ako ne koristite neki spe-cijalizirani editor unutar nekog razvojnog okruženja tada je potrebnopozvati pdb modul na pocetku skripte:

1 import pdb

Na nekom kljucnom mjestu u kodu na kojem se želite zaustaviti mo-rate staviti naredbu:

1 pdb.set_trace()

na primjeru 3 može se vidjeti upotreba pdb modula.Ako koristite editor Spyder tada nije nužno pozvati pdb modul. Do-

voljno je postaviti prekide u kodu dvostrukim lijevim klikom na lije-voj strani dokumenta i pokrenuti skriptu u Debug nacinu rada.

Izvršavanje koda ce se zaustaviti na mjestu koje ste oznacili ulaziteu pdb modul, a u konzoli ce se pojaviti tekst:

(Pdb)

Unutar pdb modula moguce je kontrolirati izvršavanje koda, a naj-cešce se koriste naredbe:

• n (next) izvršava se sljedeca naredba u skripti,

• c (continue) izvrešava se ostatak skripte do sljedeceg prekida,

• s (step into) pdb ulazi u podprogram ili funkciju,

Page 25: Python Skripta

2.5 ispravljanje grešaka u pythonu 13

• r (return) slicno kao naredba c, ali pdb izvršava ostatak podpro-grama ili funkcije do izlaza iz podprograma,

• p var (print) pdb istpis stanja varijable var

• ENTER pdb izvršava zadnju naredbu koja mu je poslana,

• q (quit) zaustavlja izvršavanje skripte.

Izvorni kod 3: Upotreba dbg modula

1 #!/usr/bin/python

2 import pdb

3

4 pdb.set_trace()

5 a=0

6 b=1

7 c=2

8 pdb.set_trace()

9 a=b+c

10 pdb.set_trace()

11 a=b-c

12 print ’kraj’

Page 26: Python Skripta
Page 27: Python Skripta

3T I P O V I P O D ATA K A

Varijable se ne moraju explicitno deklarirati. Naime, deklaracija se de-šava prilikom pridruživanja vrijednosti varijabli. Odnosno, varijablese pridružuju memorijskim lokacijama na kojima je zapisana vrijed-nost. Znak jednakosti = se koristi za pridruživanje vrijednosti varija-blama. Na primjer:

1 #!/usr/bin/python

2

3 brojac = 100 # Integer

4 duljina = 1000.0 # Float

5 ime = ’Hrvoje’ # String

6

7 print brojac

8 print duljina

9 print ime

Ovdje su 100, 1000.0 i Hrvoje vrijednosti pridružene varijablamabrojac, duljina i ime. Program ce producirati sljedeci rezultat:

100

1000.0

Hrvoje

Moguce je pridružiti jednu vrijednost u više varijabli. Tada sve va-rijable gledaju na istu memorijsku lokaciju. Odnosno:

1 #!/usr/bin/python

2 a = b = c = 1

3 c = 5

4 print a

što rezultira

5

Takoder je moguce pridružiti više vrijednosti u više varijabli.

1 #!/usr/bin/python

2 a, b, c = 1, 2, ’Hrvoje’

Varijablama a i b se pridružuju memorijske lokacije na kojima su zapi-sane vrijednosi 1 i 2, dok je varijabli c pridružena memorijska lokacijana kojoj je zapisana vrijednost Hrvoje.

Varijable te njihov memorijski prostor moguce je pobrisati nared-bom del.

>>> a = 10

>>> print a

10

>>> del a

>>> print a

Traceback (most recent call last):

15

Page 28: Python Skripta

16 tipovi podataka

File "<stdin>", line 1, in <module>

NameError: name ’a’ is not defined

>>> b = c = 2

>>> print b, c

2 2

>>> del b

>>> print b, c

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ’b’ is not defined

>>> print c

2

Python podržava pet osnovnih tipova podataka;

• Numbers

• String

• List

• Tuple

• Dictionary

Tip podataka odredene varijable može se dobiti naredbom type:

>>> a=10

>>> b=11.2

>>> c=’Rijeka’

>>> type(a), type(b), type(c)

(<type ’int’>, <type ’float’>, <type ’str’>)

3.1 brojevi

To su nepromjenjivi(immutable) tipovi podataka, odnosno promjenavrijednosti rezultira novim alociranim objektom. Numericki tip po-datka se kreira pridruživanjem vrijednosti varijabli. Odnosno

1 #!/usr/bin/python

2 var1 = 1

3 var2 = 10

Takoder je moguce pobrisati referencu na numericki objekt koristecidel naredbu. Sintaksa izgleda ovako:

del var1[,var2[,var3[....,varN]]]]

Primjer:

1 #!/usr/bin/python

2 del var

3 del var_a, var_b

Python podržava cetiri numericka tipa

• int

Page 29: Python Skripta

3.2 string 17

• long

• float

• complex

Nekoliko primjera oznacavanja numerickih podataka ja prikazana uTablici 1. Moguce je koristiti i malo slovo L za oznaku long, iako se

int long float complex

10 51924361L 0.0 3.14j

100 -0x19323L 15.20 45.j

-783 0122L -21.9 9.322e-36j

-0490 0xDEFABCECBDAECBFBAEl -90. .876j

-0x260 535633629843L -32.54e100 .6545+0J

0x69 -052318172735L 70.2-E12 4.53e-7j

Tablica 1: Primjeri oznacavanja brojeva

takvo oznacavanje ne preporuca zbog velike slicnosti sa brojem 1.

3.2 string

Iako je mogucedefinirati string sajednostrukim idvostrukimnavodnicima,preporuka je da sekoriste jednostrukinavodnici.

Stringovi su definirani kao slijed znakova izmedu navodnika, jednos-trukih (apostrofi) ili dvostrukih. Jednom zadane stringove je nemo-guce mijenjati jer su stringovi, u Pythonu, nepromjenjivi (imutable)tip podatka. Niz funkcija koje rade promjene nad string varijabamazapravo kreiraju kopije izvorne string varijable.

Dijelove stringova (znakove ili niz znakova - string) je moguce do-hvatiti operatorima [] i [:] sa indeksima koji pocinju od 0 na pocetkustringa sve do -1 na kraju.

Znak plus (+) oznacava spajanje (concatenation), a asterisk (∗) jeoperator ponavljanja. Odnosno:

1 #!/usr/bin/python

2

3 str = ’Hello World!’ # zadavanje sa jednostrukim navodnicima

4 ime = "Rudi" # zadavanje sa dvostrukim navodnicima

5

6 print str, ime # print cijelog stringa

7 print str[0] # print prvog znaka u stringu

8 print str[2:5] # print od treceg do petog znaka

9 print str[2:] # print znakova od treceg do zadnjeg

10 print str * 2 # print stringa dva puta

11 print str + ’TEST’ # print concatenated string

Što ce rezultirati

Hello World! Rudi

H

llo

Page 30: Python Skripta

18 tipovi podataka

llo World!

Hello World!Hello World!

Hello World!TEST

Nad stringovima je moguce izvoditi niz specijaliziranih operacijapomocu funkcija koje su dostupne za varijable tipa string.

Funkcije za pretraživanje stringova:

count(sub[, start[, end]])

endswith(suffix[, start[, end]])

find(sub[, start[, end]])

index(sub[, start[, end]])

rfind(sub [,start [,end]])

rindex(sub[, start[, end]])

startswith(prefix[, start[, end]])

Funkcije za mjenjanje znakova:

expandtabs([tabsize])

replace(old, new[, count])

translate(table[, deletechars])

Funkcije za provjeru vrste znakova:

isalnum()

isalpha()

isdigit()

isspace()

Funkcije za rad sa velikim i malim slovima:

capitalize()

islower()

istitle()

isupper()

lower()

swapcase()

title()

upper()

Funkcije za poravnanje teksta:

center(width[, fillchar]

ljust(width[, fillchar])

rjust(width[, fillchar])

zfill(width)

Funkcije za spajanje i razdvajanje stringova:

join(seq)

partition(sep)

rpartition(sep)

split([sep [,maxsplit]])

splitlines([keepends])

rsplit([sep [,maxsplit]])

Funkcije za brisanje pocetnih i krajnjih znakova:

lstrip([chars])

rstrip([chars])

strip([chars])

Funkcije za encoding stringova:

Page 31: Python Skripta

3.3 liste 19

decode([encoding[, errors]])

encode([encoding[,errors]])

3.3 liste

Lista sadrži podatke odvojene zarezima i omedene uglatim zagra-dama. Iako je slicna listama u C jeziku, podaci python liste mogubiti razlicitog tipa. Kao i kod stringova, pristupanje vrijednostima ulisti je moguce pomocu operatora [ ] i [ : ] sa indeksima koji pocinjuod 0 na pocetku stringa sve do -1 na kraju. Znak plus (+) se koristi zaoperator spajanja (concatenation) stirngova, a asterisk (∗) je operatorponavljanja Iako lista može biti

heterogena(sadržavati razlicitetipove podataka),preporuka je koristitilistu kao spremnikhomogenih podataka.Za heterogenepodatke se preporucatuple (poglevlje3.4)

1 #!/usr/bin/python

2

3 list = [ ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 ]

4 tinylist = [123, ’hrvoje’]

5

6 print list # print cijele liste

7 print list[0] # print prvog elementa liste

8 print list[1:3] # print od drugog do treceg elementa liste

9 print list[2:] # print od treceg do zadnjeg elementa

10 print tinylist * 2 # print liste dva puta

11 print list + tinylist # print concatenated lists

Što ce rezultirati

[’abcd’, 786, 2.23, ’hrvoje’, 70.2]

abcd

[786, 2.23]

[2.23, ’hrvoje’, 70.2]

[123, ’hrvoje’, 123, ’hrvoje’]

[’abcd’, 786, 2.23, ’hrvoje’, 70.2, 123, ’hrvoje’]

Za manipulaciju listama cesto se koristi naredba len za provjerubroja elemenata liste, naredbom insert se umece novi element u listute naredba del kojom se brišu pojedini elementi iz liste.

1 #/user/bin/python

2

3 list = [2,3,4,5]

4 print(len(list)) #broj elemnata u listi

5 print list

6 list.insert(0,1) #umetanje elementa 1 u listu na prvu poziciju

7 print list

8 del list[-1] #brisnje zadnjeg elementa iz liste

9 print list

4

[2, 3, 4, 5]

[1, 2, 3, 4, 5]

[1, 2, 3, 4]

Naredbom range moguce je stvoriti listu brojeva u aritmetickomnizu što je cesto potrebno kod korištenja for petlje (poglavlje 7.1).Sintaksa naredbe range je

Page 32: Python Skripta

20 tipovi podataka

range(stop),

range(start, stop),

range(start, stop, step),

gdje je start prvi element, stop je gornja granica i step je korakaritmetickog niza.

1 #/user/bin/python

2

3 list=range(7) # aritmeticki niz 0,..,6

4 print list

5 list = range(2,7) # aritmeticki niz 2,..,6

6 print list

7 list = range(0,7,2) # aritmeticki niz s korakom 2

8 print list

[0, 1, 2, 3, 4, 5, 6]

[2, 3, 4, 5, 6]

[0, 2, 4, 6]

Naredbe za dodavanje elemenata u listu su:

append(x)

insert(i, x)

extend(L)

append dodaje element x na kraj liste, insert ubacuje element x napoziciju i a extend proširuje postojecu listu sa listom L.

Naredbe za brisanje elemenata iz liste su:

remove(x)

pop(i)

del L[index]

remove briše prvi element koji ima vrijednost x a pop briše elementna poziciji i. Naredba del L[index] briše element list L na indeksuindex.

Osim funkcija za brisanje i dodavanje elemenata, Python liste imajujoš ugradenih prakticnih funkcija. index vraca indeks prvog elementakoji ima vrijednost x, count prebrojava sve elemente koji su jednaki x,sort sortira elemente liste a reverse rasporeduje elemente u obrnu-tom redosljedu od inicijalnog.

index(x)

count(x)

sort()

reverse()

Izvorni kod 4: Dodavanje i brisanje elemenata liste

1 ljudi = [’Marko’, ’Mirela’, ’Luka’]

2 nadljudi = [’Chuck’,’Arnold’,’Steven’,’Silvester’]

3

4 ljudi.append(’Igor’)

5 print ljudi

6 nadljudi.insert(1,’Anita’)

7 print ljudi

8 nadljudi.extend(ljudi)

Page 33: Python Skripta

3.4 tuple 21

9 print nadljudi

10

11 nadljudi.pop(1)

12 print nadljudi

13 nadljudi.remove(’Igor’)

14 print nadljudi

15 del nadljudi[4:]

16 print nadljudi

17

18 print ljudi.index(’Marko’)

19 ljudi.append(’Marko’)

20 print ljudi.count(’Marko’)

21

22 nadljudi.sort()

23 print nadljudi

24 nadljudi.reverse()

25 print nadljudi

[’Marko’, ’Mirela’, ’Luka’, ’Igor’]

[’Marko’, ’Mirela’, ’Luka’, ’Igor’]

[’Chuck’, ’Anita’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’,

’Luka’, ’Igor’]

[’Chuck’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’, ’Luka’,

’Igor’]

[’Chuck’, ’Arnold’, ’Steven’, ’Silvester’, ’Marko’, ’Mirela’, ’Luka’]

[’Chuck’, ’Arnold’, ’Steven’, ’Silvester’]

0

2

[’Arnold’, ’Chuck’, ’Silvester’, ’Steven’]

[’Steven’, ’Silvester’, ’Chuck’, ’Arnold’]

3.4 tuple

Tuple je tip podatke slican listi. Sastoji se od vrijednosti odvojenihzarezom i za razliku od listi omeden zagradama (). Python dopuštafleksibilnost izostavljanja zagrada prilikom definiranja tuplea.

Postoji mnogo slicnosti sa listama, ali i nekoliko temeljnih razlika:

• pristupanje elementima liste i tuplea vrši se na identican nacin(preko indeksa)

• i list i tuple su iterabilni

• lista može mijenjati broj elemenata i vrijednosti elemenata, doktuple ne može

• nad tupleom se ne mogu provoditi operacije koje mjenjaju samtuple (sort, remove i sl.)

1 #!/usr/bin/python

2

3 tuple = ( ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 )

4 tinytuple = (123, ’hrvoje’)

5

Page 34: Python Skripta

22 tipovi podataka

6 print tuple # print liste

7 print tuple[0] # prints prvog elementa liste

8 print tuple[1:3] # print od drugog do treceg elementa liste

9 print tuple[2:] # print od treceg do zadnjeg elementa

10 print tinytuple * 2 # print liste dva puta

11 print tuple + tinytuple # print liste nastale spajanjem dvije liste

12

13 istotuple = 2, True, ’teskt’ # Zadavanje tuplea bez zagrada

14 print istotuple

Što ce rezultirati

(’abcd’, 786, 2.23, ’hrvoje’, 70.200000000000003)

abcd

(786, 2.23)

(2.23, ’hrvoje’, 70.200000000000003)

(123, ’hrvoje’, 123, ’hrvoje’)

(’abcd’, 786, 2.23, ’hrvoje’, 70.200000000000003, 123, ’hrvoje’)

(2, True, ’teskt’)

Sljedeci kod ce producirati grešku u liniji 5, jer smo pokušali promije-niti vrijednost u tuple-u

1 #!/usr/bin/python

2

3 tuple = ( ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 )

4 list = [ ’abcd’, 786 , 2.23, ’hrvoje’, 70.2 ]

5 tuple[2] = 1000 # greska

6 list[2] = 1000 # ok

Tuple se vrlo cesto koristi za višestruko dodjeljivanje:

>>> a, b, c = 3, 10, ’neki tekst’

>>> print a

3

>>> print b

10

>>> print c

neki tekst

što se cesto koristi prilikom vracanja više vrijednosti iz funkcije (po-glavlje 8.2)

3.5 dictionary

Dictionary možemo smatrati jednostavnim pridruživanjem odnosnopreslikavanjem svih elemenata jednog skupa elementima drugog skupa.

1 #!/usr/bin/python

2

3 dict = {}

4 dict[’jedan’] = ’Ovo je jedan’

5 dict[2] = ’Ovo je dva’

6

7 tinydict = {’ime’: ’hrvoje’,’code’:6734, ’odjel’: ’admin’}

8

9 print dict[’jedan’] # print vrijednosti ’jedan’

10 print dict[2] # print vrijednosti za 2

11 print tinydict # print cijelog dictionary

Page 35: Python Skripta

3.6 skupovi 23

12 print tinydict.keys() # print svih kljuceva

13 print tinydict.values() # print svih vrijednosti

Što ce rezultirati

Ovo je jedan

Ovo je dva

{’odjel’: ’admin’, ’code’: 6734, ’ime’: ’hrvoje’}

[’odjel’, ’code’, ’ime’]

[’admin’, 6734, ’hrvoje’]

Objekti tipa dict nemaju poredane elemente.

3.6 skupovi

>>> basket = [’apple’, ’orange’, ’apple’, ’pear’, ’orange’, ’banana’]

>>> fruit = set(basket) # create a set without duplicates

>>> fruit

set([’orange’, ’pear’, ’apple’, ’banana’])

>>> ’orange’ in fruit # fast membership testing

True

>>> ’crabgrass’ in fruit

False

>>> # Demonstrate set operations on unique letters from two words

...

>>> a = set(’abracadabra’)

>>> b = set(’alacazam’)

>>> a # unique letters in a

set([’a’, ’r’, ’b’, ’c’, ’d’])

>>> a - b # letters in a but not in b

set([’r’, ’d’, ’b’])

>>> a | b # letters in either a or b

set([’a’, ’c’, ’r’, ’d’, ’b’, ’m’, ’z’, ’l’])

>>> a & b # letters in both a and b

set([’a’, ’c’])

>>> a ^ b # letters in a or b but not both

set([’r’, ’d’, ’b’, ’m’, ’z’, ’l’])

Page 36: Python Skripta
Page 37: Python Skripta

4O P E R AT O R I

Operatori su osnovni dio Pythona i omogucuju operacije na varija-blama (operandima). Najcešce se povezuju sa algebarskim matema-tickim operacijama, medutim operatori mogu biti i “ne matematicke”naravi.

Python operatore možemo podjeliti prema namjeni:

• Aritmeticki operatori

• Relacijski operatori ili operatori usporedivanja

• Operatori dodjeljivanja

• Logicki operatori

• Bitovni operatori

• Clanski operatori

• Operatori identiteta

ili s obzirom na broj operanada:

• Unarni operatori (jedan operand)

• Binarni operatori (dva operanada)

4.1 aritmeticki operatori

Aritmeticki operatori omogucuju osnovne matematicke operacije nabrojevima. Rezultat aritmetickog operatora je uvijek broj tj. varijablatipa float ili int, ovisno o tipovima operanada..

Operator Opis Primjer za x=9.0 i y=2.0

+ Zbrajanje x+y daje 11

- Oduzimanje x-y daje 7

* Množenje x*y daje 18

* Dijeljenje x/y daje 4.5

% Ostatak dijeljenja x%y daje 1

// Cjelobrojno dijeljenje x//y daje 4

** Potenciranje x**y daje 81

Tablica 2: Aritmeticki operatori

25

Page 38: Python Skripta

26 operatori

4.2 relacijski operatori ili operatori usporeðivanja)

Relacijski operatori omogucavaju usporedivanje vrrijednosti varijabli.Rezultat relacijskih operatora je varijabla tipa bool i može poprimitivrijednosti (True ili False).

Operator Opis Primjer za x=9.0 i y=2.0

== Jednakost x==y daje False

!= Nejednakost, razlicitost x!=y daje True

<> Nejednakost, razlicitost x<>y daje True

> Vece x>y daje True

>= Vece ili jednako x>=y daje True

< Manje x<y daje False

<= Manje ili jednako x<=y daje False

Tablica 3: Relacijski operatori

4.3 operatori dodjeljivanja

Operator dodjeljivanja služi za dodjeljivanje vrijednosti varijabli. Pos-toje, proširenja kojima se može kombinirati aritmeticke operatore ioperator dodjeljivanja.

Operator Opis Primjer za x=9.0 i y=2.0

= Dodjeljivanje x=y dodjeljuje vrijednost2.0 varijabli x

+= Zbrajanje i dodjeljiva-nje

x+=y je isto što i x=x+y, xpoprima vrijednost 11.0

-= Oduzimanje i dodjelji-vanje

x-=y je isto što i x=x-y, xpoprima vrijednost 7.0

*= Množenje i dodjeljiva-nje

x*=y je isto što i x=x*y, xpoprima vrijednost 18.0

/= Dijeljenje i dodjeljiva-nje

x/=y je isto što i x=x/y, xpoprima vrijednost 4.5

%= Ostatak dijeljenja i do-djeljivanje

x%=y je isto što i x=x%y, xpoprima vrijednost 1.0

//= Cjelobrojno dijeljenje idodjeljivanje

x//=y je isto što i x=x//y,x poprima vrijednost 4.0

**= Potenciranje i dodjelji-vanje

x**=y je isto što i x=x**y,x poprima vrijednost 81.0

Tablica 4: Operatori dodjeljivanja

Page 39: Python Skripta

4.4 logicki operatori 27

4.4 logicki operatori

Logicki operatori and, or i not omogucavaju operacije na bool vari-jablama. and i or su binarni operatori logicko i i logicko ili dok je not

unarni operator logicko ne. Rezultat logickih operatora je uvijek bool

varijabla.

a b a and b a or b not b

True True True True False

True False False True True

False True False True

False False False False

Tablica 5: Logicki operatori

Izvorni kod 5: Primjer kombiniranje operatora dodjeljivanja, operatora us-poredivanja i logickih operatora

1 #! /usr/bin/python

2

3 a = 10

4 b = 1

5 c = 15

6

7 d = a < b

8 print d

9

10 e = a > b and c > b

11 print e

12

13 f = a > c or not b > c

14 print f

False

True

True

4.5 clanski operatori

Clanski opratori služe za odredivanje pripadnosti odredenoj listi. Os-novni clanski operator je operator in, i može se proširiti sa logickimoperatorom not te rvot oprator not in. Rezultat clanskih opratora jebool varijabla koja daje saznanje da li zadani element pripada listi iline pripada list.

>>> a = [1, 2, 3, 8, 6]

>>> 2 in a

True

>>> 3 not in a

False

Page 40: Python Skripta

28 operatori

>>> 5 not in a

True

4.6 operatori identiteta

Operatori identita usporeduju da li su Python objekti zapisani naistom mjestu u memoriji. Postoji operator is i is not koji usporedujuid Python objekta. id Python objekta se može dohvatiti naredbom id.

>>> a=[1, 2, 3]

>>> b=[1, 2, 3]

>>> id(a)

139967012502704

>>> id(b)

139967012502848

>>> a is b

False

>>> b=a

>>> id(b)

139967012502704

>>> a is b

Page 41: Python Skripta

5O S N O V N E N A R E D B E Z A U N O S I I S P I S P O D ATA K A

5.1 print

Iz Python koda moguce je ispisivati poruke u konzolu pomocu na-redbe print. Osnovna sintaksa za ispisivanje je

print variable

gdje je variable ima varijable ciju vrijednost se želi ispisati.Moguce je ispisivati vrijednosti više varijabli:

print variable1, variable2

Naprednije mogucnosti ispisa moguce je kontrolirati pomocu uba-civanja vrijednosti varijabli u string pomocu printf formata. Simbo-lom % i pripadajucim znakom za tip podatka može se u stringu odre-duju pozicije na koje se želi ubaciti vrijednosti varijabli, a nakonstringa i simbola % slijede imena samih varijabli.

>>> var_a=7

>>> var_b=13.54592

>>> var_str = ’a iznosi %d, b iznosi %f’ % (var_a, var_b)

>>> print var_str

a iznosi 7, b iznosi 13.545920

Primjer Opis

%s String

%d Cijeli broj

%f Decimalni broj

%.2f Decimalni broj sa dvije decimale

%10.3d Decimalni broj sa dvije decimale i rezerviranihnajmanje 10 znakova

Tablica 6: printf formatiranje

Izvorni kod 6: Razliciti primjeri ispisa

1 print ’Ispisi ovo na ekranu!’

2 print ’Ispisi’ + ’ jos’ + ’ ovo.’

3

4 a=12

5 type(a)

6 print a

7 print ’a=’, a

8 print ’a=’ + str(12)

9 print ’Ovo je a:%d’ % (a)

29

Page 42: Python Skripta

30 osnovne naredbe za unos i ispis podataka

10 print ’Ovo je a:%.2d’ % (a)

11

12 b=15.365982

13 type(b)

14 print ’Ovo je b:’,b

15 print ’Ovo je b:’+str(b)

16 print ’Ovo je b:%f’ % (b)

17 print ’Ovo je b:%.2f’ % (b)

18 print ’Ovo je b:%10.3f’ % (b)

19

20 print ’ovo je a: %d a ovo je b: %f’ % (a,b)

21

22 print ’a = {broj_a}, b = {broj_b}’.format(broj_a = a, broj_b = b)

23 print ’a = {broj_a}, b = {broj_b:.2f}’.format(broj_a = a, broj_b = b)

24 print ’a = {broj_a:8d}, b = {broj_b:8.2f}’.format(broj_a = a, broj_b = b)

Ispisi ovo na ekranu!

Ispisi jos ovo.

12

a= 12

a=12

Ovo je a:12

Ovo je a:12

Ovo je b: 15.365982

Ovo je b:15.365982

Ovo je b:15.365982

Ovo je b:15.37

Ovo je b: 15.366

ovo je a: 12 a ovo je b: 15.365982

a = 12, b = 15.365982

a = 12, b = 15.37

a = 12, b = 15.37

5.2 input

5.3 raw_input

Page 43: Python Skripta

6U V J E T N A G R A N A N J A

Odredene naredbe ili djelove koda moguce je izvršavati ili preskocitiovisno o vrijednosti postavljenog logickog uvjeta.

6.1 if

Logičkiuvjet

NaredbeAko je uvjetzadovoljen

Ako uvijet nije zadovoljen

Slika 3: Dijagram toka if naredbe

Slika 3 prikazuje jednostavno grananje u programskom kodu.Osnovna sintaksa if naredbe je

if condition : command

Navedeni izraz uvjetuje izvršavanje naredbe command (ili više na-redbi) na temelju logickog uvjeta condition. Zadane naredbe ce seizvršiti samo ako je logicki uvijet zadovoljen.

Izvorni kod 7: Jednostavan primjer upotrebe if naredbe

1 #!/usr/bin/python

2

3 a = input("a: ")

4 if a < 0: a = -a

5 print a

Pokretanjem Izvornog koda 8 i utipkavanjem pozitivnog broja is-piše se utipkani broj:user@machine:~> python if_01.py

a: 5

5

Medutim, utipkavanjem negativnog broja zadovoljava se postavljenilogicki uvjet i izvrši se operacija a = -a te se potom ispiše pozitivnavrijednost utipkanog broja:user@machine:~> python if_01.py

a: -11

11

31

Page 44: Python Skripta

32 uvjetna grananja

U slucaju kad postoji više naredbi uvjetovanih istim logickim uvje-tom, naredbe možemo objediniti pod jednim uvjetom te ih odvojitisa tocka-zarezom (;). Ako su uvjetovane naredbe kompleksne ili ihima više, naredbe pišemo u uvucenim recima nakon if naredbe. Sveuvucene naredbe do prvog retka koji je poravnat sa if naredbom suuvjetovane.

Izvorni kod 8: Pisanje složenijeg uvjetovanog grananja

1 #!/usr/bin/python

2

3 a = 0

4 b = input("b: ")

5 c = input("c: ")

6

7 if b < 0: a = 1; b = -b

8 print a, b

9

10 if c < b:

11 a = 2

12 b = c - b

13 c = c +1

14 a = b + c

15 print a, b, c

user@machine:~> python if_02.py

b: -6

c: 4

1 6

3 -2 5

6.2 else

Ova naredba omogucuje složeniji oblik grananja od naredbe if. Na-redba ima dvije grane koje se mogu izvršiti u ovisnosti o uvjetu.Svaka grana/mogucnost omogucuje izvršavanje pripadajucih naredbi(Slika 4).

Logičkiuvjet

Naredbe B

Ako je uvjetzadovoljen

Ako uvijet nije zadovoljen

Naredbe A

Slika 4: if-else dijagram toka

Page 45: Python Skripta

6.3 elif 33

else naredba koristi se u paru sa if i služi za grananje u slucajuda uvjet nije zadovoljen.

Sintaksa naredbe je:if condition : command1

else: command2

Izvorni kod 9: Primjer upotrebe else naredbe

1 #!/usr/bin/python

2

3 a = input("a: ")

4 b = input("b: ")

5

6 if a < b:

7 b = a

8 a = 0

9 else:

10 a = b

11 b = 0

12

13 print a, b

user@machine:~> python if_else_01.py

a: 1

b: 8

0 1

user@machine:~> python if_else_01.py

a: 5

b: 3

3 0

6.3 elif

Za dodatna grananja uvjetovana novim logickim uvjetima (Slika 5)služi naredba elif. Iako se sa ugnježdenim grananjem može posticiisti rezultat, elif omogucuje jednostavnije i preglednije grananje al-goritma.

Naredba elif omogucuje grananje u alogritmu samo ako prethodniuvjeti (if ili elif) nisu zadovoljeni. Treba napomenuti da se u slucajukorištenja if-elif-else grananja uvijek izvrši samo jedan set uvjeto-vanih naredbi.

Iz same definicije dodatnog uvjetnog grananja, naredba elif uvijekdolazi u kombinaciji sa naredbom if, te se upotrebljava u sljedecojosnovnoj sintaksiif condition1 : command1

elif condition2 : command2

Kao ni u slucaju upotrebe else naredbe dodatno grananje se moranapisati u novom retku. Uobicajeno je da se naredbe koje slijede na-kon uvjeta pišu u novom uvucenom retku.

Proširena upotreba ukljucuje kombinaciju više elif naredbi:

Page 46: Python Skripta

34 uvjetna grananja

if condition1 : command1

elif condition2 : command2

elif condition3 : command3

Grananje se može napraviti i kombinacijom sve tri navedene na-redbe:

if condition1 : command1

elif condition2 : command2

else : command2

Logičkiuvjet A

Naredbe B

Ako je uvjetzadovoljen

Ako uvijet nije zadovoljen

Naredbe A

Logičkiuvjet B

Ako je uvjetzadovoljen

Naredbe C

Ako uvijet nije zadovoljen

Logičkiuvjet C

Ako je uvjetzadovoljen

Naredbe D

Ako uvijet nije zadovoljen

Slika 5: Dijagram toka za složeni uvjet grananja

U Izvornom kodu 10 napisan je jednostavan primjer grananja ko-risteci navedene naredbe.

Izvorni kod 10: Primjer kombinacije naredbi if, elif i else

1 #!/usr/bin/python

2

3 a = input("a: ")

4

5 if a < 0:

Page 47: Python Skripta

6.3 elif 35

6 print ’a je negativan’

7 elif a > 0:

8 print ’a je pozitivan’

9 else:

10 print ’a je nula’

Unosom pozitivnog broja izvršava se naredba koja je uvjetovana uvje-tom pod elif naredbom:

user@machine:~> python if_elif_else_01.py

a: 33

a je pozitivan

Page 48: Python Skripta
Page 49: Python Skripta

7P E T L J E

7.1 for

Naredba for koristi se za iteriranje elemenata u nekom iterabilnomobjektu (lista, tuple, string itd.). Njezina osnovna sintaksa je

for iter in list : commands

Naredbe commands izvršavaju se jednom za svaki element iz nizalist. Objekt iter je iterator koji pokazuje na elemente niza list. Zarazliku od jezika C, C++ iter se ne briše nakon što for naredbazavrši.

Izvorni kod 11: Upotreba for naredbe

1 #!/usr/bin/python

2 for num in range(2, 5):

3 print(num)

4

5 print(num)

2

3

4

4

Izvorni kod 12: Naredba for s listom stringova

1 #!/usr/bin/python

2 text=[’ide’,’patka’,’preko’,’save’]

3 for r in text:

4 print(r)

ide

patka

preko

save

Izvorni kod 13: Naredba for i stirng

1 #!/usr/bin/python

2 for c in ’patka’: print(c)

p

a

t

k

a

37

Page 50: Python Skripta

38 petlje

Izvorni kodovi 12 i 13 prikazuju upotrebu stringova u for naredbi.Do indeksa elemenata u nizu može se doci korištenjem naredbi len

i range (poglavlje ??) kao što se može vidjeti na primjeru Izvornogkoda 14:

Izvorni kod 14: Naredba for s listom stringova

1 #!/usr/bin/python

2 text=[’ide’,’patka’,’preko’,’save’]

3 for i in range(len(text)):

4 print i, text[i]

0 ide

1 patka

2 preko

3 save

7.2 while

Osnovne sintaksa naredbe while je

while conditon : commands

Naredbe commands izvršavaju se dokle god je uvjet condition istinit.

Logičkiuvjet

Ako je uvjetzadovoljen

Ako uvijet nije zadovoljen

Naredbe

Slika 6: Dijagram toka while petlje

Izvorni kod 15: Upotreba while naredbe

1 #!/usr/bin/python

2 i=0

3 while i*i<=9:

4 print i

5 i=i+1

0

1

2

Page 51: Python Skripta

7.3 break 39

7.3 break

Proširena sintaksa for ili while naredbe ukljucuje i naredbu else:for iter in list : commands1

else : comands2

while condition : commands1

else : comands2

Nakon što se iscrpe svi elemnti niza list ili nakon što uvjet conditionpostane neistinit, izvršit ce se naredbe commands2.

Izvorni kod 16: Upotreba else naredbe u petlji

1 #!/usr/bin/python

2 for num in range(3):

3 print(num)

4 else:print(’Kraj’)

0

1

2

Kraj

Naredbom break se završava for ili while naredba. Na primjeruIzvornog koda 17 može se vidjeti da se nakon break naredbe ne izvršidio koda nakon else naredbe.

Izvorni kod 17: Upotreba break naredbe

1 #!/usr/bin/python

2 i=0

3 while i*i<=9:

4 print i

5 i=i+1

6 if i==2 : break

7 else : print(’Kraj’)

0

1

7.4 continue

Naredbom continue se preskace izvršavnje sljedecih naredbi u tijelufor ili while naredbe.

Izvorni kod 18: Upotreba continue naredbe

1 #!/usr/bin/python

2 for num in range(2, 5):

3 if num==3:continue

4 print(num)

2

4

Page 52: Python Skripta
Page 53: Python Skripta

8F U N K C I J E

Funkcije su grupirani dio koda koji izvodi odredeni zadatak. Pred-nosti upotrebe funkcija su:

• Smanjenje ponavljanja istog koda

• Povecavanje modularnosti koda - rašclanjivanje složenog kodana jednostavnije djelove

• Povecanje citkosti koda.

Rad sa funkcijama u Pythonu omogucuje veliku fleksibilnost. Funk-cije mogu biti dodijeljene varijablama, spremljene u listama i proslje-divane kao argumenti drugim funkcijama.

Razlikujemo dva osnovna tipa Python funkcija:

• Ugradene funkcije su funkcije koje su dio Python programskogjezika

• Funkcije definirane od strane korisnika.

8.1 definiranje i pozivanje funkcija

Kljucna rijec def omogucuje definiranje funkije. Najjednostavnija sin-taksa koja omogucuje definiranje funkcije je:

def functionname():

commands

gdje je functionname odabrano ime funkcije a commnds je naredbaili više naredbi koje funkcija izvršava. Prethodno definiranu funk- Poziv funkcije uvijek

mora biti nakondefinicije funkcije.Ne može se pozvatifunkcija kojaprethodno nijedefinirana.

ciju možemo izvršiti pozivom te funkcije. Funkcija se poziva pomocuimena funkcije nakon kojeg slijede zagrade.

Izvorni kod 19: Definicija i pozivanje jednostavne funkcije

1 #!/usr/bin/python

2

3 def pozdrav():

4 print ’Pozdrav!’

5

6 pozdrav()

Pozdrav!

Funkciju je moguce proširiti na nacin da prima jedan ili više argu-menata. Argumenti se definiraju pomocu imena argumenata razdvo-jenih zarezom u zagradama nakon imena funkcije:

41

Page 54: Python Skripta

42 funkcije

def functionname(arg1, arg2, ... , argn):

commands

Funkcija sa argumentima se poziva tako da se u zagradama nakonimena funkcije upišu vrijednosti argumenata. Argumenti se u pozivufunkcije razdvajaju zarezom kao i prilikom definicije funkcije.

Izvorni kod 20: Definicija funkcije koja prima argument

1 #!/usr/bin/python

2

3 def pozdrav( ime ):

4 print ’Pozdrav’, ime, ’!’

5

6 def zbroji( a, b ):

7 c = a + b

8 print a, ’+’, b, ’=’, c

9

10 pozdrav(’Marko’)

11 zbroji(2, 5)

Pozdrav Marko !

2 + 5 = 7

8.2 vracanje vrijednosti iz funkcije

Funkcija može vratiti vrijednost nakon poziva funkcije. Vrijednostkoju funkcija vraca doslovno zamjenjuje funkciju u kontekstu u ko-jem je ona pozvana, a tip vracenog podatka može biti bilo koji Pythonobjekt. Vracanje vrijednosti se definira naredbom return nakon kojese zaustavlja izvršavanje funkcije:

def functionname(arg1, arg2, ... , argn):

commands

return value

Izvorni kod 21: Definicija funkcije koja prima više argumenata i vraca vri-jednost

1 #!/usr/bin/python

2

3 def zbroji(a, b):

4 c = a + b

5 return c

6

7 x = zbroji(2, 6)

8 y = zbroji(x, -5)

9

10 print x, y

8 3

Funkcija može sadržavati više return naredbi (obicno u razlicitimuvjetnim grananjima) i svaka može vratiti razlicit tip podatka (Izvornikod 22).

Page 55: Python Skripta

8.3 argumenti sa zadanim vrijednostima 43

Izvorni kod 22: Funkcija koja vraca razlicite tipove

1 #!/usr/bin/python

2

3 def luda_funkcija(a, b):

4 if(a > b):

5 return a + b

6 else:

7 return ’malo teksta’

8

9 x = luda_funkcija(6, 2)

10 y = luda_funkcija(x, 10)

11

12 print x, y

8 malo teksta

Vrlo cesto, javlja se potreba da funkcija vraca više vrijednosti. To semože ostvariti vracanjem tuplea.

Izvorni kod 23: Funkcija koja vraca više vrijednosti korsiteci tuple

1 #!/usr/bin/python

2

3 def f(a, b):

4 z = a + b

5 r = a - b

6 return z, r

7

8 x = f(6.0, 2.0)

9 print x

10

11 c, d = f(6.0, 2.0)

12 print c

13 print d

(8.0, 4.0)

8.0

4.0

8.3 argumenti sa zadanim vrijednostima

Funkcije mogu biti dfinirane i sa zadanim vrijednostima argumenata.Argumenti sa zadanim vrijednostima mooraju biti definirani nakonargumenata bez zadanih vrijednosti.

def functionname(arg1=val1, arg2=val2, ... , argn=valn):

commands

return value

Prilikom poziva funkcije, moguce je funkciju pozvati bez zadanihargumenata.

Izvorni kod 24: Funkcija sa zadanim argumentom

1 #!/usr/bin/python

Page 56: Python Skripta

44 funkcije

2

3 def f(a, b=0.0):

4 if(a > b):

5 return a - b

6 else:

7 return b

8

9 a = f(6.0, 2.0)

10 b = f(20.0)

11 c = f(-3.0)

12

13 print a, b, c

4.0 20.0 0.0

8.4 keyword i non-keyword argumenti

Funkciju se može pozivati na nacin da se, pomocu keyword argume-nata, tocno specificiraju argumenti. Keyword argumenti su oni argu-menti koji se, pri pozivu funkcije, zadaju imenom i vrijednošcu, zarazliku od non-keyword argumenata koji se zadaju samo kao vrijed-nost. Redosljed zadavanja keyword argumenata može biti proizvoljandok kod kombinacije non-keyword i keyword argumenata prvo mo-raju biti specificirani non-keyword argumenti.

1 # Definiranje funkcije

2 def f(x, a, b):

3 return x*(a+b)

4

5 # Poziv funkcije sa keyword argumentima

6 f(x=10, b=0, a=8)

7

8 # Poziv funkcije sa mjesovitim keyword i non-keyword argumentima

9 f(10, b=0, a=8)

8.5 ugnježden definicija funkcije

Ugnježdeno definiranje funkcije (eng. closure ili nested function defini-tion) omogucuje definiciju funkcije u funkciji. Ugnježdena definicijafunkcije je moguca u Pythonu jer su funkcije objekti te ih je moguceprosljedivati kao argumente drugim funkcijama te vracati kao rezul-tat funkcije. Ugnježdeno definirane funkcije mogu se pokazati korisnejer unutarnja funkcija može koristiti objekte definirane u vanjskoj:

>>> def vanjska(vanjski_argument):

... def unutarnja(unutarnji_argument):

... return vanjski_argument * unutarnji_argument

... return unutarnja

...

>>> f = vanjska(5)

>>> f(3)

15

Page 57: Python Skripta

8.6 lambda funkcije 45

>>> f(4)

20

8.6 lambda funkcije

Lambda funkcije su funkcije bvez imena tj. anonimne funkcije. Naj-cešce se koriste za definiranje vrlo jednostavnih i kratkih funkcija.

>>> def add(a, b):

... return a + b

...

>>> add(4, 3)

7

may also be defined using lambda

>>> print (lambda a, b: a + b)(4, 3)

7

Lambda is often used as an argument to other functions that expectsa function object, such as sorted()’s ’key’ argument.

>>> sorted([[3, 4], [3, 5], [1, 2], [7, 3]], key=lambda x: x[1])

[[1, 2], [7, 3], [3, 4], [3, 5]]

The lambda form is often useful as a closure, such as illustrated inthe following example:

>>> def attribution(name):

... return lambda x: x + ’ -- ’ + name

...

>>> pp = attribution(’John’)

>>> pp(’Dinner is in the fridge’)

’Dinner is in the fridge -- John’

note that the lambda function can use the values of variables from thescope in which it was created (like pre and post). This is the essenceof closure.

Page 58: Python Skripta
Page 59: Python Skripta

9P Y T H O N S TA N D A R D L I B R A RY

http://docs.python.org/2/library/index.html

9.1 matematicke funkcije

Python modul math sadrži standardne matematicke realne funkcijekoje su definirane C standrdom, s kojima se najcešce susrecemo prili-kom pisanja nekog programa.

Funkcija Opis

math.fabs(x) Funkcija vraca apsolutnu vrijednost realnog broja x.

math.fsum(niz)Funkcija vraca sumu elemenata nekog niza brojeva.

math.isnan(x) Funkcija vraca True ako je x tipa NaN.

math.exp(x) Exponencijalna funkcija ex.

math.log(x, b)Funkcija logb(x) odnosno ln(x) ako se ne zada b.

math.cos(x) Funkcija vraca kosinus kuta x zadanog u radijanima.

math.acos(x) Inverz funkcije kosinus.

math.e Matematicka konstanta e=2.718281828459045...

Tablica 7: Opis nekih funkcija math modula

Primjer upotrebe nekih funkcija math modula:

1 #!/usr/bin/python

2 from math import log,e,fsum

3 print log(e)

4 print fsum([1,2,3])

1.

6.

Python modul cmath sadrži standardne matematicke funkcija nadpoljem kompleksnih brojeva. Argumenti funkcija mogu biti tipa float

ili complex.

Funkcija Opis

cmath.polar(x)Funkcija vraca polranu (r,φ) reprezentaciju kompleksnog broja x.

cmath.sqrt(x) Funkcija vraca korijen kompleksnog broja

Tablica 8: Opis nekih funkcija cmath modula

Primjer upotrebe nekih funkcija cmath modula:

47

Page 60: Python Skripta

48 python standard library

1 from cmath import sqrt

2 sqrt(1.+2.j)

(1.272019649514069+0.7861513777574233j)

Python modul decimal omogucuje racunanje i pravilno zaokruži-vanje realnih brojeva u aritmetici s proizvoljnim brojem decimalnihmjesta.

Primjer upotrebe nekih funkcija math modula:

1 #!/usr/bin/python

2 from decimal import *3 getcontext().prec = 6

4 print Decimal(1) / Decimal(3)

5 getcontext().prec =30

6 print Decimal(1) / Decimal(3)

0.333333

0.333333333333333333333333333333

Page 61: Python Skripta

Dio II

N U M P Y P O L J A I M AT R I C E

Modul numpy je dodatni paket za Python koji omogucujeefikasno manipuliranje višedimenzionalnim poljima bro-jeva.

Page 62: Python Skripta
Page 63: Python Skripta

10Z A D AVA N J E P O L J A U N U M P Y- U

Bazni objekt u NumPy-u, ndarray, je homogeno multidimenzionalnopolje. Homogenost polja podrazumijeva da su svi podaci u polju istogtipa. U NumPy-u, dimenzije se nazivaju axes a broj dimenzija rank.

Elementi polja su indeksirani pozitivnim cijelim brojevima.NumPy polja se mogu zadavati na više nacina. Bazicno, zadava-

nje polja se može podjeliti na rucni unos pomocu naredbe array tena automatsko generiranje polja. NumPy polja mogu se automatskigenerirati pomocu neke od naredbi za generiranje polja.

10.1 array

Naredba array omogucava kreiranje NumPy polja iz obicnih Pythonlisti ili tuple-ova. Prilikom kreiranja polja pomocu array naredbe, uargument funkcije upisuju se elementi matrice i to na nacin da svakadimnezija zapocinje otvornemo uglatom zagradom ([) i završava za-tvorenom uglatom zagradom (]) dok su elementi razdvojeni zarezom.

Najjednostavnija sintaksa naredbe array je:array(object)

Ako je argument naredbe array tuple, onda pojedina dimenzija za-pocinje i završava sa zagradama. Pri tome treba paziti da je argumnetnaredbe array samo jedan tuple (cijeli tuple mora biti u jednim za-gradama). Moguce je kombinirati Python liste i tuple-ove prilikomzadavanja matrice.>>> from numpy import *>>> M1 = array([[1, 2, 3],[4, 5, 6]])

>>> M1

array([[1, 2, 3],

[4, 5, 6]])

>>> M2 = array( ( (6,7,8), (9,10,11) ) )

>>> M2

array([[ 6, 7, 8],

[ 9, 10, 11]])

>>> M3 = array( ( [6,7,8], (9,10,11) ) )

>>> M3

array([[ 6, 7, 8],

[ 9, 10, 11]])

Dodatni, neobavezni argumenti naredbe array su:dtype - željeni tip podataka za elemente polja. Ako argument nije

zadan, elementi polja ce preuzeti minimalni tip potreban za pohranupodataka iz objekta object. Ovaj argument se može koristiti samo za’povecati’ (eng. upcast) tip zadanog objekta. Za ’smanjiti’ (eng. down-cast) tip koristiti .astype(t) naredbu.

51

Page 64: Python Skripta

52 zadavanje polja u numpy-u

copy - bool varijabla (True ili False) koja odreduje da li se objektkopira.order - odreduje nacin na koji se polje pohranjuje u memoriji. Polje

može biti pohranjeno na tri nacina:

• ’C’ - elementi polja ce biti poredani u memoriji na nacin dazadnji indeks varira najbrže (C-povezani poredak)

• ’F’ - elementi polja ce biti poredani u memoriji na nacin da prviindeks varira najbrže (Fortran-povezani poredak)

• ’A’ - elementi polja nece imati definiran poredak u memoriji (C-povezani poredak, Fortran-povezani poredak ili cak nepovezaniporedak)

subok : bool, optional If True, then sub-classes will be passed-through,otherwise the returned array will be forced to be a base-class array(default).

ndmin - minimalni broj dimenzija generiranog polja. Prema potrebi,broj dimenzija ce biti povecan na nacina da ce jedinice biti dodane ushape polja.

10.2 arange

Naredba arange omogucuje kreiranje jednodimenzionalnog polja kojesadrži aritmeticki niz definiran sa prvim clanom, zadnjim clanom tekorakom.

Sintaksa naredbe jearange(start, stop, step, type)

gdje je start pocetak niza, stop kraj niza, step korak niza a type

je tip podataka sadržanih u nizu.Oprez! Prilikomkorištenja

ne-cjelobrojnihkoraka niza rezultatnaredbe array možebiti nekonzistentan.

U takvimslucajevima bolje je

koristiti naredbulinspace (10.3).

Svi argumennti naredbe arange osim stop su neobavezni i ukolikonisu uneseni imaju zadane vrijednosti:

• start ima zadanu vrijednost 0

• step ima zadanu vrijednost 1 te zahtijeva i zadavanje argu-menta start

• type ako nije zadan, postavlja se tipa na temelju ostalih argume-nata.

>>> M1 = arange(10, 30, 3)

>>> M1

array([10, 13, 16, 19, 22, 25, 28])

>>> M2 = arange(-2, 3)

>>> M2

array([-2, -1, 0, 1, 2])

>>> M3 = arange(5)

>>> M3

array([0, 1, 2, 3, 4])

Page 65: Python Skripta

10.3 linspace 53

10.3 linspace

Naredba linspace ima slicnu namjenu kao i naredba arange (kreira-nje aritmetickog niza) samo što se umjesto koraka niza zadaje brojclanova niza.

I sintaksa naredbe je vrlo slicna naredbi arange:

linspace(start, stop, num=50, endpoint=True, retstep=False)

gdje je start pocetak niza, stop kraj niza, num broj elemenata niza,endpoint je opcija ukljucivanja zadnjeg elementa a retstep je opcijavracanja korištenog koraka niza.

>>> M1=linspace(0,10,21)

>>> M1

array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ,

4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5,

9. , 9.5, 10. ])

>>> M2 = linspace(0, 5, 10, endpoint=False)

>>> M2

array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])

>>> M3, step = linspace(0, 1, retstep=True)

>>> M3

array([ 0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265,

0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347,

0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,

0.30612245, 0.32653061, 0.34693878, 0.36734694, 0.3877551 ,

0.40816327, 0.42857143, 0.44897959, 0.46938776, 0.48979592,

0.51020408, 0.53061224, 0.55102041, 0.57142857, 0.59183673,

0.6122449 , 0.63265306, 0.65306122, 0.67346939, 0.69387755,

0.71428571, 0.73469388, 0.75510204, 0.7755102 , 0.79591837,

0.81632653, 0.83673469, 0.85714286, 0.87755102, 0.89795918,

0.91836735, 0.93877551, 0.95918367, 0.97959184, 1. ])

>>> step

0.02040816326530612

10.4 zeros

Naredba zeros omogucava generiranje polja koje sadrži nule. Os-novna sintaksa naredbe zeros je

zeros(shape)

gdje je shape lista koja sadrži velicine dimenzija.Osim velicine dimnezija, postoje i dodatni neobavezni argumenti

za definiranje tipa podataka te nacina spremanja polja u memoriju:

zeros(shape, dtype=float, order=’C’)Naredbazeros_like imadodatne argumentedtype i order.dtype omogucujenametanje tipapodataka zagenerirano polje, aako nije specificiranonda generiranopolje nasljeduje tippodataka odargumenta a. orderomogucujemijenjanje rasporedaspremanja polja umemoriju.

Za generiranje polja nula može poslužiti i naredba zeros_like kojagenerira polje nula istih dimenzija kao neko postojece polje. Sintaksanaredbe je:

zeros_like(a)

gdje je a matrica cije dimenzije treba preuzeti.

Page 66: Python Skripta

54 zadavanje polja u numpy-u

>>> from numpy import *>>> a = zeros([3, 5])

>>> print a

[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

>>> b = array([2, 5, 6, 0])

>>> print b

[2 5 6 0]

>>> c = zeros_like(b)

>>> print c

[0 0 0 0]

10.5 ones

Za generiranje matrice zadanih dimenzija koja sadrži jedinice koristise naredba ones. Sintaksa naredbe je vrlo ista kao i kod naredbezeros:ones(shape, dtype=float, order=’C’)

Naredba ones_like

ima dodatneargumente dtype i

order kojifunkcioniraju

jednako kao što jeopisano za naredbu

zeros_like.

Za kreiranje matrice, koja sadrži jedinice istih dimenzija kao nekapostojeca matrice, koristi se ones_like naredba:ones_like(a)

gdje je a matrica cije dimenzije treba preuzeti.>>> from numpy import *>>> a = ones([2,4])

>>> print a

[[ 1. 1. 1. 1.]

[ 1. 1. 1. 1.]]

>>> b = ones([3, 2],dtype=int)

>>> print b

[[1 1]

[1 1]

[1 1]]

>>> c = array([5, 8])

>>> d = ones_like(c)

>>> print d

[1 1]

10.6 eye

Generiranje dvodimenzionalne jedinicne matrice (sadrži jedinice nadijagonali a ostalo su nule) moguce je sa naredbom eye. PotpunaNaredba eye

omogucujegeneriranje

iskljucivodvodimenzionalnihjedinicnih matrica.

sintaksa naredbe eye je:eye(N, M=None, k=0, dtype=<type ’float’>)

gdje je N broj redaka generiranog polja, M broj stupaca generiranogpolja (ako nije zadano, broj stupaca je jednak broju redaka), k indeksdijagonale (0 je glavna dijagonala, pozitivna vrijednost se odnosi nadijagonale iznad a negativna na dijagonale ispod glavne dijagonale)dok je dtype tip podataka generiranog polja.

Page 67: Python Skripta

10.7 diag 55

>>> from numpy import *>>> a = eye(4)

>>> print a

[[ 1. 0. 0. 0.]

[ 0. 1. 0. 0.]

[ 0. 0. 1. 0.]

[ 0. 0. 0. 1.]]

>>> b = eye(5, 3)

>>> print b

[[ 1. 0. 0.]

[ 0. 1. 0.]

[ 0. 0. 1.]

[ 0. 0. 0.]

[ 0. 0. 0.]]

>>> c = eye(3, 5, 1)

>>> print c

[[ 0. 1. 0. 0. 0.]

[ 0. 0. 1. 0. 0.]

[ 0. 0. 0. 1. 0.]]

10.7 diag

Cesto su brojevi na dijagonali matrice važni u proracunu i javlja se po-treba da ih se spremi u zasebnu varijablu. Naredba diag omogucujeupravo to: generira vektor koji sadrži elemenate dijagonale zadanematrice.

Sintaksa naredbe je vrlo jednostavna. Funkcija diag obavezno prima,kao argument, matricu iz koje se želi preuzeti dijagonala. Dodatni ar-gument, k, specificira položaj (indeks) dijagonale: 0 je glavna dijago-nala, pozitivna vrijednost se odnosi na dijagonale iznad a negativnana dijagonale ispod glavne dijagonale.

diag(v, k=0)

Izvorni kod 25: Spremanje elemenata dijagonale matrice u vektor

1 from numpy import *2 M1 = array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

3 v1 = diag(M1)

4 v2 = diag(M1,1)

5

6 print M1

7 print v1

8 print v2

user@machine:~> python diag01.py

[[1 2 3]

[4 5 6]

[7 8 9]]

[1 5 9]

[2 6]

Page 68: Python Skripta

56 zadavanje polja u numpy-u

10.8 meshgrid

Page 69: Python Skripta

11M A N I P U L A C I J E S A N U M P Y P O L J I M A

11.1 manipulacije sa dimenzijama polja

Elementi NumPy polja odredenih dimenzija, mogu se presložiti uNumPy polje drukcijih dimenzija. Preslagivanje polja na druge di-menzije vrši se pomocu naredbe reshape:

reshape(a, newshape, order=’C’)

gdje je a izvorno polje, newshape vektor novih dimenzija a order jenacin spremanja polja u matricu.

Uvijet za reshape je da broj elemenata polja ostane isti tj. umnožakvelicina dimenzija mora biti konstantan. Ukoliko se, kod

poziva naredbereshape, velicinajedna od dimenzijane specificira, tadase ona automatskiracuna na temeljuostalih velicinadimenzija i ukupnogbroja elemenatainicijalne matrice.

Specificni slucaj mijenjanja dimenzija polja je kada inicijalno polježelimo transformirati u jednodimenzionalno polje tj. vektor. Iako jeto moguce napraviti sa naredbom reshape, postoji specijelizirana na-redba ravel za transformaciju n-dimnezionalnih polja u jednodimen-zionalna polja. Sintaksa naredba je vrlo slicna kao i za reshape osimšto nije potrebno specificirati vektor velicina dimenzija jer je rezultatuvijek jednodimenzionalno polje.

ravel(a, order=’C’)

Za pretvorbu matrice u vektor koristi se i naredba flatten. Razlikaje što je ovo funkcija ndarray objekta i uvijek kreira kopiju polja.

flatten(order=’C’)

Izvorni kod 26: Mijenjanje dimenzija polja

1 from numpy import *2

3 M1 = arange(0, 20)

4 print M1

5

6 M2 = reshape(M1, [4, 5])

7 print M2

8 M3 = reshape(M2, [2, -1])

9 print M3

10

11 print ravel(M2)

12 print M3.flatten()

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

[[ 0 1 2 3 4]

[ 5 6 7 8 9]

[10 11 12 13 14]

[15 16 17 18 19]]

[[ 0 1 2 3 4 5 6 7 8 9]

57

Page 70: Python Skripta

58 manipulacije sa numpy poljima

[10 11 12 13 14 15 16 17 18 19]]

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

Brisanje jedinicnih dimenzija matrice, koje vrlo cesto znaju biti su-višne, može se napraviti funkcijom squeeze.

Izvorni kod 27: Mijenjanje dimenzija polja

1 from numpy import *2

3 M1 = arange(0, 20)

4

5 M2 = reshape(M1, [4, 1, 1, 5])

6 print M2.shape

7

8 M3 = squeeze(M2)

9 print M3.shape

(4, 1, 1, 5)

(4, 5)

11.2 transponiranje

Transponiranje matrica moguce je izvesti na dva nacina:

• funkcijom transpose

• atributom T

Izvorni kod 28: Transponiranje matrica

1 from numpy import *2

3 M1 = array([

4 [1, 0, 3, 4],

5 [2, 2, 7 ,8],

6 [6, 8, 3, 0],

7 [9, 8, 2, 1]])

8

9 M2 = M1.T

10 print M2

11

12 M3 = transpose(M1)

13 print M3

[[1 2 6 9]

[0 2 8 8]

[3 7 3 2]

[4 8 0 1]]

[[1 2 6 9]

[0 2 8 8]

[3 7 3 2]

[4 8 0 1]]

Page 71: Python Skripta

11.3 dodavanje i brisanje elemenata polja 59

11.3 dodavanje i brisanje elemenata polja

Page 72: Python Skripta
Page 73: Python Skripta

12N U M P Y M AT R I C E

O matricama...

61

Page 74: Python Skripta
Page 75: Python Skripta

Dio III

P R I P R E M A , O B R A D A I V I Z U A L I Z A C I J AP O D ATA K A

Page 76: Python Skripta
Page 77: Python Skripta

13O S N O V N I 2 D G R A F O V I

Terminlologija:

• Figure = prozor

• Axes = prostor crtanja

• Axis = osi

Prozor

Prostor crtanja Prostor crtanja

Os y

Os x

Os y

Os x

Slika 7: Matplotlib elementi

13.1 linijski grafovi

Osnovna naredba u matplotlibu je plot i služi za crtanje grafova po-mocu linija ili tocaka. Osnovna sintaksa naredbe je

plot(y)

plot(x, y)

gdje su x i y vektori koordinata tocaka koje želimo vizualizirati. Uslucaju da vektor x koordinata nije zadan, koristi se uniformni vektor[0, 1, 2, ..., n] gdje je n broj clanova vektora y. U slucaju da suzadani i vektor x i vektor y, tada oni moraju imati isti broj clanova.

Više uzastopnih plot naredbi ce nacrtati više linija na istom grafu.Naredba plot ne prikazuje graf, graf se iscrtava na ekranu pozivomfunkcije show.

Izvorni kod 29 kreira dva linijska grafa koristeci naredbu plot apotom, naredbom show, graf prikaže na ekranu (Slika 8)

65

Page 78: Python Skripta

66 osnovni 2d grafovi

Izvorni kod 29: Jednostavan graf

1 from pylab import *2 from numpy import *3

4 plot([3, 6, 3, 2, 4])

5

6 x = linspace(0, 4, 100)

7 y = 5*cos(x)/(1 + x**2)

8 plot(x, y)

9

10 show()

Slika 8: Graf napravljen izvodenjem izvronog koda 29

Dodatni argument naredbe plot omogucuje definiranje izgleda li-nije i markera pomocu znakova. Znakovi za definiranje vrste linije,boje linije te vrste markera kombiniraju se u stringu koji se proslje-duje funkciji plot. Simboli za definiranje vrste linije, boje linije i vrstemarkera prikazani su u tablicama 9, 10 i 11. Simboli se mogu kombi-nirati u proizvoljnom redoslijedu. Ako je izostavljen simbol za boju,primjenjuje se zadana vrijednost boje. Markeri se ne prikazuju izos-tavljanjem simobla za vrstu markera. Izostavljanjem simbola za vrstulinije, ako je zadana vrsta markera linija se ne prikazuje a puna linijase iscrtava u slucaju da vrsta markera nije zadana.

Page 79: Python Skripta

13.1 linijski grafovi 67

Simbol Vrsta linije

’-’ Puna linija

’-’ Crtkana linija

’-.’ Crta-tocka

’:’ Tockasta linija

Tablica 9: Vrste linija

Simbol Boja

’b’ Plava

’r’ Crvena

’g’ Zelena

’c’ Cijan

’m’ Magenta

’y’ Žuta

’k’ Crna

’w’ Bijela

Tablica 10: Simboli boja

Page 80: Python Skripta

68 osnovni 2d grafovi

Simbol Vrsta markera

’.’ Tockasti

’,’ Piksel

’o’ Kružni

’v’ Trokutasti prema dolje

’ˆ’ Trokutasti prema gore

’<’ Trokutasti prema lijevo

’>’ Trokutasti prema desno

’s’ Kvadratni

’p’ Peterokutni

’*’ Zvijezdasti

’h’ Šesterokutni 1

’H’ Šesterokutni 2

’+’ Plus

’x’ Križic

’D’ Romb

’d’ Tanki romb

’|’ Vertikalna linija

’_’ Horizontalna linija

Tablica 11: Vrste markera

U izvornom kodu 30 upotrebljene su razlicite varijente linija, mar-kera i boja (Slika 10).

Izvorni kod 30: Kontrola linija i markera

1 from pylab import *2 from numpy import *3

4 plot([1, 6, 3, 2, 4],’r--o’)

5 plot([3, 2, 1, 3, 1],’g-.D’)

6 plot([2, 3, 5, 6, 2],’rx’)

7 plot([5, 4, 2, 4, 5],’ks:’)

8

9 show()

Page 81: Python Skripta

13.2 naprednija kontrola linijskih grafova 69

0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.01

2

3

4

5

6

Slika 9: Graf napravljen izvodenjem izvronog koda 30

13.2 naprednija kontrola linijskih grafova

Bolju kontrolu izgleda linijskih grafova u matplotlibu moguce je os-tvariti sa dodatnim parametrima naredbe plot.

Argumentom color (ili skraceno c) moguce je preciznije definiratiboju linije:

plot(x, y, color = gray_string)

plot(x, y, color = hex_string)

plot(x, y, color = rgb_tuple)

gdje je

• gray_string string koji specificira nijansu sive boje kao udiobijele (npr. color = ’0.72’)

• hex_string string koji specificira heksidecimalni zapis RGB boje(npr. color = ’#FF8C00’)

• rgb_tuple tuple kojim se specificiraju udjeli crvene, zelemne iplave (RGB) boje (npr. color = (0.1, 0.5, 0.3))

Izgled markera se može detaljnije specificirati pomocu više para-metara naredbe plot:

• marker za definiranje vrste tj. oblika markera,

• markersize ili ms za definiranje velicine markera,

• markeredgecolor ili mec za definiranje boje ruba markera,

Page 82: Python Skripta

70 osnovni 2d grafovi

• markeredgewidth ili mew za definiranje debljine ruba markera,

• markerfacecolor ili mfc za definiranje boje lica markera

• markerfacecoloralt ili mfcalt za definiranje izmjenjujuce bojelica markera,

• markerevery za definiranje koliko tocaka ce biti prikazane (npr.svaka peta).

1 plot(x, y, markeredgecolor = ’r’, # Boja ruba markera - crvena

2 markeredgewidth = 2, # Debljina ruba

3 markerfacecolor = ’b’, # Boja lica - plava

4 markerfacecoloralt = ’g’, # Izmjenjujuca boja lica - zelena

5 markersize = 4, # Velicina markera

6 markerevery = 5) # Crtaj svaki peti marker

Argumentom label omogucuje se oznaka tj. opis krivulje, koji seprikazuje u legendi grafa (13.4.2).

13.3 svojstva prozora , prostora crtanja i osi

Naredbama xlabel i ylabel moguce je dodati naslove osi. Sintaksaobje naredbe je identicna:

xlabel(’Opis x osi’)

ylabel(’Opis y osi’)

Naredbama xlim i ylim odreduju se granice intervala koji se prika-zuje na prostoru crtanja. Sintaksa naredbe je:

xlim( (xmin, xmax) )

xlim( xmin, xmax )

1 xlim(0, 5) # Donja i gornja granica

2 ylim(ymax=1) # Samo gornja granica

3 ylim(ymin=-1) # Samo donja granica

Ukljucivanje i iskljucivanje mreže pomocnih linija na prostoru crta-nja vrši se naredbom grid.

grid(b=None, which=’major’, axis=’both’, **kwargs)

b je argument kojim se kontrolira da li se iskljucuje ili ukljucujemreža pomocnih linija i može poprimiti vrijednosti true ili false alii ’on’ ili ’off’ (kao i MATLAB). which može biti ’major’, ’minor’ ili’both’ i služi za kontrolu glavne ili sporedne mreže pomocnih linija.Argumentom axis kontorilra se za koje ce osi biti postavljena mrežapomocnih linija. Vrijednosti za axis mogu biti ’both’, ’x’ ili ’y’.

grid može primati dodatne argumente za detaljniju kontrolu mrežepomocnih linija:

1 grid(color=’k’, linestyle=’:’, linewidth=0.2)

Page 83: Python Skripta

13.4 dodavanje teksta i pomocnih objekata 71

13.4 dodavanje teksta i pomocnih objekata

13.4.1 Naslov

Dodavanje naslova na prostor crtanja vrši se naredbom title:

title(’Text naslova’)

13.4.2 Legenda

Prikazivanje legende na na prostoru crtanja vrši se pomocu naredbelegend uz prethodno definirane opise krivulja (label).

Izvorni kod 31: Prikaz legende na grafu

1 from pylab import *2 from numpy import *3

4 x = linspace(0, 10, 100)

5 y1 = sin(x)

6 y2 = cos(x)

7

8 figure(1, [8, 2])

9 plot(x, y1, label=’sinus’)

10 plot(x, y2, label=’kosinus’)

11 legend()

12 show()

0 2 4 6 8 101.0

0.5

0.0

0.5

1.0

sinuskosinus

Slika 10: Prikaz legende ma grafu

13.5 spremanje grafova

13.6 polarni grafovi

13.7 tips and tricks

Use matplotlib’s calls that won’t block:Using draw():

1 from matplotlib import plot, draw, show

2 plot([1,2,3])

3 draw()

4 print ’continue computation’

5

Page 84: Python Skripta

72 osnovni 2d grafovi

6 # at the end call show to ensure window won’t close.

7 show()

Using interactive mode:

1 from matplotlib import plot, ion, show

2 ion() # enables interactive mode

3 plot([1,2,3]) # result shows immediatelly (implicit draw())

4

5 print ’continue computation’

6

7 # at the end call show to ensure window won’t close.

8 show()

Page 85: Python Skripta

Dio IV

N U M E R I C K E M E T O D E

Page 86: Python Skripta
Page 87: Python Skripta

14R J E Š AVA N J E N E L I N E A R N I H F U N K C I J A

Uvod

14.1 metoda bisekcije

Metoda bisekcije namjenjena je rješavnju jednadžbe f(x) = 0 na inter-valu [a,b]. Da bi se metoda mogla primjeniti, funkcija f(x) mora bitineprekidna te mora vrijediti f(a) · f(b) 5 0. Zbog navedenih uvjeta,funkcija f(x) ima bar jedan korijen na intervalu [a,b].

Metoda biskecije, ako su navedeni uvjeti zadovoljeni, ce sigurnokonvergirati u jedan od korijena funkcije f(x) na intervalu [a,b]. Ap-solutna greška se prepolavlja u svakom koraku iteracije pa metoda ko-nvegira linearno, što je, u odnosu na druge metode, relativno sporo.

Osnovna sintaksa:

bisect(f, a, b)

gdje je f funkcija, a a i b su granice intervala na kojem se traži korijenfunkcije. Dodatni argumenti omogucuju kontrolu i pregled konver-gencije:

args=()

xtol=1e-12

rtol=4.4408920985006262e-16

maxiter=100

full_output=False

disp=True

gdje je xtol apsolutna tolerancija, rtol relativna tolerancija, maxitermaksimalni broj iteracija, full_output omogucuje dohvacanje dodat-nih informacija o konvergenciji i disp omogucuje podizanje Runtime-Error u slucaju da metoda ne konvergira. optimize.bisect

poziva_zeros._bisect, kojaje implementirana uC-u.

Izvorni kod 32: Primjer pronalaženja korijena funkcija metodom biskecije

1 #!/usr/bin/python

2 import scipy.optimize as optimize

3 from numpy import cos

4

5 def f(x):

6 return cos(x)**2 + 6 - x

7

8 # 0<=cos(x)**2<=1, so the root has to be near x=7

9 x0, S = optimize.bisect(f,6,8,full_output=True)

10 print x0

11 print S.iterations

12 print S.function_calls

75

Page 88: Python Skripta

76 rješavanje nelinearnih funkcija

6.77609231632

41

43

14.2 newtnova metoda

Osnovna sintaksa:

newton(func, x0)

The convergence rate of the Newton-Raphson method is quadratic,the Halley method is cubic, and the secant method is sub-quadratic.This means that if the function is well behaved the actual error in theestimated zero is approximately the square (cube for Halley) of therequested tolerance up to roundoff error. However, the stopping cri-terion used here is the step size and there is no guarantee that a zerohas been found. Consequently the result should be verified. Safer al-gorithms are brentq, brenth, ridder, and bisect, but they all requirethat the root first be bracketed in an interval where the function chan-ges sign. The brentq algorithm is recommended for general use inone dimensional problems when such an interval has been found.

14.3 brentova metoda

Osnovna sintaksa:

brent(func, a, b)

Page 89: Python Skripta

15I N T E R P O L A C I J E

Cesto se javlja potreba da na temelju nepotpunih ili rijetkih podatakatreba procjeniti odnosno izracunati vrijednosti u željenim tockama.Interpolacija je metoda konstrukcije novi tocaka unutar raspona dis-kretnog skupa poznatih tocaka podataka.

Interpolacije možemo klasificirati s obzirom na :

• broj dimenzija danog interpolacijskog problema,

• interpolacijsku funkciju (linearna, spline itd.),

• na strukturu zadanih diskretnih podataka (zadani na mreži to-caka ili na nepravilno razbacanim tockama (scatterd))

15.1 1d interpolacija

Klasa interp1d u modulu scipy.interpolate omogucuje 1D interpo-laciju.

interp1d(x, y, kind, axis, copy, bounds_error, fill_value)

gdje je x 1D monotono rastuce polje polje a y n-dimenzionalno po-lje. Dimenzija y-a duž koje se vrši interpolacija treba biti iste du-žine kao i x. kind može biti ’linear’, ’nearest’, ’zero’, ’slinear’,’quadratic’, ’cubic’ ili cijeli broj koji specificira red spline inerpola-cije. Parametar axis odreduje dimenziju y-a duž koje se vrši interpo-lacija. Pozivanja interpolacije izvan intervala zadanih tocaka može sekontrolirati parametrima bounds_error i fill_value. bounds_errorodreduje da li se podiže error u slucaju pokušaja interpolacije vangranica a fill_value definira vrijednost koju interpolacija u tom slu-caju vraca.

Izvorni kod 33: Primjer razlicitih 1D interpolacija

1 from numpy.random import *2 from scipy import interpolate

3 from pylab import *4

5 X = linspace(0., 10., 6)

6 Y = array([1.6, 4., 3.4, 1.6, 1.8, 1.2])

7

8 x = linspace(0., 10., 101)

9

10 f1 = interpolate.interp1d(X, Y, kind=’linear’)

11 y1 = f1(x)

12

13 f2 = interpolate.interp1d(X, Y, kind=2)

77

Page 90: Python Skripta

78 interpolacije

14 y2 = f2(x)

15

16 f3 = interpolate.interp1d(X, Y, kind=3)

17 y3 = f3(x)

18

19 figure(1, figsize=[8, 3])

20 plot(X, Y, ’o’)

21 plot(x, y1, label=’linearna’)

22 plot(x, y2, label=’spline 2. reda’)

23 plot(x, y3, label=’spline 3. reda’)

24 subplots_adjust(bottom=0.1,top=0.95,left=0.05,right=0.98)

25 legend()

26 show()

0 2 4 6 8 101.0

1.5

2.0

2.5

3.0

3.5

4.0

4.5

linearnaspline 2. redaspline 3. reda

Slika 11: Primjer razlicitih 1D interpolacija

15.2 2d i n-d interpolacija

U slucaju dvo-dimenzionalne (ili više) interpolacije, moguce je in-terpolacijski problem postaviti na diskretnim podacima zadanim namreži tocaka ili nepravilno razbacanim tockama (scatterd).

Za interpolaciju vrijednosti zadanih na N-D nestrukturiranim toc-kama koristi se funkcija griddata:Parametar values

može biti 2D polje,pa se na istim

zadanim tockamamože zadati više

velicina koje semogu interpolirati

preko jednog pozivainterpolacijske

funkcije.

griddata(points, values, xi, method, fill_value)

gdje je points numpy polje koje sadrži koordinate zadanih diskretnihpodataka. Oblik polja points je (broj_tocaka, broj_dimenzija). Pri-padajuce vrijednosti zadaju se preko numpy polja values. xi je poljetocaka za koje je potrebno interpolirati zadane podatke.method specificira metodu interpolacije i podržane su sljedece me-

tode:

• nearest

• linear

• cubic

Parametrom fill_value definira se vrijednost koju vraca interpo-lacijska funkcija za tocke izvan podrucja zadanih podataka.

Page 91: Python Skripta

15.2 2d i n-d interpolacija 79

Interpolacija na podacima zadanim na pravilnoj mreži tocaka sevrši pomocu klase interp2d.

interp2d(x, y, z, kind, copy, bounds_error, fill_value)

U izvornom kodu 34 rješen je problem intepolacije dvo-dimenzionalnogpolja zadanog vrijednostima u 25 tocaka (uniformna mreža 5x5). Za-dane tocke te rješenje linearne i kubicne interpolacije prikazani suna slici 12 na kojo jse jasno vidi razlika u glatkoci linearne i kubicneinterpolacijske funkcije.

Izvorni kod 34: Primjer linearne i kubicne 2D interpolacije

1 from numpy.random import *2 from scipy import interpolate

3 from pylab import *4 from mpl_toolkits.mplot3d import Axes3D

5

6 X = linspace(0., 2., 5)

7 Y = linspace(0., 4., 5)

8 Z = array([

9 [1.3, 1.4, 1.1, 1.0, 0.8],

10 [1.6, 1.1, 1.2, 1.3, 1.5],

11 [1.2, 1.5, 1.6, 1.5, 1.6],

12 [1.2, 1.4, 1.5, 1.4, 1.3],

13 [1.3, 1.2, 1.1, 1.1, 1.2]

14 ])

15

16 XX, YY = np.meshgrid(X, Y)

17

18 f1 = interpolate.interp2d(X, Y, Z, kind=’linear’)

19 f2 = interpolate.interp2d(X, Y, Z, kind=’cubic’)

20

21 x = linspace(0., 2., 51)

22 y = linspace(0., 4., 31)

23 xx, yy = meshgrid(x, y)

24

25 z1 = f1(x, y)

26 z2 = f2(x, y)

27

28 fig = plt.figure(figsize=[8, 3])

29

30 subplot(1, 3, 1)

31 scatter(XX, YY, c=Z, marker = ’s’, s = 100, cmap = cm.Purples)

32 xlim(0, 2)

33 ylim(0, 4)

34

35 subplot(1, 3, 2)

36 CS = plt.contourf(xx, yy, z1, cmap = cm.Purples)

37 xlim(0, 2)

38 ylim(0, 4)

39

40 subplot(1, 3, 3)

41 CS = plt.contourf(xx, yy, z2, cmap = cm.Purples)

42 xlim(0, 2)

43 ylim(0, 4)

44

Page 92: Python Skripta

80 interpolacije

45 subplots_adjust(bottom=0.3,top=0.95,left=0.05,right=0.95)

46 cax = fig.add_axes([0.05, 0.1, 0.9, 0.1])

47 fig.colorbar(CS, cax=cax, orientation=’horizontal’)

48

49 show()

0.0 0.5 1.0 1.5 2.00.0

0.5

1.0

1.52.0

2.5

3.0

3.5

4.0

0.0 0.5 1.0 1.5 2.00.0

0.5

1.0

1.52.0

2.5

3.0

3.5

4.0

0.0 0.5 1.0 1.5 2.00.0

0.5

1.0

1.52.0

2.5

3.0

3.5

4.0

0.75 0.90 1.05 1.20 1.35 1.50 1.65

Slika 12: Primjer 2D interpolacije

Page 93: Python Skripta

Dio V

R J E Š AVA N J E M O D E L A T E M E L J E N I H N A O D J IP D J

Page 94: Python Skripta
Page 95: Python Skripta

16P O C E T N I P R O B L E M I

16.1 modeliranje otvorenog vodotoka

Promatrajmo strujanje fluida u otvorenom vodotoku (eng. open chan-nel flow). Poprecni presjeci kanala mogu biti razliciti npr. pravokutni,trapezni i sl., dok se kod prirodnih vodotoka pojavljuju poprecni pre-sjeci nepravilnih oblika. Ukoliko je poprecni presjek kanala jednakna proizvoljnom presjeku, te je nagib dna jednak u bilo kojoj tocki,govorimo o prizmaticnom kanalu.

Na poprecnom presjeku kanala definiramo sljedece velicine:

• A - površina omocenog presjeka kanala (A = A(x,y)

• P - perimetar odnosno opseg omocenog presjeka (P = P(x,y))

• R - hidraulicki radijus (R =A

P)

Klasifikacija strujanja se može napraviti prema razlicitim kriteri-jima. Ako se brzina strujanja ne mijenja u ovisnosti o vremenu, ondaje strujanje stacionarno, u suprotnom se radi o nestacionarnom stru-janju. Nadalje, ako se brzina strujanja ne mijenja s obzirom na udalje-nost u kanalu (od neke referentne tocke) onda je strujanje uniformno,a inace se radi o neuniformnom strujanju.

Pretpostavke:

• kut Φ je mali

• strujanje je izrazito jednodimenzionalno

• tlak je iskljucivo hidrostatski

Opcenito se strujanje u kanalu opisuje sustavom parcijalnih diferen-cijalnih jednadžbi, koje proizlaze iz zakona ocuvanja mase i zakonaocuvanja kolicine gibanja. Ako pretpostavimo da se radi o prizmatic-nom kanalu, možemo ih zapisati u obliku:

∂A

∂t+∂Q

∂x= 0 (1)

∂v

∂t+ g

∂x

(y+

v2

2g

)= g(S0 − Sf) (2)

83

Page 96: Python Skripta

84 pocetni problemi

Slika 13: Skica poprecnog presjeka otvorenog vodotoka

vodno lice

idealan fluid

referentna ravnina

enegetska linija

Slika 14: Energetske linije u strujanju fluida otvorenim vodotokom

Page 97: Python Skripta

16.1 modeliranje otvorenog vodotoka 85

y je dubina vode, v brzina, a Q protok, pri cemu vrijedi relacija v =Q

A. Sf je pad energetske linije

dH

dx, definiran Manningovom formulom

(koja je prikazana u nastavku). Uvedimo oznaku

dH

dx= −Sf (3)

S S0 smo oznacili nagib dna kanala, tj. S0 = −dz

dx= −tan(Φ).

16.1.1 Stacionarno strujanje

Nadalje, ukoliko promatramo stacionarno strujanje fluida, ocito je da

zbog neovisnosti varijabli o vremenu tj. 0

∂A

∂t= 0 i

∂v

∂t= 0, iz prve

jednadžbe sustava (1) slijedi:

Q = konst. (4)

odnosno iz druge jednanžbe

dz

dx+dy

dx+d

dx

(v2

2g

)= Sf (5)

Zapravo se ova jednadžbe može dobiti i ako krenemo od poznatenam Bernoullijeve jednažbe

z+p

ρg+v2

2g= H (6)

prema kojoj je ukupna energija konstantna duž strujnice. Vrijednostenergetske linije oznacimo s H. Uvažavanjem jednakosti p = ρgy ,

slijedi z+ y+v2

2g= H, odnosno deriviranjem po x dobijemo diferen-

cijalnu jednadžbu za dubinu vode y = y(x):

dz

dx+dy

dx+d

dx

(Q2

2gA2

)=dH

dx(7)

Nadalje, kod stacionarnog toka (Q = konst.) u prizmaticnom ka-nalu vrijedi

d

dx

(Q2

2gA2

)=Q2

2g

d

dx

(1

A2

)=Q2

2g

d

dy

(1

A2

)dy

dx

= −Q2

gA3

dA

dy

dy

dx

= −Q2B

gA3

dy

dx

(8)

Page 98: Python Skripta

86 pocetni problemi

Vrsta kanala Manningov koeficijent

Betonski kanal 0.015

Prirodni kanali (glina) 0.030

Rijecni tokovi 0.030 - 0.070

Tablica 12: Vrijednosti Manningovog koeficijenta za razlicite izvedbe kanala.

Kod druge smo jednakosti uvažili cinjenicu da je kanal prizmatican,što znaci da se poprecni profili ne mijenjaju s obzirom na udaljenost

x u kanalu, dok zadnja jednakost slijedi izdA

dy= B. Pad energetske

linijedH

dx= −Sf definiran je Manningovom formulom, pomocu koje

se modeliraju gubici nastali zbog trenja

16.1.2 Maningova formula

The Manning formula, known also as the Gauckler–Manning formula,or Gauckler–Manning–Strickler formula in Europe, is an empiricalformula for open channel flow, or free-surface flow driven by gravity.Robert Manning

(1816-1897) was anIrish engineer.

It was first presented by the French engineer Philippe Gauckler in1867,[1] and later re-developed by the Irish engineer Robert Manningin 1890.

Sf =Q2n2

R4/3)A2 (9)

gdje je n Manningov koeficijent trenja, R =A

Pje hidraulicki radijus,

a P perimetar.

dy

dx=S0 − Sf

1−BQ2

gA3

(10)

Zadatak: Zapocetni uvjet

y(x0) = y0 odreditidubinu vode y(x) iz

diferencijalnejednadžbe (10).

Opazimo da jednadžba (10) vrijedi zaBQ2

gA36= 1

(10) je diferencijalna jednadžba prvog reda oblika

dy

dx= f(x,y(x))

za koju analiticko rješenje znamo odrediti samo u nekim posebnimslucajevima, za razliku od numerickog rješenja koje znamo odreditiu podrucju u kojem je diferencijalna jednadžba dobro definirana. Dabi problem bio u potpunosti modeliran potrebno je zadati i pocetneuvjete.

Page 99: Python Skripta

16.1 modeliranje otvorenog vodotoka 87

Slika 15: Pravokutni poprecni presjek kanala

16.1.3 Uniformno strujanje i normalna dubina

Kao što smo vec spomenuli, kod uniformnog strujanja su brzina i

dubina vode konstantne velicine pa iz jednadžbe (10), zbogdy

dx= 0,

slijedi:

S0 = Sf (11)

Iz Manningove formule (9) potom proizlazi da kod uniformnog tokavrijedi:

Q =1

nAR2/3S

1/20 (12)

Na osnovu te jednadžbe može se odrediti dubina vode kod uniform-nog toka, tzv. normalna dubina koju cemo oznaciti yn.

16.1.3.1 Prizmaticni kanal s pravokutnim poprecnim presjekom

B - širina kanala

A(y) = B · y⇒ dA

dy= B (13)

P(y) = B+ 2y (14)

Kod zadavanja podataka, obicno su nam poznate velicine: Q, n, S0,B. Normalnu dubinu potom možemo odrediti iz sljedeceg izraza:

Q =1

nAR2/3S

1/20

=1

nByn

(Byn

B+ 2yn

)2/3

S1/20

(15)

koristeci neku od numerickih metoda

Page 100: Python Skripta

88 pocetni problemi

Slika 16: Trapezni poprecni presjek kanala

16.1.3.2 Trapezni kanal

B0 - širina kanala Z - nagib bocnih stranica kanala (tangens kuta na-giba bocnih stranica kanala)

A(y) = (B0 + yZ) · y⇒dA

dy= B0 + 2yZ (16)

P(y) = B0 + 2y√1+Z2 (17)

PrimjerOdrediti normalnu dubinu vode yn u trapeznom kanalu, s bocnim

nagibom Z = 2, te širinom dna B0 = 10m. Nagib dna kanala je kons-

tantan i jednak S0 = −dz

dx= 0.001 (1m po km duljine) a Manningov

koeficijent n = 0.013.RješenjeDubinu vode oznacimo s y. Iz slicnosti trokuta slijedi 1 : z = y : x,

pa je x = zy. Površina omocenog presjeka trapeza je A = (B0 + zy)y.Opseg omocenog presjeka trapeza je P = B0+ 2y

√1+ z2. Hidraulicki

radijus je R =A

P=

(B0 + zy)y

B0 + 2y√1+ z2

.

Normalnu dubinu vode potom odredujemo iz jednadžbe (12), kojanakon uvrštavanja dobivenih izraza i i sredivanja poprimi oblik

nQ

S0−

[(B0 + zyn)yn]5/3[

B0 + 2yn√1+ z2

]2/3 = 0

Nakon uvrštavanja poznatih vrijednosti dobijemo

F(yn) = 12.33(10+ 4.47yn)2/3 − ((10+ 2yn)yn)5/3 = 0

Nul tocka funkcije F(y) predstavlja rješenje gornje jednadžbe. Možese odrediti pomocu neke od numerickih metoda npr. bisekcijom iliNewtonovom metodom. Rješenje je

yn = 1.09m

Page 101: Python Skripta

16.1 modeliranje otvorenog vodotoka 89

16.1.4 Kriticna dubina

Nadalje, definirajmo kriticnu dubinu yc. To je dubina kod koje jeFroudov broj jednak 1, tj. The Froude number

is a dimensionlessnumber defined asthe ratio of acharacteristicvelocity to agravitational wavevelocity. It mayequivalently bedefined as the ratioof a body’s inertia togravitational forces.In fluid mechanics,the Froude numberis used to determinethe resistance of apartially submergedobject movingthrough water, andpermits thecomparison ofobjects of differentsizes. Named afterWilliam Froude, theFroude number isbased on thespeed/length ratio asdefined by him.

Fr =v√gyc

= 1 (18)

Opazimo da je u slucaju kriticne dubine nazivnik u diferencijalnojjednadžbi (10) jednak 0 te da diferencijalna jednadžba u toj tocki nevrijedi. Kriticnu dubinu možemo izraziti iz (18) te dobijemo

yc =3

√Q2

gA2=

3

√q2

g(19)

gdje je q =Q

A. Karakteristika kriticne dubine je da je to dubina kod

koje je specificna energijafluida minimalna.Vrijednost c =

√gy nazivamo brzina širenja poremecaja. To je za-

pravo relativna brzina širenja vala u odnosu na medij unutar kojegtaj val putuje. Apsolutne brzine širenja vala su zapravo jednake v− ci v+ c. Ako je v < c onda govorimo o podkriticnom toku, za v = c jetok kritican, dok je za v > c tok nadkritican. Uocimo da kod podkri-ticnog toka vrijedi v− c < 0 , a v+ c > 0 što znaci da se jedan kraj valaputuje uzvodno, a drugi nizvodno. Kod kriticnog je toka v− c = 0 , paje jedna strana vala stacionarna, dok druga putuje nizvodno brzinomv+ c. Za razliku od toga, kod nadkriticnog toka se obje strane valagibaju nizvodno, jer je v− c > 0 i v+ c > 0. Dakle, kod nadkriticnogtoka poremecaj putuje iskljucivo nizvodno, što znaci da tok uzvodnood promatrane lokacije uopce ’ne zna’ što se dogada nizvodno.

16.1.5 Hidraulicki skok

Hidraulicki skok (jump) se pojavljuje kod prijelaza strujanja iz nadkri-ticnog u pdkriticno. U tocki u kojoj je Froudov broj jednak 1 dogodi sehidraulicki skok. Kod hidraulickog skoka dolazi do gubitka energije(zbog turbulencije) i do naglog skoka u vodnom licu. Kako gubitakenergije na skoku nije unaprijed poznat, jednadžbu ocuvanja energijene možemo primijeniti direktno. Uocimo takoder da u tocki skokadiferencijalna jednadžba (10) ne vrijedi jer je nazivnik desne stranejednak nula.

U nastavku cemo promatrati rješenja jednadžbe (10) uz postavljenipocetni uvjet y(x0) = y0, tj. poznatu dubinu vode u nekoj tocki. Kakoanaliticka rješenja jednadžbe nisu poznata, osim u nekim posebnimslucajevima, za rješavanje cemo koristiti numericke metode. Prisje-timo se, da su standardne numericke metode za rješavanje diferen-cijalne jednadžbe prvog reda: Eulerova metoda, poboljšana Eulerova

Page 102: Python Skripta

90 pocetni problemi

metoda i razlicite Runge-Kutta metode. Koju cemo od spomenutihmetoda odabrati ovisi o tocnosti koju želimo postici. Pritom trebasvakako voditi racuna i o stabilnosti pojedinih metoda.

Rješenja postavljenog pocetnog problema mogu biti razlicitog oblika,u zavisnosti o pocetnom uvjetu, nagibu kanala i trenju u kanalu. Pro-matrati cemo razlicite slucajeve u tzv. kanalima s blagim nagibom(mild slope). Takav je nagib okarakteriziran uvjetom

yc < yn (20)

U tom se slucaju linija kriticne dubine nalazi ispod linije normalnedubine. Tim je dvjema linijama podrucje strujanja podijeljeno u trizone (vidi sliku 3.). Oblik rješenja, dakle vodno lice, ovisi o pocetnomuvjetu. Tražena se rješenja odreduju iz diferencijalne jednadžbe (10),koja se za promatrani pravokutni prizmaticni kanal može zapisati uobliku:

dy

dx= S0

1+

(yn

y

)10/3

1−

(yc

y

)3(21)

U ovisnosti o zoni u kojoj se nalazi pocetni uvjet, dakle pocetna du-bina ovisi sami oblik rješenja. Znacajno je naglasiti da dubina vode,odnosno rješenje ne može prijeci diferencijalne jednadžbe iz jedne udrugu zonu – dakle, ako je pocetni uvjet u zoni 1, vodno lice ostati ceu zoni 1. Pripadajuca se krivulja naziva M1 krivulja.

Razlikujemo M1, M2 i M3 krivulje (Slika 17). Vrijedi:

• za yc < yn < y0 rješenje je M1-krivulja

• za yc < y0 < yn rješenje je M2-krivulja

• za y0 < yc < yn rješenje je M3-krivulja

U tockama u kojima se dogodi prijelaz iz jedne u drugu zonu, rješe-nje zapravo ne zadovoljava diferencijalnu jednadžbu (to su slucajeviu kojima je nazivnik u diferencijalnoj jednadžbi jednak 0, dakle tockeu kojima se dostigne kritican tok).

Primjeri u kojima se pojavljuju promatrane krivulje:

• M1-krivulja – podkriticno strujanje (Fr<1) - utok u jezero;

• M2-krivulja – prijelaz iz podkriticnog u nadkriticno strujanjekod kanala ciji se nagib poveca; strujanje prije prijelaza u nad-kriticno ima oblik M2-krivulje;

• M3-krivulja – prijelaz iz nadkriticnog u podkriticno strujanjenpr. strujanje ispod zapornice; dio krivulje prije prijelaza u pod-kriticni tok ima oblik M3-krivulje.

Na slican se nacin rješenja mogu dobiti i za vece nagibe kanala (steepslope) – kada je yc > yn. U tom slucaju rješenja imaju oblik tzv. S-krivulja (Slika 18).

Page 103: Python Skripta

16.1 modeliranje otvorenog vodotoka 91

Slika 17: M-krivulje vodnog lica Slika 18: S-krivulje vodnog lica

16.1.6 Numericko rješavanje

Izvorni kod 35: Strujanje u pravokutnom kanalu

1 # -*- coding: utf-8 -*-

2 """

3 pravokutni kanal

4 transkriticno strujanje

5 rješavanje ODJ

6 """

7

8 from numpy import *9 from scipy.optimize import *10 from scipy.integrate import *11 from matplotlib.pyplot import *12

13 g = 9.81

14

15 # ulazni podaci o kanalu

16 B = 15.0

17 S0 = 0.001

18 n = 0.012

19

20 Q = 10.0

21

22 yc = ((Q/B)**2/g)**(1.0/3.0)

23 print(’yc = ’+str(yc))

24

25 # osnovne velicine

26 A = lambda y: B*y

27 P = lambda y: B+2*y

28 R = lambda y: A(y)/P(y)

29 Sf = lambda y: (n*Q/(R(y)**(2.0/3.0)*A(y)))**2

30

Page 104: Python Skripta

92 pocetni problemi

31 yn = fsolve((lambda y: Sf(y)-S0),yc)

32 print(’yn = ’+str(yn[0]))

33

34 # racunanje razine vode

35 x0 = 0.0

36 y0 = 0.42

37 x1 = 30.0

38

39 X = linspace(x0,x1,100)

40

41 dydx = lambda y,x: (S0-Sf(y))/(1.0-B*Q**2/(A(y)**3*g))

42 Y = odeint(dydx,y0,X)

43

44 #dydx_2 = lambda y,x: S0*(1.0-(yn/y)**(10.0/3.0))/(1.0-(yc/y)**3)

45 #Y_2 = odeint(dydx_2,y0,X)

46

47 #crtanje

48 figure(1, [8, 3])

49 Ydno = -(X-x0)*S0

50 plot(X,Y[:,0]+Ydno)

51 plot(X,Ydno)

52 #plot(X,Y_2[:,0]-(X-x0)*S0);

53 legend((’razina vode’,’dno’),loc=’best’);

54 subplots_adjust(bottom=0.08,top=0.95,left=0.05,right=0.98)

55 show()

0 5 10 15 20 25 300.1

0.0

0.1

0.2

0.3

0.4

0.5

razina vodedno

Slika 19: Numericko rješenje strujanja u otvorenom kanalu pravokutnog pre-sjeka

Page 105: Python Skripta

17R U B N I P R O B L E M I

Uvod, opcenito o rubnim problemima

17.1 savijanje grede

Za rješavanje ovog primjer korišten je rješavac bvp1lg kojeg se možeinstalirati pomocu naredbe:

sudo pip install scikits.bvp1lgbvp1lg zahtjevaFortran compiler!Veza izmedu progiba elasticne linije i postavljenog opterecenja opi-

sana je Euler-Bernoullijevom jednadžbom (Diferencijalna jednadžbaelasticne linije):

EI · d2 u

d x2= −M(x) (22)

ili prošireno

d2

d x2

(EI · d2 u

d x2

)= q(x) (23)

gdje je E Youngov modul, I osni moment tromosti poprecnog pre-sjeka, u je progib grede, M je moment savijanja, q je kontinuiranopoprecno opterecenje, a x je os nedeformirane grede.

Ako je E · I konstantno duž grede, jednadžba (23) se pojednostav-ljuje:

E · I · d4 u

d x4= q(x) (24)

U jednadžbu savijanja moguce je, osim kontinuiranog opterecenja,uracunati i ostala vanjska opterecenja duž grede:

E · I · dd x

(d

d x

(d

d xdud x

+M(x)

)+Q(x)

)= q(x) (25)

Pomocu supstitucija:

w1(x) = u(x)

w2(x) =dud x

w3(x) =d2 u

d x2+M(x)

w4(x) =dud x

(d2 u

d x2+M(x)

)+Q(x)

(26)

93

Page 106: Python Skripta

94 rubni problemi

obicnu diferencijalnu jednadžbu 4. reda (25) može se zapisati kaosustav 4 obicne diferencijalne jednadžbe 1. reda.

dw1

d x= w2(x)

dw2

d x= w3(x) +M(x)

dw3

d x= w4(x) +Q(x)

dw4

d x=1

EIq(x)

(27)

Za sustav (27) potrebno je postaviti 4 rubna uvjeta kako bi se moglodobiti rješenje savijanja grede. Rubni uvjeti koje je moguce postavitisu:

• Rubni uvjet progiba u|xbc= ubc. U tocki xbc postavlja se vri-

jednost progiba ubc.

• Rubni uvjet nagiba dudx

∣∣xbc

= vbc. U tocki xbc postavlja se vri-jednost nagiba vbc.

• Rubni uvjet momenta d2 udx2

∣∣∣xbc

= Mbc. U tocki xbc postavlja se

vrijednost momenta Mbc.

• Rubni uvjet poprecne sile d3 udx3

∣∣∣xbc

= Qbc. U tocki xbc postavlja

se vrijednost poprecne sile Qbc.

U izvornom kodu 36 prikazan je primjer rješavanja savijanja gredekoristeci bvp1lg paket koji je specijaliziran rješavac za rubne pro-bleme. U danom primjeru korišteni su sljedeci rubni uvjeti: lijevi rubje uklješten (nema progiba ni rotacije/nagiba) dok na desnom rubuzglob (nema pomaka ni momenta). Greda je opterecenja konstantnimkontinuiranim opterecenjem duž cijele dužine.

Izvorni kod 36: Rješavanje elasticne linije savijanja

1 from pylab import *2 import scikits.bvp1lg as bvp

3

4 # Definiranje problema

5 EI = 1.0 # Youngov modul i moment otpora

6 L = 1.0 # Duzina grede

7 # Opterecenja

8 qq=-1.0

9 P=-0.0

10

11 # Kontinuirana sila, poprecna sila i moment savijanja

12 def q(x): return qq

13 def Q(x):

14 if x <= L/2.0: return 0.0

15 else: return P

16 def M(x):

Page 107: Python Skripta

17.2 stacionarno provoðenje topline u štapu 95

17 if x <= L/2.0: return 0.0

18 else: return 0.0

19

20 degrees = [1, 1, 1, 1]

21

22 # Sustav diferencijalnih jednadzbi

23 def function(x , y):

24 u, du, d2u, d3u = y

25 return ([ du,

26 d2u+M(x),

27 d3u+Q(x),

28 q(x)/EI])

29

30 # Rubni uvjeti

31 boundary_points = [0.0, 0.0, L, L]

32 def boundary_conditions(y):

33 u, du, d2u, d3u = y

34 return [u[0], du[1], u[2], d2u[3]]

35

36 tol = [1e-15, 1e-15, 1e-15, 1e-15]

37

38 # Rjesavanje rubnog problema

39 solution = bvp.colnew.solve(

40 boundary_points, degrees, function, boundary_conditions,

41 is_linear=False, tolerances=tol,

42 vectorized=False, maximum_mesh_size=10000)

43

44 # Vizualizacija rjesenja

45 figure(1, figsize=(8, 3))

46 x = solution.mesh

47 plot(x, solution(x)[:,0], ’b-’, linewidth=2)

48 xlabel(’x’)

49 ylabel(’y’)

50 grid()

51 subplots_adjust(bottom=0.15,top=0.95,left=0.13,right=0.98)

52 savefig(’greda.pdf’)

53 show()

0.0 0.2 0.4 0.6 0.8 1.0x

0.006

0.005

0.004

0.003

0.002

0.001

0.000

y

Slika 20: Progib elasticne linije grede

17.2 stacionarno provoðenje topline u štapu

Page 108: Python Skripta
Page 109: Python Skripta

Dio VI

O P T I M I Z A C I J S K E M E T O D E

Page 110: Python Skripta
Page 111: Python Skripta

18E V O L U C I J S K I A L G O R I T M I

http://inspyred.github.com/index.html

Kako instaliraty inspyred:

user@machine:~>sudo pip install inspyred

99

Page 112: Python Skripta
Page 113: Python Skripta

Dio VII

D O D A C I

Page 114: Python Skripta
Page 115: Python Skripta

AA P P E N D I X T E S T

103

Page 116: Python Skripta
Page 117: Python Skripta

colophon

This work is licensed under a Creative CommonsAttribution-ShareAlike 3.0 Unported License.

http://creativecommons.org/licenses/by-sa/3.0/

This document was typeset using the typographical look-and-feelclassicthesis developed by André Miede. The style was inspiredby Robert Bringhurst’s seminal book on typography “The Elements ofTypographic Style”. classicthesis is available for both LATEX and LYX:

http://code.google.com/p/classicthesis/

Final Version as of 6. travnja 2013. (classicthesis v0.1).