Professional Documents
Culture Documents
Python Skripta PDF
Python Skripta PDF
PYTHON U RAC
bojan crnkovi c,
jerko kifi c i marko cavrak
stefan ivi c,
Stefan Ivic, Bojan Crnkovic, Jerko kific i Marko Cavrak:
Python u racunarskom inenjerstvu, Numericke metode, priprema, obrada i vizualizacija poc 14. sijecnja 2015.
dataka,
SADRAJ
I
1
osnove pythona
uvod
1.1
1.2
1.3
1.2.2
1.2.3
2.2
2.3
2.4
3.2
3.3
3.4
3.5
3.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . .
Python ljuska kao kalukulator . . . .
Python skripte . . . . . . . . . . .
2.3.1
Upotreba posebnih znakova . .
Moduli . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . .
Clanski
operatori . . . . . . . . . . . . . . .
Operatori identiteta . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
String . .
Liste . .
Tuple . .
.
.
.
.
Dictionary .
Skupovi . . .
Brojevi
.
.
.
.
.
.
.
.
.
.
4.2
4.3
4.4
4.5
4.6
5.2
5.3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6.2
6.3
7.2
7.3
7.4
7.5
7.6
. . . . .
while . . . .
break . . . .
continue . .
4
4
4
5
5
5
6
7
7
7
8
8
12
13
14
16
17
18
19
19
20
20
21
21
23
24
24
25
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
if
25
26
27
29
.
.
.
.
Paraleleno iteriranje .
Numeriranje liste . .
for
23
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
raw_input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
print
petlje
7.1
19
Aritmeticki operatori
uvjetna grananja
6.1
11
.
.
.
.
.
.
Pokretanje Pythona
operatori
4.1
.
.
.
.
.
.
.
.
.
.
.
tipovi podataka
3.1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Spyder . . . . . . .
PyDev . . . . . . .
Kate . . . . . . . .
1.3.3
.
.
.
.
.
.
.
.
.
.
1.3.2
. . . . . . . . . . . . . . .
1.1.1
Instalacija na Linux platformi . . .
1.1.2
Instalacija na Windows platformi .
Dodatni paketi . . . . . . . . . . . .
1.2.1
Dodatni paketi na Linux platformi .
Instalacija
1.3.1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
30
30
31
32
33
iii
iv
sadraj
funkcije
8.1
8.2
8.3
8.4
8.5
8.6
8.7
35
. . . . .
Vracanje vrijednosti iz funkcije . . . . .
Argumenti sa zadanim vrijednostima . .
Keyword i non-keyword argumenti . . .
Ugnjedena definicija funkcije . . . . .
Anonimne funkcije . . . . . . . . . .
Rekurzivne funkcije . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
objektno-orijentirano programiranje
9.4
9.5
9.6
39
40
43
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9.5.1
Preopterecivanje funkcija
.
9.5.2
Preopterecivanje operatora .
Nasljedivanje
. . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10 oblikovanje stringova
10.1
.
.
.
.
11.5 Preimenovanje, kopiranje i brisanje datoteka .
11.6 Arhiviranje . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12.2 Matematicke funkcije . . . . . . . . . . . . .
12.3 Datum i vrijeme . . . . . . . . . . . . . . . .
12.4 Vrijeme izvravanja . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
44
44
45
46
47
48
49
51
57
59
.
11.2 Pisanje u datoteke . . . . . . .
11.3 Citanje
iz datoteka . . . . . . .
11.4 Pozicioniranje u datoteci . . . .
11.1
44
55
Oblikovanje sa operatorom %
11 rad sa datotekama
59
59
60
61
62
62
63
63
63
64
64
67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2 Manipulacija grekama - Exception handling . . . . . . . . . . . . . . . .
13.3 Ispravljanje greaka - DeBugging . . . . . . . . . . . . . . . . . . . . .
67
numpy
71
13.1
II
39
55
9.3
. . . . . . . . . .
Atributi . . . . . . . . .
9.3.1
Globalni atributi .
9.3.2
Objektni atributi .
Metode . . . . . . . . .
Preopterecivanje . . . . .
.
.
.
.
.
.
.
.
.
.
37
. . . . . . . . . . . . . . . . . . . . . .
10.2 Oblikovanje sa metodom format . . . . . . . . . . . . . . . . . . . . .
Klase
.
.
.
.
.
.
.
.
.
.
37
43
Objektno-orijentirano programiranje
9.2
.
.
.
.
.
.
.
.
.
.
36
.
.
.
.
.
.
.
.
.
.
9.1
.
.
.
.
.
.
.
.
.
.
35
Tipovi greaka
. .
.
linspace .
zeros . .
ones . .
eye . . .
diag . .
.
.
.
.
.
.
.
meshgrid .
array
arange
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
69
73
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2 Indeksiranje polja . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.1
68
Informacije o polju
73
74
74
75
75
76
76
77
79
79
79
81
sadraj
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16.3 Dodavanje i brisanje elemenata polja . . . . . . . . . . . . . . . . . . .
16.1
81
16.2
Transponiranje
82
17 u citavanje
i spremanje numpy polja
83
. . . . . . . . . . . . . . . . . . . .
17.2 Spremanje u tekstualne datoteke . . . . . . . . . . . . . . . . . . . . .
17.1
18 matri cni
ra cun
18.1
. . . . . . . . . . . . . . . . . .
III
poly1d
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . .
Mapa boja . . . . . . . . . . . . .
Detaljnije podeavanje grafa izolinija . .
Primjer . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21 sloeniji 2d grafovi
21.1
Izolinije
21.1.1
21.1.2
21.1.3
23.2
23.4
23.5
. . . . . .
Newton-Raphsonova metoda .
Metoda sekante . . . . . . .
Brentova metoda . . . . . .
Zadaci . . . . . . . . . . .
Metoda bisekcije
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
94
96
101
101
102
103
105
105
106
107
113
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
24 interpolacije
113
115
116
116
117
119
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24.2 2D i N-D interpolacija . . . . . . . . . . . . . . . . . . . . . . . . . .
24.1
94
111
23.3
94
109
numeri cke
metode
23.1
91
105
22 izrada animacija
IV
87
89
.
.
.
.
.
.
.
.
.
Linijski grafovi
.
20.5 Podgrafovi . . . .
20.6 Polarni grafovi . .
20.7 tips and tricks . . .
20.4
85
91
. . . . . . . . . . .
20.2 Naprednija kontrola linijskih grafova .
20.2.1
Boje . . . . . . . . . . . .
20.2.2
Markeri . . . . . . . . . . .
20.3
84
87
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20 osnovni 2d grafovi
20.1
83
85
19 rad sa polinomima
19.1
82
1D interpolacija
25 regresije
119
120
123
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
25.3 Zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25.1
123
25.2
Linearna regresija
123
127
. . . . . . . . . . . . . . . . . . . . . . .
26.2 LU dekompozicija . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26.1
27 numeri cko
integriranje
. .
.
27.3 Naprednije metode .
27.4 Zadaci . . . . . . .
27.1
Trapezna formula
27.2
Simpsonove formule
.
.
.
.
.
.
.
.
124
127
128
131
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
131
133
134
135
vi
sadraj
137
28 numeri cke
metode za rjeavanje obi cnih
diferencijalnih jednadbi
.
28.1.1
.
28.1.2
.
28.1.3
.
28.2 Sustavi obicnih diferencijalnih jednadbi 1. reda .
28.3 Obicne diferencijalne jednadbe vieg reda . . .
.
Eulerova metoda . . . . . . . .
Runge-Kutta metode . . . . . .
Rjeavanje pomocu scipy-a . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
141
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
.
.
.
.
.
.
.
.
.
.
.
.
29 po cetni
problemi
29.1
. . . . . . .
Stacionarno strujanje . . . . . . . . .
Maningova formula . . . . . . . . . .
Uniformno strujanje i normalna dubina . .
Kriticna dubina . . . . . . . . . . . .
Hidraulicki skok . . . . . . . . . . .
Numericko rjeavanje . . . . . . . . .
30.1
Progib ploce
. . . . . . . . . . . . .
35.2 Simpleks metoda . . . . . . . . . . . . . . .
35.3 Rjeavanje LP problema pomocu modula PuLP .
35.4 Prakticni primjeri LP problema . . . . . . . . .
35.4.1
Teretni zrakoplov . . . . . . . . . . . .
Definicija LP problema
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36.2 Nelder-Mead metoda za optimizaciju funkcije dviju varijabli . . . . . . . .
Algoritam
37 simulirano kaljenje
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37.2 Primjer simuliranog kaljenja pomocu modula inspyred . . . . . . . . . .
Algoritam
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38.2 Koritenje PSO metode pomocu modula inspyred . . . . . . . . . . . . .
Razvoj metode
39 geneti cki
algoritmi
. . . . . . . . . . . . . . . . . . . . . . . . . . .
39.2 Koritenje DEAP modula . . . . . . . . . . . . . . . . . . . . . . . .
VII
a
Evolucijski algoritmi
dodaci
korisne naredbe u linux operativnom sustavu
a.1
a.2
144
145
146
147
. . . . . . . . . . . . . . . . . . . . . .
Pracenje promjena tekstualnih datoteka . . . . . . . . . . . . . . . . . .
Kreiranje videa iz skupa slika
153
157
167
168
168
169
.
.
.
.
.
36 nelder-mead metoda
39.1
143
167
Optimizacijske varijable
35 linearno programiranje
38.1
142
165
. . . . . . . . . . . . . . . . . . . . . . . . .
34.2 Ciljevi optimizacije i funkcija cilja . . . . . . . . . . . . . . . . . . . .
34.3 Ogranicenja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37.1
140
161
36.1
139
140
157
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
optimizacijske metode
35.1
139
155
33 metoda linija
34.1
139
151
Savijanje grede
32 elipti cke
parcijalne diferencijalne jednadbe
32.1
139
141
.
.
.
.
.
.
.
30 rubni problemi
VI
139
.
.
.
.
.
.
28.1
169
170
170
170
171
175
175
176
181
181
181
185
185
186
189
189
190
197
199
199
199
sadraj
bibliografija
201
vii
POPIS SLIKA
Slika 1.1
Slika 1.2
Slika 6.1
Slika 6.2
Slika 6.3
Slika 7.1
Slika 7.2
Slika 7.3
Slika 19.1
Slika 20.1
Slika 20.2
Slika 20.3
Slika 20.4
Slika 20.5
Slika 20.6
Slika 20.7
Slika 20.8
Slika 20.9
Slika 20.10
Slika 20.11
Slika 20.12
Slika 21.1
Slika 21.2
Slika 23.1
Slika 23.2
Slika 24.1
Slika 24.2
Slika 25.1
Slika 27.1
Slika 27.2
Slika 28.1
Slika 29.1
Slika 29.2
Slika 29.3
Slika 29.4
Slika 29.5
Slika 29.6
Slika 29.7
Slika 30.1
Slika 30.2
Slika 30.3
Slika 32.1
Slika 33.1
Slika 36.1
Slika 36.2
Slika 37.1
Slika 38.1
Slika 38.2
Slika 39.1
viii
5
6
25
26
28
30
31
31
88
91
92
94
96
97
98
98
99
100
101
102
103
106
108
114
115
120
121
124
131
133
140
141
141
144
145
147
147
149
151
152
153
157
161
176
179
183
185
186
195
P O P I S TA B L I C A
Tablica 3.1
Tablica 4.1
Tablica 4.2
Tablica 4.3
Tablica 4.4
Tablica 5.1
Tablica 10.1
Tablica 10.2
Tablica 12.1
Tablica 12.2
Tablica 20.1
Tablica 20.2
Tablica 20.3
Tablica 20.4
Tablica 29.1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
.
19
.
20
.
20
.
21
.
23
.
55
.
56
.
63
. 63
.
92
.
93
.
93
. 101
. 143
ix
8
9
16
20
23
25
26
26
27
29
29
29
29
30
30
31
32
32
32
33
35
36
36
36
37
37
38
38
40
44
44
45
46
46
48
49
50
51
52
55
56
56
59
60
60
61
61
61
61
62
64
65
70
76
79
80
81
81
82
83
83
85
87
91
93
95
101
101
102
107
109
114
116
119
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
120
123
127
127
128
128
132
134
135
139
147
152
158
162
170
172
177
181
186
190
xi
INDEKS
%, 55
alpha, 107
Amoeba, 175
and, 20
anonimne funkcije, 39
append, 15, 82
arange, 74
aritmeticki operatori, 19
array, 73
as, 9
atributi, 44
bisect, 113
bisekcija, 113
break, 30
brent, 116
Brentova metoda, 116
bvp1lg, 152
capitalize, 14
center, 14
class, 44, 4749, 51
clock, 64
close, 59
closure, 39
cmath, 63
coding, 8
color, 94
colormap, 105
continue, 31
contour, 105
contourf, 105
copy, 62
count, 13, 15
datoteke, 59
DEAP, 190
debug, 67, 69
decimal, 64
decode, 14
def, 35
del, 11, 15
delete, 82
diag, 76
dpi, 96
draw, 103
easy_install, 4
elasticna linija, 151
elif, 27
Elipticke parcijalne diferencijalne jednadbe, 157
else, 26, 30
encode, 14
endswith, 13
enumerate, 33
error, 68
Euler-Bernoullijeva jednadba, 151
Eulerova metoda, 139
evolucijski algoritmi, 189
exception, 68
expandtabs, 13
extend, 15
eye, 76
ffmpeg, 199
figsize, 96
figure, 96
file, 59
find, 13
flatten, 81
for, 29
xii
format, 57
from, 9
funkcije, 35
GA, 189
geneticki algoritmi, 189
genfromtxt, 84
globalni atributi, 44
grid, 100
griddata, 120
hidraulicki skok, 146
id, 21
if, 25
import, 8
in, 21
indeksi, 79
index, 13, 15
input, 24
insert, 15, 82
inspyred, 186
integriranje, 131
interp1d, 119
interp2d, 120
interpolacija, 119
is, 21
is not, 21
isalnum, 14
isalpha, 14
isdigit, 14
islower, 14
isspace, 14
istitle, 14
isupper, 14
izolinije, 105
join, 14
Kate, 6
label, 95
lambda, 39
lambda funkcije, 39
legend, 100
legenda, 100
len, 15
linearno programiranje, 169
linspace, 74
list, 14
ljust, 14
loadtxt, 83
logicki operatori, 20
lower, 14
lstrip, 14
LU dekompozicija, 128
M krivulje, 147
Manningov koeficijent trenja, 143
Manningova formula, 142, 143
mapa boja, 105
marker, 94
markeredgecolor, 94
markeredgewidth, 94
markerevery, 94
markerfacecolor, 94
markerfacecoloralt, 94
markersize, 94
math, 63
matrica sustava, 85
meshgrid, 77, 105
metoda Gaussove eliminacije, 127
metoda linija, 161
metoda sekante, 116
INDEKS
xiii
ACRONYMS
DRY
API
UML
xiv
Dio I
OSNOVE PYTHONA
Python je skriptni programski jezik opce namjene.
UVOD
Zato Python? Postoje mnogi razlozi zato odabrati Python kao inenjerski
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 izvravanje koda na gotovo svim
platformama i arhitekturama
? Ugradiv u kodove pisane u drugim programskim jezicima
? Proiriv sa drugim programskim jezicima
? Objektno orjentiran
? Uredna i elegantna sintaksa
? Stabilan
? Bogatstvo dostupnih paketa i biblioteka
? Specijelizirani paketi za numeriku, statistiku, obradu podataka i vizualizacije
? Otvoreni besplatni kod koji odrava velika zajednica programera i
znanstvenika
1.1
1.1.1
instalacija
Instalacija na Linux platformi
Gotovo sve Linux distribucije sade Python pakete u osnovnim repozitorijima, ali i vcina distribucija ima inicijalno instaliran Python.
Na openSUSE distribuciji, Python se moe instalirati jednostavnom naredbom:
sudo zypper in python
1.1.2
Za instalaciju Pythona na Windows platformi potrebno je preuzeti instalacijsku datoteku sa http://www.python.org. Nakon preuzimanja, pokretanjem insta
lacijske datoteke zapocinje isntalacijki program koji 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).
uvod
1.2
dodatni paketi
1.2.1
1.2.2
1.2.2.1
Python distribucije su objedinjane instalacije pythona, raznih dodatnih paketa te c esto i tekstualnih editora ili razvoijnih okruenja. Distribucije su
vecinom ciljane za Windows platformu zbog neprakticne viestruke instalacije svakog pojedinog softwarea.
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
1.3
uredivati
u mnogim tekstualnim editorima.
Razvojna okruenja (eng. Integrated Development Environment, IDE), osim
to omogucavaju uredivanje
koda, sadre niza alata za laki i bri razvoj kao
to su jednostavno pokretanje koda iz IDE-a, debug-iranje koda, pracenje
ispisa i dr.
1.3.1
Spyder
1.3.2
PyDev
uvod
1.3.3
Kate
pokretanje pythona
2.2
Ljuska moe raditi i bazicne operacije sa tekstom tj. nizovima znakova (string).
>>> "Kratki " + "probni " + "tekst."
Kratki probni tekst.
>>>
2.3
python skripte
Oprez! Prilikom
dijeljenja cijelih
brojeva rezultat je
cijeli broj! Kod
decimalnih brojeva
obavezno koristiti
decimalnu tocku.
Osnovni nacin pokretanja python skripte je pokretanje Pythona sa specificiranim .py fajlom:
user@machine:~$ python imeskripte.py
Nakon zavretka
izvodenja
skripte
pomocu python
skripta.py Python
se gasi!
#!/usr/bin/python
Na Windows sustavima datoteke s ekstenzijom *.py su kod intalacije Pythona pridruene programu python.exe. Python skripta se pokrece dvostrukim lijevim klikom mia na skriptu.
2.3.1
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
2.4
moduli
Da bi se objekti odredenog
modula mogli koristiti u kodu, potrebno je
2.4 moduli
Ucitanom modulu se moe dodijeliti novo ime. To se moe napraviti pomocu kljucne rijeci as:
import module_name as new_name
#!/usr/bin/python
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
T I P O V I P O D ATA K A
#!/usr/bin/python
2
3
4
5
brojac
duljina
ime
= 100
# Integer
= 1000.0
# Float
= Hrvoje # String
6
7
8
9
print brojac
print duljina
print ime
#!/usr/bin/python
a = b = c = 1
c = 5
print a
to rezultira
1
#!/usr/bin/python
a, b, c = 1, 2, Hrvoje
11
12
tipovi podataka
>>> print b, c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name b is not defined
>>> print c
2
3.1
brojevi
To su nepromjenjivi(immutable) tipovi podataka, odnosno promjena vrijednosti rezultira novim alociranim objektom. Numericki tip podatka se kreira
pridruivanjem vrijednosti varijabli. Odnosno
1
2
3
#!/usr/bin/python
var1 = 1
var2 = 10
Primjer:
1
2
3
#!/usr/bin/python
del var
del var_a, var_b
3.2 string
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
13
3.2
string
navodnika, jednostrukih
Stringovi su definirani kao slijed znakova izmedu
(apostrofi) ili dvostrukih. Jednom zadane stringove je nemoguce mijenjati jer
su stringovi, u Pythonu, nepromjenjivi (imutable) tip podatka. Niz funkcija
koje rade promjene nad string varijabama zapravo kreiraju kopije izvorne
string varijable.
Dijelove stringova (znakove ili niz znakova - string) je moguce dohvatiti
operatorima [] i [:] sa indeksima koji pocinju od 0 na pocetku stringa sve
do -1 na kraju.
Znak plus (+) oznacava spajanje (concatenation), a asterisk () je operator
ponavljanja. Odnosno:
1
#!/usr/bin/python
2
3
4
print
print
print
print
print
print
#
#
#
#
#
#
5
6
7
8
9
10
11
str, ime
str[0]
str[2:5]
str[2:]
str * 2
str + TEST
print
print
print
print
print
print
cijelog stringa
prvog znaka u stringu
od treceg do petog znaka
znakova od treceg do zadnjeg
stringa dva puta
concatenated string
to c e rezultirati
Hello World! Rudi
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
Iako je moguce
definirati string sa
jednostrukim i
dvostrukim
navodnicima,
preporuka je da se
koriste jednostruki
navodnici.
14
tipovi podataka
3.3
liste
#!/usr/bin/python
2
3
4
5
6
7
8
9
10
11
print
print
print
print
print
print
list
#
list[0]
#
list[1:3]
#
list[2:]
#
tinylist * 2 #
list + tinylist
to c e rezultirati
3.3 liste
#/user/bin/python
2
3
4
5
6
7
8
9
list = [2,3,4,5]
print(len(list)) #broj elemnata u listi
print list
list.insert(0,1) #umetanje elementa 1 u listu na prvu poziciju
print list
del list[-1] #brisnje zadnjeg elementa iz liste
print list
4
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
gdje je start prvi element, stop je gornja granica i step je korak aritmetickog niza.
1
#/user/bin/python
2
3
4
5
6
7
8
remove brie prvi element koji ima vrijednost x a pop brie element na poziciji i. Naredba del L[index] brie element list L na indeksu index.
Osim funkcija za brisanje i dodavanje elemenata, Python liste imaju jo
ugradenih
prakticnih funkcija. index vraca indeks prvog elementa koji ima
15
16
tipovi podataka
3
4
5
6
7
8
9
ljudi.append(Igor)
print ljudi
nadljudi.insert(1,Anita)
print ljudi
nadljudi.extend(ljudi)
print nadljudi
10
11
12
13
14
15
16
nadljudi.pop(1)
print nadljudi
nadljudi.remove(Igor)
print nadljudi
del nadljudi[4:]
print nadljudi
17
18
19
20
print ljudi.index(Marko)
ljudi.append(Marko)
print ljudi.count(Marko)
21
22
23
24
25
nadljudi.sort()
print nadljudi
nadljudi.reverse()
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
3.5 dictionary
#!/usr/bin/python
2
3
4
5
6
7
8
9
10
11
print
print
print
print
print
print
tuple
tuple[0]
tuple[1:3]
tuple[2:]
tinytuple * 2
tuple + tinytuple
#
#
#
#
#
#
print liste
prints prvog elementa liste
print od drugog do treceg elementa liste
print od treceg do zadnjeg elementa
print liste dva puta
print liste nastale spajanjem dvije liste
12
13
14
to c e 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)
#!/usr/bin/python
2
3
4
5
6
dictionary
Dictionary moemo smatrati jednostavnim pridruivanjem odnosno preslikavanjem svih elemenata jednog skupa elementima drugog skupa.
1
#!/usr/bin/python
2
3
4
5
dict = {}
dict[jedan] = Ovo je jedan
dict[2]
= Ovo je dva
6
7
8
9
10
11
print dict[jedan]
print dict[2]
print tinydict
17
18
tipovi podataka
12
13
print tinydict.keys()
# print svih kljuceva
print tinydict.values() # print svih vrijednosti
to c e rezultirati
Ovo je jedan
Ovo je dva
{odjel: admin, code: 6734, ime: hrvoje}
[odjel, code, ime]
[admin, 6734, hrvoje]
skupovi
O P E R AT O R I
? Clanski
operatori
? Operatori identiteta
ili s obzirom na broj operanada:
? Unarni operatori (jedan operand)
? Binarni operatori (dva operanada)
4.1
aritmeti cki
operatori
Aritmeticki operatori omogucuju osnovne matematicke operacije na brojevima. Rezultat aritmetickog operatora je uvijek broj tj. varijabla tipa float
ili int, ovisno o tipovima operanada. Bitno je napomenuti da je tip rezultata
aritmetickih operacija uvijek vieg tipa operanada.
Operator
Opis
Zbrajanje
x+y daje 11
Oduzimanje
x-y daje 7
Mnoenje
x*y daje 18
Dijeljenje
Ostatak dijeljenja
x%y daje 1
//
Cjelobrojno dijeljenje
x//y daje 4
**
Potenciranje
x**y daje 81
4.2
19
20
operatori
Operator
Opis
==
Jednakost
!=
Nejednakost, razlicitost
<>
Nejednakost, razlicitost
>
Vece
>=
<
Manje
<=
4.3
operatori dodjeljivanja
Opis
Dodjeljivanje
+=
Zbrajanje i dodjeljivanje
-=
Oduzimanje i dodjeljivanje
*=
Mnoenje i dodjeljivanje
/=
Dijeljenje i dodjeljivanje
%=
//=
**=
Potenciranje i dodjeljivanje
4.4
logi cki
operatori
#! /usr/bin/python
2
3
4
a = 10
b = 1
4.5 clanski
operatori
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
c = 15
6
7
8
d = a < b
print d
9
10
11
12
13
14
4.5
clanski
operatori
Clanski
opratori slue za odredivanje
pripadnosti odredenoj
listi. Osnovni
c lanski operator je operator in, i moe se proiriti sa logickim operatorom
not te rvot oprator not in. Rezultat c lanskih opratora je bool varijabla koja
daje saznanje da li zadani element pripada listi ili ne pripada list.
>>> a
>>> 2
True
>>> 3
False
>>> 5
True
= [1, 2, 3, 8, 6]
in a
4.6
operatori identiteta
not in a
not in a
21
O 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
Primjer
Opis
%s
String
%d
Cijeli broj
%f
Decimalni broj
%.2f
%10.3d
3
4
5
6
7
8
9
10
a=12
type(a)
print a
print a=, a
print a= + str(12)
print Ovo je a:%d % (a)
print Ovo je a:%.2d % (a)
11
12
13
14
15
b=15.365982
type(b)
print Ovo je b:,b
print Ovo je b:+str(b)
23
24
16
17
18
19
20
21
22
23
24
5.2
raw_input
5.3
input
UVJETNA GRANANJA
Odredene
naredbe ili djelove koda moguce je izvravati ili preskociti ovisno
o vrijednosti postavljenog logickog uvjeta.
6.1
if
Ako uvijet
nije zadovoljen
Logiki
uvjet
Ako je uvjet
zadovoljen
Naredbe
#!/usr/bin/python
2
3
4
5
a = input("a: ")
if a < 0: a = -a
print a
Medutim,
utipkavanjem negativnog broja zadovoljava se postavljeni logicki
uvjet i izvri se operacija a = -a te se potom ispie pozitivna vrijednost
utipkanog broja:
user@machine:~> python if_01.py
a: -11
11
25
26
uvjetna grananja
#!/usr/bin/python
2
3
4
5
a = 0
b = input("b: ")
c = input("c: ")
6
7
8
if b < 0: a = 1; b = -b
print a, b
9
10
11
12
13
14
15
if c < b:
a = 2
b = c - b
c = c +1
a = b + c
print a, b, c
user@machine:~> python if_02.py
b: -6
c: 4
1 6
3 -2 5
6.2
else
Naredbe A
Logiki
uvjet
Ako uvijet
nije zadovoljen
Naredbe B
#!/usr/bin/python
2
3
4
a = input("a: ")
b = input("b: ")
5
6
7
if a < b:
b = a
6.3 elif
8
9
10
11
a = 0
else:
a = b
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
Kao ni u slucaju upotrebe else naredbe dodatno grananje se mora napisati u novom retku. Uobicajeno je da se naredbe koje slijede nakon uvjeta
piu u novom uvucenom retku.
Proirena upotreba ukljucuje kombinaciju vie elif naredbi:
if condition1 : command1
elif condition2 : command2
elif condition3 : command3
#!/usr/bin/python
2
3
a = input("a: ")
4
5
6
7
8
9
10
if a < 0:
print a je negativan
elif a > 0:
print a je pozitivan
else:
print a je nula
27
28
uvjetna grananja
Logiki
uvjet A
Ako je uvjet
zadovoljen
Naredbe A
Ako uvijet
nije zadovoljen
Logiki
uvjet B
Ako je uvjet
zadovoljen
Naredbe B
Ako uvijet
nije zadovoljen
Logiki
uvjet C
Ako je uvjet
zadovoljen
Naredbe C
Ako uvijet
nije zadovoljen
Naredbe D
PETLJE
7.1
for
#!/usr/bin/python
for num in range(2, 5):
print(num)
4
5
print(num)
2
3
4
4
#!/usr/bin/python
text=[ide,patka,preko,save]
for r in text:
print(r)
ide
patka
preko
save
#!/usr/bin/python
for c in patka: print(c)
p
a
t
k
a
#!/usr/bin/python
text=[ide,patka,preko,save]
for i in range(len(text)):
print i, text[i]
29
30
petlje
0
1
2
3
ide
patka
preko
save
7.2
while
Ako je uvjet
zadovoljen
Logiki
uvjet
Ako uvijet
nije zadovoljen
#!/usr/bin/python
i=0
while i*i<=9:
print i
i=i+1
0
1
2
7.3
break
Nakon to se iscrpe svi elemnti niza list ili nakon to uvjet condition
postane neistinit, izvrit c e se naredbe commands2.
Naredbe specificirane u else bloku izvode se kad se petlja zavri zbog
nezadovoljavanja uvjeta sprecificiranog za while petlju ali ne i u slucaju
zavravanje tj. prekida petlje zbog break naredbe (Slika 7.2).
Izvorni kod 7.6: Upotreba else naredbe u petlji
1
2
3
4
#!/usr/bin/python
for num in range(3):
print(num)
else:print(Kraj)
7.4 continue
Break
Naredbe
Ako je uvjet
zadovoljen
Logiki
uvjet
"else" naredbe
Ako uvijet
nije zadovoljen
0
1
2
Kraj
#!/usr/bin/python
i=0
while i*i<=9:
print i
i=i+1
if i==2 : break
else : print(Kraj)
0
1
7.4
continue
Naredbe
Naredbe
Ako je uvjet
zadovoljen
continue
Logiki
uvjet
Ako uvijet
nije zadovoljen
31
32
petlje
#!/usr/bin/python
for num in range(2, 5):
if num==3:continue
print(num)
2
4
7.5
paraleleno iteriranje
Naredbom zip moguce je elemente vie listi pohraniti u jednu listu koja
sadri tupleove pripadajucih elemenata. Takva mogucnost restrukturiranja
podataka vrlo je korisna kod potrebe za istovremenim iteriranjem kroz vie
listi (Izvorni kod 7.9).
Izvorni kod 7.9: Upotreba zip naredbe
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
10
11
for o in osobe:
print o
12
13
14
for i, p in osobe:
print i, p
[(Vlatko, Hoorvat), (Ivana, Bali), (Darko, Copljar), (Igor, Worry)]
(Vlatko, Hoorvat)
(Ivana, Bali)
(Darko, Copljar)
(Igor, Worry)
Vlatko Hoorvat
Ivana Bali
Darko Copljar
Igor Worry
Broj argumenta funkcije zip moe biti i vie od dva a rezultat je analogan
koritenju funkcije zip sa dva argumenta (Izvorni kod 7.10).
Izvorni kod 7.10: Upotreba zip naredbe sa vie lista.
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
7.6
numeriranje liste
Funkcija enumerate omogucuje numeraciju elemenata liste na nacin da kreira iterabilni enumerate objekt koja sadri tuplove elemenata izvorne liste te
njihve indekse. Dodatno, enumerate moe primiti argument koji ukazuje od
kojeg broj pocinje numeracija.
Izvorni kod 7.11: Numeriranje elemenata liste pomocu enumerate.
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
10
11
12
print Kreni od 0:
for i, x in enumerate(X):
print a[%d]: %f % (i, x)
13
14
15
16
print Kreni od 1:
for i, x in enumerate(X, 1):
print a[%d]: %f % (i, x)
Iteriranje pomocu enumerate:
(0, 12.3)
(1, 18.6)
(2, 2.1)
(3, 12.3)
Kreni od 0:
a[0]: 12.300000
a[1]: 18.600000
a[2]: 2.100000
a[3]: 12.300000
Kreni od 1:
a[1]: 12.300000
a[2]: 18.600000
a[3]: 2.100000
a[4]: 12.300000
33
FUNKCIJE
? Ugradene
funkcije su funkcije koje su dio Python programskog jezika
? Funkcije definirane od strane korisnika.
8.1
gdje je functionname odabrano ime funkcije a commnds je naredba ili vie naredbi koje funkcija izvrava. Prethodno definiranu funkciju moemo izvriti
pozivom te funkcije. Funkcija se poziva pomocu imena funkcije nakon kojeg
slijede zagrade.
Izvorni kod 8.1: Definicija i pozivanje jednostavne funkcije
1
#!/usr/bin/python
2
3
4
def pozdrav():
print Pozdrav!
5
6
pozdrav()
Pozdrav!
35
36
funkcije
#!/usr/bin/python
2
3
4
5
6
7
8
def zbroji( a, b ):
c = a + b
print a, +, b, =, c
9
10
11
pozdrav(Marko)
zbroji(2, 5)
Pozdrav Marko !
2 + 5 = 7
8.2
vra canje
vrijednosti iz funkcije
Funkcija moe vratiti vrijednost nakon poziva funkcije. Vrijednost koju funkcija vraca doslovno zamjenjuje funkciju u kontekstu u kojem je ona pozvana,
a tip vracenog podatka moe biti bilo koji Python objekt. Vracanje vrijednosti se definira naredbom return nakon koje se zaustavlja izvravanje funkcije:
def functionname(arg1, arg2, ... , argn):
commands
return value
Izvorni kod 8.3: Definicija funkcije koja prima vie argumenata i vraca vrijednost
1
#!/usr/bin/python
2
3
4
5
6
7
8
x = zbroji(2, 6)
y = zbroji(x, -5)
9
10
print x, y
8 3
Funkcija moe sadravati vie return naredbi (obicno u razlicitim uvjetnim grananjima) i svaka moe vratiti razlicit tip podatka (Izvorni kod 8.4).
Izvorni kod 8.4: Funkcija koja vraca razlicite tipove
1
#!/usr/bin/python
2
3
4
5
6
7
8
9
10
x = luda_funkcija(6, 2)
y = luda_funkcija(x, 10)
11
12
print x, y
8 malo teksta
#!/usr/bin/python
2
3
4
5
6
7
8
9
x = f(6.0, 2.0)
print x
10
11
12
13
c, d = f(6.0, 2.0)
print c
print d
(8.0, 4.0)
8.0
4.0
8.3
Funkcije mogu biti dfinirane i sa zadanim vrijednostima argumenata. Argumenti sa zadanim vrijednostima mooraju biti definirani nakon argumenata
bez zadanih vrijednosti.
def functionname(arg1=val1, arg2=val2, ... , argn=valn):
commands
return value
#!/usr/bin/python
2
3
4
5
6
7
8
9
10
11
a = f(6.0, 2.0)
b = f(20.0)
c = f(-3.0)
12
13
print a, b, c
4.0 20.0 0.0
8.4
37
38
funkcije
1
2
3
# Definiranje funkcije
def f(x, a, b):
return x*(a+b)
4
5
6
7
8
9
Posebna sintaksa definiranja funkcije pomocu * i ** omogucuje koritenje varijabilnog broja argumenata funkcije. Argument definiran sa jendom
zvjezdicom, uobicajeno *args, obuhvaca sve non-keyword argumente u jedan tuple. Upotrebom dvostruke zvijezdice **kwargs omogucuje pohranu
svih keyword argumenata u dictionary gdje su kljucevi imena argumenata a
vrijednosti argumenata su pohranjene u vrijednosti pod pripadajucim kljuc em.
Izvorni kod 8.7: Funkcija sa *args i **kwargs argumentima
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
10
11
Prilikom koritenja
oba operatora za
raspakiravanje
argumenata (* i **)
vano je potivati
redoslijed. I kod
definicije funkcije i
kod poziva funkcije
prvo se koriste
non-keyword
argumenti a ond
akeyword argumenti.
Osim prilikom definicije funkcije, sintaksa *args i **kwargs moe se koristiti i pri pozivu funkcije. Zvijezdicom * se tuple vrijednosti raspakiraju
u argumente funkcije. Analogno, keyword argumente definirane u dictionaryu moe se proslijediti funkciji pomocu dvije zvijezdice **. U izvornom
kodu 8.8 prikazano je koritenje *args i **kwargs prilikom poziva funkcije.
Izvorni kod 8.8: *args i **kwargs argumenti prilikom poziva funkcije
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
10
11
12
13
a = (1, 2, 3, 4, 5)
funkcija(*a)
14
15
16
17
18
19
a = (5, 4)
kwa = {e:1, d:2, c:3}
20
funkcija(*a, **kwa)
argumenti:
a: 1
b: 2
c: 3
d: 4
e: 5
argumenti:
a: 3
b: 5
c: 2
d: 1
e: 4
argumenti:
a: 5
b: 4
c: 3
d: 2
e: 1
8.5
8.6
def vanjska(vanjski_argument):
def unutarnja(unutarnji_argument):
return vanjski_argument * unutarnji_argument
return unutarnja
f = vanjska(5)
f(3)
f(4)
anonimne funkcije
3
4
39
40
funkcije
def poruka(ime):
return lambda poruka: ime + : + poruka
3
4
5
6
p = poruka(Mario)
print p(Bok!)
print p(Kako ste?)
Mario: Bok!
Mario: Kako ste?
8.7
rekurzivne funkcije
suma = 0
for index in range(1,101):
suma = suma + index
4
5
print suma
Znaci suma se postepeno povecava dok se ne iscrpi lista, tj. sekvenca indeksa definirana pozivom na range naredbu.
index = 1
suma =
index = 2
suma =
index = 3
suma =
index = 4
suma =
0 + 1
1 + 2
3 + 3
6 + 4
41
. Tako zapisani izraz daje naslutiti kako je slijedeca suma zapisana kao suma
iz prethodnog koraka na koju se nadodaje vrijednost index iz trenutnog
koraka iterativne petlje. Ovakav zapis u biti je obrnuti zapis od prirodnog
sukcesivnog povecavanja indeksa:
suma(100) = suma(99) + 100, gdje je
suma(99) = suma(98) + 99, gdje je
suma(98) = suma(97) + 98, i tako dalje sve do
.
.
.
suma(1) = suma(0) + 1
def rsuma(x):
return rsuma(x)
No, kao to vidite ova funkcija vraca poziv na samu sebe koja vraca poziv
na samu sebe koja vraca poziv na samu sebe i tako u beskonacnost. Ovako
definirana rekurzivna funkcija nema kraja, a program ulazi u beskonacnu petlju (eng. infinite loop). A gdje je greka? Kako bi sprijecili ovakvo ponaanje
potrebno je uvesti uvjet prekida. To je granicna vrijednost nakon koje funkcija
vie nece vratiti sebe vec neku vrijednost. Ako se sada vratimo na sumu
brojeva onda bi rekurzivna funkcija sume trebala izgledati ovako:
1
2
Mogucnost zapisa
funkcije u obliku koji
poziva istu funkciju
nazivamo rekurzija,
a takvu funkciju
rekurzivna
funkcija.
def rsuma(n):
return rsuma(n - 1) + n
def rsuma(n):
if n = 0:
return 0
else:
return rsuma(n - 1) + n
def factoriel(n):
if n = 0:
return 1
else:
return factoriel(n - 1) * n
Rekurzivni zapis
unosi konciznost i
eleganciju u
programski kod.
42
funkcije
1
2
3
4
5
def potencija(x,n):
if n = 0:
return 1
else:
return potencija(x, n - 1) * x
def rloop():
x = int(raw_input(Unesi broj ili 0 za kraj))
3
4
if x:
return [x]+rloop()
5
6
7
else:
return []
OBJEKTNO-ORIJENTIRANO PROGRAMIRANJE
9.1
objektno-orijentirano programiranje
dene
vrijednosti (stanja). Ponaanje ili aktivnosti odredenog
objekta utjelov
ljene su u programu u obliku funkcija koje izvravaju odredene
radnje vane
za objekt ili korisnike koji koriste objekte (npr. metode koje moe izvriti
automobil su kocenje, ubrzavanje, mijenjanje brzine, skretanje). Tako definirani objekti omogucuju proirenje postojece funkcionalnosti programskog
43
44
objektno-orijentirano programiranje
klase
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
class Dokument:
"""
Klasa Dokument omogucuje instanciranje objekata Dokument
"""
>>> d1 = Dokument()
>>> d2 = Dokument()
>>> d1
<__main__.Dokument instance at 0x7f050f2c0098>
>>> d2
<__main__.Dokument instance at 0x7f05000287e8>
>>>
Prikazani izvorni kod i output iz Python konzole pokazuju nacin definicije klase te nacin instanciranja dva objekta d1 i d2. Printanjem u konzoli
objekata d1 i d2 moguce je vidjeti da su oba objekta instance te da je svaka
zasebno referencirana u memoriji na drugo adresno mjesto.
9.3
atributi
Globalni atributi
9.3 atributi
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
class Dokument:
"""
Klasa Dokument omogu
cuje instanciranje objekata Dokument
"""
8
9
10
ime=Dokument1
sadrzaj=Ovo je prva linija u dokumentu
11
12
13
d1=Dokument()
d2=Dokument()
>>> d1.ime
Dokument1
>>> d2.ime
Dokument1
>>> Dokument.ime
Dokument1
Atribut ime je stoga dostupan svim objektima kao i samoj klasi Dokument. Potrebno je napomenuti da je moguce doci do pogreke ako objekt
nastoji mijenjati vrijednost klasnom atributu. Naime, takvim c inom nije iz
mijenjena vrijednost klasnom atributu vec je izraden
novi atribut istoga
imena, a koji pripada objektu.
>>> d2.ime
Dokument1
>>> d2.ime=Doc
>>> Dokument.ime
Dokument1
Objektni atributi
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
class Dokument:
"""
Klasa Dokument omogu
cuje instanciranje objekata Dokument
"""
def __init__(self):
45
46
objektno-orijentirano programiranje
self.ime=
self.sadrzaj=
9
10
11
12
13
d1=Dokument()
d2=Dokument()
14
15
16
d1.ime=Prica01
d1.sadrzaj=Bio jednom jedan val.
17
18
19
20
d2.ime=ListaSerija
d2.sadrzaj=Lud, zbunjen, normalan.\n
d2.sadrzaj+=Sila\n
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
8
9
10
class Dokument:
"""
Klasa Dokument omogu
cuje instanciranje objekata Dokument
"""
def __init__(self,name=Dokument,content=):
self.ime=name
self.sadrzaj=content
11
12
13
14
15
d1=Dokument(Esej,Prva recenica)
d2=Dokument(Blog01)
d3=Dokument()
metode
odredeni
objekt. Svaka metoda mora biti definirana kao funkcija i posjedovati minimalno jedan argument, a to je self kao opis objekta za kojega
se izvrava metoda. Slijedeci primjer definira metodu Info koja omogucuje
printanje naziva i sadraja objekta koji ju je pozvao.
Obratite panju na koriteni globalni atribut DokumentList kao listu objekata koja se puni prilikom inicijalizacije.
Izvorni kod 9.5: Definicija metode
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
class Dokument:
"""
Klasa Dokument omogucuje instanciranje objekata Dokument
"""
8
9
10
DokumentList=[]
9.5 preopterecivanje
11
12
13
14
def __init__(self,name=Dokument,content=):
self.ime=name
self.sadrzaj=content
Dokument.DokumentList.append(self)
15
16
17
18
def Info(self):
print Ime dokumenta:,self.ime
print Sadrzaj:\n,self.sadrzaj
19
20
21
22
d1=Dokument(Esej,Prva recenica)
d2=Dokument(Blog01)
d3=Dokument()
23
24
25
26
for d in Dokument.DokumentList:
d.Info()
print \n
Self prvi put dobiva znacaj kao prvi c lan argument liste metode __init__(def
__init__(self,arg1,arg2,...)). Unutar same metode svaki od atributa koji se koriste mora biti zapisan uz pomoc self. prefiksa.
Moemo to gledati na drugaciji nacin. Zamislite da je klasa modul koji
ima svoje pod-funkcije (metode). Svaka od tih pod-funkcija ima mogucnost
mijenjati atribute nekom objektu. To je ostvarivo samo ako pod-funkcija
moe pristupiti objektu i njegovim atributima.
Upravo to c inimo predajuci self metodi __init__. Predajemo objekt u obliku
rijeci self, te nakon toga vrijednosti koje elimo dodijeliti atributima. No u
stvarnosti Python dozvoljava pozivanje funkcija bez davanja sebe kao prvog
c lana argument liste.
Znaci d1.Info() je isto to i Dokument.Info(d1). Prvi omogucava jednostavniji poziv metode dok drugi ukazuje nacin kako Python ustvari radi, tj.
predaje metodi objekt koji u deklaraciji metode stoji kao self.
9.5
preopterecivanje
Jedna od osobina objektno-orjentiranog programiranja je mogucnost preopterecivanja funkcija i operatora kako bi i objektima omogucili istu funkcionalnost kao i klasicnim varijablama poput int, float, bool, string, list, itd.
Takva osobina c esto je i nunost kako bi operatore mogli dovoditi u odre
dene
odnose i operacije ili nad objektima izvriti radnje poput printanja.
Cesto
se za evaluaciju ili grananje sluimo operatorima usporedbe (>,>=,<,<=,
==) te logickim operatorima and i or. Istu funkcionalnost moguce je postici
47
48
objektno-orijentirano programiranje
Nadalje, objekti mogu biti tako osmiljeni da je od znacaja primjena osnovnih numerickih operatora (+,-,*,/,itd.) kako bi se kreirali novi objekti sa
izmjenjenim atributima na temelju numerickih operatora (npr. ako su one
dvije kosare iz prethodnog zadatka bile pune i u njih vise ne stane onda je
moguce u novu kosaru dodati sastojke iz prethodne dvije pune kosare).
Sva preopterecenja u Pythonu predefinirana su u obliku specijalnih metoda koje svaka klasa moe implementirati. Specijalne metode imaju naziv
sa dvije donje crte ispred i iza naziva (npr. __str__ili __gt__)
omeden
9.5.1
Preopterecivanje funkcija
5
6
7
8
class Point:
9
10
11
12
def __init__(self,x,y):
self.x=x
self.y=y
13
14
15
def R(self): # funkcija koja vraca radij vektor tocke, tj. udaljenost od
ishodista
return sqrt(self.x**2 + self.y**2)
16
17
18
19
20
21
22
23
24
25
26
27
28
29
p1=Point(2,1)
p2=Point(1,2)
p3=Point(3,0)
30
31
32
33
34
35
print
print
print
print
print
p1>p2
p1>=p2
p1<=p2
p1<p3
p1==p2
U ovom primjeru naredba print je preopterecena koristeci specijalnu funkciju __str__koja vraca string koji c e biti printan prilikom printanja objekta.
p r i n t PTS1
p r i n t PTS2
9.5 preopterecivanje
5
6
7
8
class RVector:
9
10
11
12
def __init__(self,x,y):
self.x=x # atribut x koordinata
self.y=y # atribut y koordinata
13
14
15
def R(self): # metoda koja vraca duljinu radij vektora, tj. udaljenost od
ishodista
return sqrt(self.x**2 + self.y**2)
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
p1=RVector(2,1)
p2=RVector(1,2)
p3=RVector(3,0)
32
33
34
35
36
37
print
print
print
print
print
False
True
True
False
True
p1>p2
p1>=p2
p1<=p2
p3<p2
p1==p2
49
50
objektno-orijentirano programiranje
Aritmeticki operatori
? __add__ - zbrajanje - +
? __sub__ - oduzimanje - -
? __mul__ - mnoenje - *
? __div__ - djeljenje - /
Izvorni kod 9.8: Preopterecivanje funkcije print
1
2
3
class Table:
4
5
6
7
8
def __init__(self,a=1.0,b=1.0):
self.a = a
self.b = b
self.Area = self.a * self.b # atribut povrsine stola
9
10
11
def __str__(self):
return Table = %4.1f x %4.1f \n Area = %6.2f % (self.a,self.b,self.Area)
12
13
14
15
16
17
18
self.a=tmpB
self.b=tmpA
19
20
21
22
# Preoptereceni aritmeti
cki operatori
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
t1=Table(10,20)
t2=Table(20,40)
print t1
print t2
t1-t2
t2-t1
t1+t2
t1.Rotate()
t1-t2
print t1
print t2
9.6 nasljeivanje
nasljeivanje
Nasljedivanje
je u pravilu proces kojim od viih hijerarhijskih razina ili
grupacija poprimamo neke osobine ili funkcije.
metoda iz nadredenih
klasa. Deklaracija klase koja posjeduje nadklasu data
je u slijedecoj liniji koda:
class Sudoku(Igra):
Naslijedivanje
ima jo jednu prednost koja se ocituje u sistematizaciji izvornog koda. Kada ne bi imali nadklasu, svaka od podklasa trebala bi sama
inicijalizirati svoje atribute kao i definirati svoju funkciju Info(). Na taj nacin
izvorni kod bi bio predugacak, nejasan i necitljiv.
51
52
objektno-orijentirano programiranje
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
h1=Highway(A1,1000)
m1=MainRoad(E54,540)
l1=LocalRoad(S16,125)
h1.Info()
m1.Info()
l1.Info()
Road definition
Ime:
Length:
Road definition
Ime:
Length:
Road definition
Ime:
Length:
A1
1000
E54
540
S16
125
U situaciji kada pojedina podklasa ipak zahtjeva prilikom inicijalizacije definirati neki vlastiti atribut tada definicija __init__unutar podklase predefinira (override) __init__metodu nadklase. U tom slucaju je potrebno pozvati
inicijalizacijsku metodu nadklase unutar inicijalizacijske metode podklase.
9
10
11
12
13
def Info(self):
print "Road definition"
print "Ime:\t %15s" % self.name
print "Length:\t %15s" % self.length
14
15
16
17
18
19
20
21
22
23
24
25
26
class Highway(Road):
def __init__(self,name,length): # override __init__ nadklase
Road.__init__(self,name,length) # invokacija __init__ metode nadklase
self.type=highway
self.toll=50 # Kn/100km
class MainRoad(Road):
def __init__(self,name,length): # override __init__ nadklase
Road.__init__(self,name,length) # invokacija __init__ metode nadklase
self.type=mainroad
class LocalRoad(Road):
def __init__(self,name,length): # override __init__ nadklase
Road.__init__(self,name,length) # invokacija __init__ metode nadklase
9.6 nasljeivanje
self.type=localroad
27
28
29
30
31
h1=Highway(A1,1000)
m1=MainRoad(E54,540)
l1=LocalRoad(S16,125)
32
33
print h1.toll
50
53
10
O B L I K O VA N J E S T R I N G O VA
10.1
oblikovanje sa operatorom %
ubaciti odredenu
vrijednost u stringu oznacavaju se znakom % i posebnim
oznakama koje detaljnije definiraju formatiranje ubacene vrijednosti. Nakon
stringa i operatora % (Nije isto to i oznaka u samom stringu) u tupleu ili
dictionaryju se zadaju vrijenosti ili varijable koje treba umetnuti u string.
Izraz koji definira format ubacene vrijednosti sastoji se od:
? znak % koji oznacava pocetak izraza za definiranje formata,
? kljuc mapiranja (neobavezno) koji definira ime (kljuc) vrijednosti koja
se ubacuje u string,
? konverzijske opcije (neobavezno),
? minimalni broj rezerviranih znakova (neobavezno),
? preciznost (neobavezno), oznacava broj decimalnih mjesta koje se prikazuju i pie se nakon znaka ..
? tip konverzije.
Ako se koristi kljuc mapiranja onda vrijednosti treba zadati u dictionaryju
dok se inace zadaju u tupleu.
Konverzijske opcije se definiraju pomocu znakova opisanih u tablici 10.1.
Simbol
Opis
Poravnanje u lijevo
s = a =
print s
12.37, b
s = a =
print s
12.37, b
s = a =
print s
12.37, a
55
Upotrebom kljuceva
mapiranja zadavanje
argumenata u
dictionaryju ne mora
biti u istom
redosljedu kao i
pozicije ubacivanja u
samom stringu. Na
ovaj se nacin
argumenti mogu
upotrijebiti vie puta,
bez potrebe da ih se
viestruko puta
zapisuje unutar
dictionaryja.
56
oblikovanje stringova
Simbol
Tip
Cijeli broj
Oktalni broj
Heksadecimalni broj
Decimalni broj
Tekstualni znak
String
2
3
l = range(1, 11)
4
5
6
7
8
for i in range(len(l)):
s = %03d %4.1f %6.1f %5.2f %+6.3f % \
(i+1, l[i], l[i]**2.0, sqrt(l[i]), sin(l[i]))
print s
001 1.0
002 2.0
003 3.0
004 4.0
005 5.0
006 6.0
007 7.0
008 8.0
009 9.0
010 10.0
1.0
4.0
9.0
16.0
25.0
36.0
49.0
64.0
81.0
100.0
1.00
1.41
1.73
2.00
2.24
2.45
2.65
2.83
3.00
3.16
+0.841
+0.909
+0.141
-0.757
-0.959
-0.279
+0.657
+0.989
+0.412
-0.544
10.2
Svi string objekti sade metodu format koja omogucuje napredno formatiranje i kontrolu stringova.
57
11
R A D S A D AT O T E K A M A
11.1
gdje je ime_datoteke sting koji sadri relativnu ili apsolutnu putanju datoteke, vrsta_pristupa je string koji sadri mod pristupa, buffering je
pisanje u datoteke
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
datoteka = open(info.txt, w)
5
6
7
8
datoteka.write(Tehni
cki fakultet)
datoteka.write(, Rijeka)
datoteka.write(\nVukovarska 58)
9
10
datoteka.close()
59
Pocetna pozicija
unutar datoteke
razlikuje se ovisno o
opciji r, w
(pocetak datoteke) ili
a (kraj datoteke).
60
rad sa datotekama
Tehni
cki fakultet, Rijeka
Vukovarska 58
11.3
citanje
iz datoteka
gdje je size velicina sadraja koji treba procitati. Za binarnu datoteku size
oznacava broj bitova a za tekstualnu broj znakova. Ukoliko je size negativan
ili nije zadan, c ita se cijeli sadraj datoteke.
f.readline(size)
readlines vraca sadraj datoteke kao listu linija. size ima jednak ucinak
data = open(test.txt, r)
print data.read(5)
print data.readline()
print data.readline(6)
print data.readlines()
data.close()
12345
6789
ABCDEF
[GHIJKLMNOPQRSTUVWXYZ\n, 3. linija\n, 4. linija\n, zadnja!]
Osim pomocu navedenih funkcija, postoji jo jedan nacin pristupanju linijama neke tekstualne datotetke, a to je iterirajuci kroz file objekt kao to je
prikazano u izvornom kodu 11.3.
Izvorni kod 11.3: Pristupanje sadraju datoteke preko iteriranja po file objektu
1
2
3
4
5
6
data = open(test.txt, r)
s =
for line in data:
s += line
print s
data.close()
123456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
3. linija
4. linija
zadnja!
11.4
pozicioniranje u datoteci
Metoda tell daje broj bitova (znakova) trenutne pozicije od pocetka datoteke (Izvorni kod 11.4).
seek momogucuje micanje trenutne pozicije u datoteci. Sintaksa metode
je:
f.seek(offset, from)
data = open(test.txt, r)
print data.readline()
print pozicija:,data.tell()
print data.read(3)
print pozicija:,data.tell()
data.seek(6,1)
print data.read(3)
data.seek(-3,1)
print data.read(5)
data.seek(0,0)
print data.read(5)
61
62
rad sa datotekama
12
13
14
data.seek(-5,2)
print data.read(5)
data.close()
123456789
pozicija: 10
ABC
pozicija: 13
JKL
JKLMN
12345
dnja!
11.5
http://docs.python.org/2/library/shutil.html
# simply
import os
os.rename(a.txt,b.kml)
4
5
6
7
# or
import shutil
shutil.move(a.txt, b.kml)
8
9
10
11
12
11.6
1
2
3
4
5
6
arhiviranje
12
P Y T H O N S TA N D A R D L I B R A R Y
http://docs.python.org/2/library/index.html
12.1
http://www.pythonforbeginners.com/systems-programming/how-to-use-the-platform-module-in-python/
12.2
matemati cke
funkcije
Python modul math sadri standardne matematicke funkcije za realne brojeve koje su definirane C standrdom, s kojima se najcece susrecemo prilikom pisanja nekog programa.
Funkcija
Opis
math.fabs(x)
math.fsum(niz)
math.isnan(x)
math.exp(x)
Exponencijalna funkcija ex .
math.log(x, b)
math.cos(x)
math.acos(x)
math.e
#!/usr/bin/python
from math import log,e,fsum
print log(e)
print fsum([1,2,3])
1.
6.
Opis
63
64
Python modul decimal omogucuje racunanje i pravilno zaokruivanje realnih brojeva u aritmetici s proizvoljnim brojem decimalnih mjesta.
Primjer upotrebe nekih funkcija math modula:
1
2
3
4
5
6
#!/usr/bin/python
from decimal import *
getcontext().prec = 6
print Decimal(1) / Decimal(3)
getcontext().prec =30
print Decimal(1) / Decimal(3)
0.333333
0.333333333333333333333333333333
12.3
datum i vrijeme
http://www.tutorialspoint.com/python/python_date_time.htm
12.4
vrijeme izvravanja
Ucinkovitost odredenog
algoritma, djela izvornog koda ili pak cijelog izvornog koda vrlo je bitan faktor ukupne kvalitete racunalnog programa. Ucin
kovitost odredenog
izvornog koda se, prije svega, moe mjeriti vremenom
izvodenja
tog koda.
time.clock() ili
time.time() se
? na MS Windows platformi, time.clock() daje ukupno utroeno vrijeme koje obuhvaca vrijeme racunanja (procesor) ali i utroeno vrijeme
na c itanje datoteka (disk) ili npr. utoreno vrijeme na uspostavljanje
konekcije preko nekog mrenog protokola.
Kod mjerenja izvravanja koda koji radi sa c itanje ili pisanjem datoteka ili
koji vri komunikaciju preko mrenih protokola, rezultati c e biti ovisni i o
platformi na kojoj se kod izvrava.
Izvorni kod 12.1: Primjer mjerenja vremena izvravanje algoritma
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
import time
5
6
7
8
# dohvati vrijeme po
cetka
start_c = time.clock()
start_t = time.time()
9
10
11
12
13
14
15
16
17
# Algoritam
a = 0.0
for i in range(1000):
for j in range(i):
a = a + (i - j)**0.3
18
19
20
21
22
23
24
25
26
27
Python Standard Library sadri klasu Timer koja omogucuje mjerenje vremena izvravanja Python izraza.
Izvorni kod 12.2: Primjer upotrebe Timer klase za mjerenje vremena izvodenja
funkcije
1
2
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
import timeit
from math import sqrt
6
7
8
9
10
11
# Algoritam
def f(x):
s = 0.0
for i in range(x):
s = s * sqrt(s+x)
12
13
14
15
16
r1 = t.timeit(number=1000)
print Potrebno vrijeme za 1000 poziva funkcije f(500): %.5f % r1
17
18
19
20
21
r5 = t.repeat(number=1000, repeat=5)
print \nPonavljanje testa (5 puta):
for r in r5:
print Potrebno vrijeme za 1000 poziva funkcije f(500): %.5f % r
Potrebno vrijeme za 1000 poziva funkcije f(500): 0.05833
Ponavljanje testa (5 puta):
Potrebno vrijeme za 1000 poziva
Potrebno vrijeme za 1000 poziva
Potrebno vrijeme za 1000 poziva
Potrebno vrijeme za 1000 poziva
Potrebno vrijeme za 1000 poziva
funkcije
funkcije
funkcije
funkcije
funkcije
f(500):
f(500):
f(500):
f(500):
f(500):
0.05900
0.05927
0.05888
0.05953
0.05925
65
13
13.1
tipovi greaka
programa i utvrduju
svaku nepravilnost u sintaksi programskog jezika. Npr.
1
j=1
2
3
4
5
6
7
if j<2:
print Help
else:
if True
print Help2
File "/home/mcavrak/.spyder2/.temp.py", line 7
if True
^
SyntaxError: invalid syntax
prilikom izvodenja
ovog koda program nikada niti nece uci u else jer je
j=1
2
3
4
5
if j<2:
print Help
print i
67
68
Help
Traceback (most recent call last):
File "/home/mcavrak/.spyder2/.temp.py", line 6, in <module>
print i
NameError: name i is not defined
na greku:
Primjer kada ne naide
1
j=1
2
3
4
5
6
if j<2:
print Help
else:
print i
Help
? NameError
pokuaj operacije sa varijablom c ije ime (name) nije u popisu imena
(namespace)
>>> 4 + i*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name i is not defined
? TypeError
Pokuaj izvravanja operacije na krivom tipu podataka
>>> 2 + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot concatenate str and int objects
13.2
var=raw_input(Unesi broj:)
a=int(var)
print a
Unesi broj:z
Traceback (most recent call last):
File "/home/flood/untitled0.py", line 9, in <module>
a=int(var)
ValueError: invalid literal for int() with base 10: z
2
3
4
5
6
7
8
9
try:
a = int(var)
print SUCCESS
except ValueError:
print Nije uneen broj!
print Broj postavljen na defaultnu vrijednost 0.
a = 0
10
11
print a
Python ima modul pdb (Python DeBugger") koji pomae kod otkrivanja i
ispravljanja greaka u kodu skripte. Ako ne koristite neki specijalizirani editor unutar nekog razvojnog okruenja tada je potrebno pozvati pdb modul
na pocetku skripte:
1
import pdb
pdb.set_trace()
69
70
#!/usr/bin/python
import pdb
3
4
5
6
7
8
9
10
11
12
pdb.set_trace()
a=0
b=1
c=2
pdb.set_trace()
a=b+c
pdb.set_trace()
a=b-c
print kraj
Dio II
NUMPY
14
Z A D AVA N J E P O L J A U N U M P Y- U
array
order - odreduje
nacin na koji se polje pohranjuje u memoriji. Polje moe
biti pohranjeno na tri nacina:
? C - elementi polja c e biti poredani u memoriji na nacin da zadnji
indeks varira najbre (C-povezani poredak)
? F - elementi polja c e biti poredani u memoriji na nacin da prvi indeks varira najbre (Fortran-povezani poredak)
73
74
14.2
arange
Naredba arange omogucuje kreiranje jednodimenzionalnog polja koje sadri aritmeticki niz definiran sa prvim c lanom, zadnjim c lanom te korakom.
Sintaksa naredbe je
arange(start, stop, step, type)
Oprez! Prilikom
koritenja
ne-cjelobrojnih
koraka niza rezultat
naredbe array moe
biti nekonzistentan.
U takvim
slucajevima bolje je
koristiti naredbu
linspace (14.3).
gdje je start pocetak niza, stop kraj niza, step korak niza a type je tip
podataka sadranih u nizu.
Svi argumennti naredbe arange osim stop su neobavezni i ukoliko nisu
uneseni imaju zadane vrijednosti:
? start ima zadanu vrijednost 0
? step ima zadanu vrijednost 1 te zahtijeva i zadavanje argumenta start
? type ako nije zadan, postavlja se tipa na temelju ostalih argumenata.
>>> 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])
14.3
linspace
Naredba linspace ima slicnu namjenu kao i naredba arange (kreiranje aritmetickog niza) samo to se umjesto koraka niza zadaje broj c lanova 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 opcija vracanja koritenog 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,
14.4 zeros
0.30612245,
0.40816327,
0.51020408,
0.6122449 ,
0.71428571,
0.81632653,
0.91836735,
>>> step
0.02040816326530612
14.4
0.32653061,
0.42857143,
0.53061224,
0.63265306,
0.73469388,
0.83673469,
0.93877551,
0.34693878,
0.44897959,
0.55102041,
0.65306122,
0.75510204,
0.85714286,
0.95918367,
0.36734694,
0.46938776,
0.57142857,
0.67346939,
0.7755102 ,
0.87755102,
0.97959184,
75
0.3877551 ,
0.48979592,
0.59183673,
0.69387755,
0.79591837,
0.89795918,
1.
])
zeros
Naredba zeros omogucava generiranje polja koje sadri nule. Osnovna sintaksa naredbe zeros je
zeros(shape)
Za generiranje polja nula moe posluiti i naredba zeros_like koja generira polje nula istih dimenzija kao neko postojece polje. Sintaksa naredbe
je:
zeros_like(a)
14.5
Naredba
zeros_like ima
dodatne argumente
dtype i order.
dtype omogucuje
nametanje tipa
podataka za
generirano polje, a
ako nije specificiran
onda generirano polje
nasljeduje
tip
podataka od
argumenta a. order
omogucuje
mijenjanje rasporeda
spremanja polja u
memoriju.
ones
Za generiranje matrice zadanih dimenzija koja sadri jedinice koristi se naredba ones. Sintaksa naredbe je vrlo ista kao i kod naredbe zeros:
ones(shape, dtype=float, order=C)
Za kreiranje matrice, koja sadri jedinice istih dimenzija kao neka postojeca matrice, koristi se ones_like naredba:
ones_like(a)
Naredba ones_like
ima dodatne
argumente dtype i
order koji
funkcioniraju
jednako kao to je
opisano za naredbu
zeros_like.
76
[[1 1]
[1 1]
[1 1]]
>>> c = array([5, 8])
>>> d = ones_like(c)
>>> print d
[1 1]
14.6
eye
Generiranje dvodimenzionalne jedinicne matrice (sadri jedinice na dijagonali a ostalo su nule) moguce je sa naredbom eye. Potpuna sintaksa naredbe
eye je:
Naredba eye
omogucuje
generiranje iskljucivo
dvodimenzionalnih
jedinicnih matrica.
14.7
diag
Cesto
su brojevi na dijagonali matrice vani u proracunu i javlja se potreba
da ih se spremi u zasebnu varijablu. Naredba diag omogucuje upravo to:
generira vektor koji sadri elemenate dijagonale zadane matrice.
Sintaksa naredbe je vrlo jednostavna. Funkcija diag obavezno prima, kao
argument, matricu iz koje se eli preuzeti dijagonala. Dodatni argument,
k, specificira poloaj (indeks) dijagonale: 0 je glavna dijagonala, pozitivna
vrijednost se odnosi na dijagonale iznad a negativna na dijagonale ispod
glavne dijagonale.
diag(v, k=0)
from
M1 =
v1 =
v2 =
numpy import *
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
diag(M1)
diag(M1,1)
14.8 meshgrid
5
6
7
8
print M1
print v1
print v2
user@machine:~> python diag01.py
[[1 2 3]
[4 5 6]
[7 8 9]]
[1 5 9]
[2 6]
14.8
meshgrid
77
15
15.1
informacije o polju
Svako NumPy polje ima definiran broj dimenzija, koji se lako moe provjeriti pomocu ndim atributa polja.
ndarray.ndim
2
3
4
5
6
7
8
9
10
print
print
print
print
print
print
M1.ndim
ndim(M1)
M1.shape
shape(M1)
M1.size
size(M1)
2
2
(2, 3)
(2, 3)
6
6
15.2
indeksiranje polja
Pristupanje elementima Numpy polja vri se pomocu indeksa na slican nac in kao i sa listama. Indeks oznacuje poziciju elementa polja i to pomocu
cijelog broja pocevi od nule. Kod jednodimenzionalnih polja (vektori), vrijednostima se pristupa preko jednog indeksa upisanog u uglate zagrade.
79
80
Indeksi u jednom
paru uglatih zagrada
(npr. M[2,4]) su
zapravo tuple, pa se
pristupanju
odredenom
elementa
moe vriti i preko
tuplea indeksa (poz
= (3, 1); print
M[poz]).
2
3
import numpy as np
4
5
6
7
8
9
M = np.array([[ 1, 2, 3, 4,
[ 6, 7, 8, 9,
[11, 12, 13, 14,
[16, 17, 18, 19,
[21, 22, 23, 24,
5],
10],
15],
20],
25]])
10
11
12
13
print M[2, 4]
poz = (3, 2)
print M[poz]
print M[1:-1,1:-1]
print M[:,::-1]
print M[::2]
14
15
16
17
15
18
[[ 7
[12
[17
[[ 5
[10
[15
[20
[25
[[ 1
[11
[21
8
13
18
4
9
14
19
24
2
12
22
9]
14]
19]]
3 2
8 7
13 12
18 17
23 22
3 4
13 14
23 24
1]
6]
11]
16]
21]]
5]
15]
25]]
16
16.1
2
3
4
M1 = arange(0, 20)
print M1
5
6
7
8
9
10
11
12
print ravel(M2)
print M3.flatten()
[ 0
[[ 0
[ 5
[10
[15
[[ 0
[10
[ 0
[ 0
1
1
6
11
16
1
11
1
1
2
2
7
12
17
2
12
2
2
3
3
8
13
18
3
13
3
3
4 5
4]
9]
14]
19]]
4 5
14 15
4 5
4 5
9 10 11 12 13 14 15 16 17 18 19]
6 7 8 9]
16 17 18 19]]
6 7 8 9 10 11 12 13 14 15 16 17 18 19]
6 7 8 9 10 11 12 13 14 15 16 17 18 19]
Brisanje jedinicnih dimenzija matrice, koje vrlo c esto znaju biti suvine,
moe se napraviti funkcijom squeeze.
Izvorni kod 16.2: Mijenjanje dimenzija polja
1
81
82
2
3
M1 = arange(0, 20)
4
5
6
7
8
9
M3 = squeeze(M2)
print M3.shape
(4, 1, 1, 5)
(4, 5)
16.2
transponiranje
2
3
4
5
6
7
M1 = array([
[1, 0, 3, 4],
[2, 2, 7 ,8],
[6, 8, 3, 0],
[9, 8, 2, 1]])
8
9
10
M2 = M1.T
print M2
11
12
13
M3 = transpose(M1)
print M3
[[1
[0
[3
[4
[[1
[0
[3
[4
2
2
7
8
2
2
7
8
16.3
6
8
3
0
6
8
3
0
9]
8]
2]
1]]
9]
8]
2]
1]]
17
I TAVA N J E I S P R E M A N J E N U M P Y P O L J A
UC
u citavanje
iz tekstualnih datoteka
Tehni
cki fakultet
Zavod za mehaniku fluida i ra
cunarko inenjerstvo
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
8.14
28.72
8.37
26.79
4.41
26.55
6.74
22.48
5.30
24.30
* ovo je komentar
6
6.11
22.14
7
2.10
25.96
7.40
24.40
*8
9
0.07
22.04
10 8.45
23.07
11 2.91
22.07
12 9.14
20.70
13 7.62
23.83
-0.12
-0.47
-0.44
-0.55
-0.70
126.04
130.96
125.82
133.24
137.91
5
9
2
0
9
-0.87
-0.90
-0.03
-0.73
-0.47
-0.07
-0.10
-0.51
102.43
137.88
122.03
143.81
137.48
116.26
132.36
111.39
7
2
1
2
0
6
9
1
2
3
83
Zadana vrijednost
argumenta
delimiter je None
to znaci da se redak
dijeli na temelju
razmaka
(podrazumijeva i
tabulatore) i vie
uzastopnih razmaka
smatra kao jedan
razmak.
u citavanje
i spremanje numpy polja
84
4
5
6
8.14
8.37
4.41
6.74
5.3
6.11
2.1
0.07
8.45
2.91
9.14
7.62
-0.12
-0.47
-0.44
-0.55
-0.7
-0.87
-0.9
-0.73
-0.47
-0.07
-0.1
-0.51
5.
9.
2.
0.
9.
7.
2.
2.
0.
6.
9.
1.
]
]
]
]
]
]
]
]
]
]
]
]]
Naprednije mogucnosti pri ucitavanju NumPy polja iz tekstualnih datoteka prua naredba genfromtxt.
http://penandpants.com/2012/03/09/reading-text-tables-with-python/
17.2
18
NI RAC
UN
M AT R I C
18.1
(18.1)
2
3
4
5
6
7
8
A = array([
[ 1.0, 3.0, 6.0],
[-2.0, 0.0, 3.0],
[ 8.0, -2.0, 0.0]
])
b = array([2.0, 6.0, 0.0])
9
10
x = linalg.solve(A, b)
11
12
print x
[-0.58823529 -2.35294118
1.60784314]
85
19
RAD SA POLINOMIMA
19.1
poly1d
4
5
6
@author: stefan
"""
7
8
9
import numpy as np
import matplotlib.pyplot as plt
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Koeficijenti polinoma
print \nKoeficijetni:
print p1.c
print p2.coeffs
25
26
27
28
29
30
# Korijeni polinoma
x01 = p1.r
x02 = p2.roots
print \nKorijeni:
print x01
87
88
rad sa polinomima
31
print x02
32
33
34
35
36
37
38
39
40
41
42
43
5.6]
-24.075 -20.655]
Korijeni:
[ 8.
1. -0.7]
[ 6.75 -3.
-1.02]
600
p1
p2
Korijeni p1
Korijeni p2
400
200
0
200
400
600
10
Dio III
PRIPREMA, OBRADA I VIZUALIZACIJA
P O D ATA K A
20
OSNOVNI 2D GRAFOVI
Terminologija:
? Figure = prozor
? Axes = prostor crtanja
? Axis = osi
Prozor
Prostor crtanja
Prostor crtanja
Os y
Os y
Os x
Os x
20.1
linijski grafovi
3
4
plot([3, 6, 3, 2, 4])
91
92
osnovni 2d grafovi
6
7
8
x = linspace(0, 4, 100)
y = 5*cos(x)/(1 + x**2)
plot(x, y)
9
10
show()
Vrsta linije
Puna linija
Crtkana linija
-.
Crta-tocka
Tockasta linija
Tablica 20.1: Vrste linija
Simbol
Boja
Plava
Crvena
Zelena
Cijan
Magenta
uta
Crna
Bijela
Tablica 20.2: Simboli boja
Vrsta markera
Tockasti
Piksel
Kruni
<
>
Kvadratni
Peterokutni
Zvijezdasti
esterokutni 1
esterokutni 2
Plus
Kriic
Romb
Tanki romb
Vertikalna linija
Horizontalna linija
Tablica 20.3: Vrste markera
3
4
5
6
7
plot([1,
plot([3,
plot([2,
plot([5,
8
9
show()
6,
2,
3,
4,
3,
1,
5,
2,
2,
3,
6,
4,
4], r--o)
1], g-.D)
2],r-.x)
5],ks:)
93
94
osnovni 2d grafovi
6
5
4
3
2
10.0
0.5
1.0
1.5
2.0
2.5
3.0
3.5
4.0
20.2
Boje
y,
y,
y,
y,
color
color
color
color
=
=
=
=
gray_string)
hex_string)
rgb_tuple)
html_string)
gdje je
? gray_string string koji specificira nijansu sive boje kao udio bijele
(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 i plave
(RGB) boje (npr. color = (0.1, 0.5, 0.3))
? html_string string koji sadri HTML naziv boje (npr. color=Cyan,
color=Crimson)
20.2.2
Markeri
Izgled markera se moe detaljnije specificirati pomocu vie parametara naredbe plot:
plot(x, y, markeredgecolor = r,
markeredgewidth = 2,
markerfacecolor = b,
markerfacecoloralt = g,
markersize = 4,
markerevery = 5)
#
#
#
#
#
#
Argumentom label omogucuje se oznaka tj. opis krivulje, koji se prikazuje u legendi grafa.
U izvornom kodu 20.3 upotrebljene su razlicite varijante linija, markera i
boja (Slika 20.4).
Izvorni kod 20.3: Naprednija kontrola linija i markera
1
2
3
4
5
6
7
8
9
10
11
95
96
osnovni 2d grafovi
1.0
0.5
0.0
0.5
1.0 4
20.3
Stvaranje prvog
prozora nije nuno.
Naredbe za crtanje
grafova (npr. plot)
same c e kreirati
prozora ako vec ne
postoji.
Novi prozor se stvara pomocu funkcije figure, koja vraca handle na prozor
a po potrebi moe primati dodatne argumente
figure()
fig1 = figure()
fig1 = figure(figsize = (12, 10), dpi = 300)
xlim(X.min()*1.1, X.max()*1.1)
ylim(C.min()*1.1, C.max()*1.1)
1.0
0.5
0.0
0.5
1.0
3
1
2
3
xlim(0, 5)
# Donja i gornja granica
ylim(ymax=1) # Samo gornja granica
ylim(ymin=-1) # Samo donja granica
97
98
osnovni 2d grafovi
1
3.142
1.571
0.000
1.571
3.142
+1
/2
+ /2
1
2
3
4
5
6
7
ax = gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
ax.xaxis.set_ticks_position(bottom)
ax.spines[bottom].set_position((data,0))
ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))
+1
/2
+ /2
99
100
osnovni 2d grafovi
+1
/2
00
+ /2
b je argument kojim se kontrolira da li se iskljucuje ili ukljucuje mrea pomocnih linija i moe poprimiti vrijednosti true ili false ali i on ili off
(kao i MATLAB). which moe biti major, minor ili both i slui za kontrolu glavne ili sporedne mree pomocnih linija. Argumentom axis kontorilra se za koje c e osi biti postavljena mrea pomocnih linija. Vrijednosti za
axis mogu biti both, x ili y.
grid moe primati dodatne argumente za detaljniju kontrolu mree pomocnih linija:
1
Pozicija
Broj
String
Gore desno
upper right
Gore lijevo
upper left
Dolje lijevo
lower left
Dolje desno
lower right
Desno
right
Na sredini lijevo
center left
Na sredini desno
center right
Dolje u sredini
lower center
Gore u sredini
upper center
U sredini
10
center
3
4
5
6
7
8
9
10
11
12
1.0
0.5
0.0
0.5
1.00
sinus
kosinus
10
20.4
spremanje grafova
20.5
podgrafovi
101
102
osnovni 2d grafovi
8
9
10
11
12
13
14
15
16
17
18
figure(1)
subplot(211)
plot(X, C, color="blue", linewidth=2.5, linestyle="-")
myticks()
subplot(212)
plot(X, S, color="red", linewidth=2.5, linestyle="-")
myticks()
19
20
show()
+1
/2
+ /2
/2
+ /2
+1
Podgrafovi se iscrtavaju u slici (figure) koja se sastoji od dva grafa. Naredba subplot definira broj redaka, broj stupaca i broj grafa, koji mora biti
broj 1 < fignum < numrows numcols. Varijable ne moraju biti odvojene
zarezom ako vrijedi numrows numcols < 10. Odnosno, subplot(211) je
ekvivalentan izrazu subplot(2,1,1).
20.6
polarni grafovi
3
4
5
fig = figure(figsize=[8,8])
ax = fig.add_subplot(111, polar=True)
6
7
subplots_adjust(bottom=0.1,top=0.9,left=0.1,right=0.9)
8
9
10
r = arange(0,1,0.001)
theta = 2*2*pi*r
11
12
13
14
ax.plot(theta,r, lw=2)
grid(True)
show()
90
135
45
0.2
180
0.4
0.6
225
5
6
7
4
5
6
7
8
1.0
315
270
20.7
0.8
103
21
SLOENIJI 2D GRAFOVI
21.1
izolinije
(21.1)
Broj nivo linija se moe specificirati cijelim brojem n ili se mogu odrediti
eljene vrijednosti pomocu vektora V za koje c e se crtati izolinije.
matplotlib.pyplot.contour(Z, n)
matplotlib.pyplot.contourf(Z, n)
matplotlib.pyplot.contour(Z, V)
matplotlib.pyplot.contourf(Z, V)
Mapa boja
Mapa boja (eng. colormap) je nacin na koji se numericka vrijednost sa intervala [0, 1] pretvara u RGBA (Red, Green, Blue, Alpha) specifikaciju boje kojom
se definira udio crvene, zelene i plave boje te prozirnost.
105
106
sloeniji 2d grafovi
Blues
BuGn
CMRmap
GnBu
Greys
Oranges
Paired
Pastel2
PuBu
PuOr
Purples
RdGy
RdYlBu
Reds
Set2
Spectral
YlGnBu
YlOrRd
autumn
bone
bwr
coolwarm
cubehelix
gist_earth
gist_heat
gist_rainbow
gist_yarg
gnuplot2
hot
jet
ocean
prism
seismic
spring
terrain
izolinija.
Tri su osnovna nacina zadavanja boje:
? colors = None, boje se preuzimaju iz postavljene mape boja (vidi 21.1.1)
? colors = r, postavlja se jedna boja za sve izolinije ili povrine iz izolinija.
medu
21.1 izolinije
Primjer
4
5
6
7
# Definiranje funckije
def f(x,y):
return (1 - np.sin(x) - np.sin(y)**3) * np.exp(-np.cos(x) -np.sin(y)**2)
8
9
10
# Gusto
ca vizualizacijskih to
caka (po svakoj dimenziji)
n = 256
11
12
13
14
15
# Diskretizacija
x = np.linspace(-4, 0, n)
y = np.linspace(-3, 1, n)
X,Y = np.meshgrid(x, y)
16
17
18
# Uklju
civanje mree pomo
cnih linija
pl.grid()
19
20
21
22
23
24
25
26
# Crtanje izolinija
# colors - boja linija, linewidth - debljina linija
Cl = pl.contour(X, Y, f(X, Y), 8, colors=black, linewidth=.5)
27
28
29
30
31
pl.show()
107
sloeniji 2d grafovi
0
0.50
0.0
3.500
00
0
2.50
0.5
1.5
00
0.5
0.00
3.0
1.0
1.0
1.5
2.0
00
3.5
3.0
2.5
2.0
1.5
1.0
3.0
0.50
00
3.0
4.0
00
1.0
2.0
1.000
2.5
2.50
108
0.5
0.0
22
IZRADA ANIMACIJA
5
6
7
8
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
9
10
11
12
13
fig = plt.figure()
linija, = plt.plot([], [], -o)
plt.xlim([0, 10])
plt.ylim([-1, 1])
14
15
16
17
def init():
linija, = plt.plot([], [], -o)
18
19
return linija
20
21
def draw_frame(it):
22
23
24
25
xline = np.linspace(0.0,10.0,50)
yline = np.sin(xline + it/10.0)/(1.0 +xline**2.0)
linija.set_data(xline, yline)
26
27
return linija
28
29
30
Writer = animation.writers[ffmpeg]
writer = Writer(fps=5, metadata=dict(artist=sim.riteh.hr), bitrate=3600)
31
32
33
34
35
36
anim.save(nelder-mead.avi, writer=writer)
plt.show()
109
Dio IV
KE METODE
NUMERIC
23
R J E AVA N J E N E L I N E A R N I H J E D N A D B I
(23.1)
metoda bisekcije
113
114
Zbog navedenih uvjeta, funkcija f(x) ima bar jedan korijen x0 na intervalu
[xl , xd ].
xs =
xl + xd
2
odreduje
se novi, dvostruko ui, interval. Ako je f(xl ) f(xs ) < 0 tada je
x0 [xl , xs ], a ako je f(xs ) f(xd ) < 0 tada je x0 [xs , xd ].
Prepolavljanje se iterativno ponavlja (Slika 23.1). U slucaju da je f(xs ) = 0,
traeni korijen funkcije.
tada je pronaden
f(x)
xd
xl
x
f(x)
Metoda biskecije, ako su navedeni uvjeti zadovoljeni, c e sigurno konvergirati u jedan od korijena funkcije f(x) na intervalu [xl , xd ]. Apsolutna greka
se prepolavlja u svakom koraku iteracije pa metoda konvegira linearno, to
je, u odnosu na druge metode, relativno sporo.
Osnovna sintaksa:
bisect(f, a, b)
optimize.bisect
poziva
_zeros._bisect,
args=()
xtol=1e-12
rtol=4.4408920985006262e-16
maxiter=100
full_output=False
disp=True
koja je
implementirana u
C-u.
gdje je xtol apsolutna tolerancija, rtol relativna tolerancija, maxiter maksimalni broj iteracija, full_output omogucuje dohvacanje dodatnih informacija o konvergenciji i disp omogucuje podizanje RuntimeError u slucaju da
metoda ne konvergira.
Izvorni kod 23.1: Primjer pronalaenja nultocke funkcije metodom biskecije
1
2
3
#!/usr/bin/python
import scipy.optimize as optimize
from numpy import cos
4
5
def f(x):
115
return cos(x)**2 + 6 - x
7
8
9
10
11
12
23.2
newton-raphsonova metoda
f(xi )
f 0 (xi )
(23.2)
bi trebao konvergirati nultocki funkcije f(x). . Za ovu iterativnu metodu potrebno je zadati dobru pocetnu aproksimaciju nultocke i derivaciju funkcije
(Slika 23.2).
f(x)
x3
x4 x2
x1
Osnovna sintaksa:
newton(func, x0, fprime)
gdje je func funkcija, x0 pocetna aproksimacija nultocke i fprime prva derivacija funkcije (zadaje se kao funkcija). Dodatni argumenti omogucuju kontrolu i konvergencije:
args=()
tol=1e-12
maxiter=100
fprime2=None
NewthonRaphsonova metoda
je poznata i kao
Newtonova metoda
ili metoda tangente
116
2
3
4
5
6
def fun(t):
return t**2-2
def fprim(t):
return 2*t
7
8
tol=1.e-5)
1.41421356237
metoda sekante
f(x2 ) f(x1 )
(x x2 ).
x2 x1
(23.3)
Osnovna sintaksa:
newton(func, x0)
brentova metoda
Osnovna sintaksa:
brent(func, a, b)
23.5 zadaci
23.5
zadaci
r(h)2 dh
ZH
V(H) =
R2 (h R)2 dh =
ZH
2Rh h2 dh
H3
3
Uzgon koji daje uronjeni dio lopte iznosi
V(H) = RH2
U(H) = V(H) g
U stanju ravnotee, uzgon je jednak teini lopte.
U(H) = m g
H3
= mg
3
Lopta mase m = 0.4kg i promjera R = 0.22m stavljena je u vodu gustoce
= 1024kg/m3 . Koliko c e lopta biti uronjena (u stanju ravnotee)?
RH2
117
24
INTERPOLACIJE
Cesto
se javlja potreba da na temelju nepotpunih ili rijetkih podataka treba
procjeniti odnosno izracunati vrijednosti u eljenim tockama. Interpolacija je
metoda konstrukcije novi tocaka unutar raspona diskretnog skupa poznatih
tocaka podataka.
Interpolacije moemo klasificirati s obzirom na :
? broj dimenzija danog interpolacijskog problema,
? interpolacijsku funkciju (linearna, spline itd.),
? na strukturu zadanih diskretnih podataka (zadani na mrei tocaka ili
na nepravilno razbacanim tockama (scatterd))
24.1
1d interpolacija
gdje je x 1D monotono rastuce polje polje a y n-dimenzionalno polje. Dimenzija y-a du koje se vri interpolacija treba biti iste duine kao i x. kind
moe biti linear, nearest, zero, slinear, quadratic, cubic
ili cijeli broj koji specificira red spline inerpolacije. Parametar axis odreduje
dimenziju y-a du koje se vri interpolacija. Pozivanja interpolacije izvan
intervala zadanih tocaka moe se kontrolirati parametrima bounds_error i
4
5
6
X = linspace(0., 10., 6)
Y = array([1.6, 4., 3.4, 1.6, 1.8, 1.2])
7
8
9
10
11
f1 = interpolate.interp1d(X, Y, kind=linear)
y1 = f1(x)
12
13
14
f2 = interpolate.interp1d(X, Y, kind=2)
y2 = f2(x)
15
16
17
f3 = interpolate.interp1d(X, Y, kind=3)
y3 = f3(x)
18
19
20
21
22
23
24
119
120
interpolacije
25
26
legend()
show()
4.5
4.0
3.5
3.0
2.5
2.0
1.5
1.00
linearna
spline 2. reda
spline 3. reda
10
24.2
2d i n-d interpolacija
U slucaju dvo-dimenzionalne (ili vie) interpolacije, moguce je interpolacijski problem postaviti na diskretnim podacima zadanim na mrei tocaka ili
nepravilno razbacanim tockama (scatterd).
Za interpolaciju vrijednosti zadanih na N-D nestrukturiranim tockama
koristi se funkcija griddata:
Parametar values
moe biti 2D polje,
pa se na istim
zadanim tockama
moe zadati vie
velicina koje se mogu
interpolirati preko
jednog poziva
interpolacijske
funkcije.
gdje je points numpy polje koje sadri koordinate zadanih diskretnih podataka. Oblik polja points je (broj_tocaka, broj_dimenzija). Pripadajuce
vrijednosti zadaju se preko numpy polja values. xi je polje tocaka za koje je
potrebno interpolirati zadane podatke.
method specificira metodu interpolacije i podrane su sljedece metode:
? nearest
? linear
? cubic
Parametrom fill_value definira se vrijednost koju vraca interpolacijska
funkcija za tocke izvan podrucja zadanih podataka.
Interpolacija na podacima zadanim na pravilnoj mrei tocaka se vri pomocu klase interp2d.
interp2d(x, y, z, kind, copy, bounds_error, fill_value)
from
from
from
from
numpy.random import *
scipy import interpolate
pylab import *
mpl_toolkits.mplot3d import Axes3D
6
7
8
9
10
11
12
13
14
X = linspace(0., 2., 5)
Y = linspace(0., 4., 5)
Z = array([
[1.3, 1.4, 1.1, 1.0,
[1.6, 1.1, 1.2, 1.3,
[1.2, 1.5, 1.6, 1.5,
[1.2, 1.4, 1.5, 1.4,
[1.3, 1.2, 1.1, 1.1,
])
0.8],
1.5],
1.6],
1.3],
1.2]
15
16
XX, YY = np.meshgrid(X, Y)
17
18
19
f1 = interpolate.interp2d(X, Y, Z, kind=linear)
f2 = interpolate.interp2d(X, Y, Z, kind=cubic)
20
21
22
23
24
25
26
z1 = f1(x, y)
z2 = f2(x, y)
27
28
29
30
31
32
33
subplot(1, 3, 1)
scatter(XX, YY, c=Z, marker = s, s = 100, cmap = cm.Purples)
xlim(0, 2)
ylim(0, 4)
34
35
36
37
38
subplot(1, 3, 2)
CS = plt.contourf(xx, yy, z1, cmap = cm.Purples)
xlim(0, 2)
ylim(0, 4)
39
40
41
42
43
subplot(1, 3, 3)
CS = plt.contourf(xx, yy, z2, cmap = cm.Purples)
xlim(0, 2)
ylim(0, 4)
44
45
46
47
subplots_adjust(bottom=0.3,top=0.95,left=0.05,right=0.95)
cax = fig.add_axes([0.05, 0.1, 0.9, 0.1])
fig.colorbar(CS, cax=cax, orientation=horizontal)
48
49
show()
4.0
4.0
4.0
3.5
3.5
3.5
3.0
3.0
3.0
2.5
2.5
2.5
2.0
2.0
2.0
1.5
1.5
1.5
1.0
1.0
1.0
0.5
0.5
0.5
0.00.0 0.5 1.0 1.5 2.00.00.0 0.5 1.0 1.5 2.00.00.0 0.5 1.0 1.5 2.0
0.75
0.90
1.05
1.20
1.35
1.50
1.65
121
25
REGRESIJE
7.0
11.0
12.0
16.0
18.0
20.0
21.0
24.0
l[mm]
3.0
6.5
7.0
7.5
8.5
10.5
11.0
12.5
25.1
25.2
linearna regresija
5
6
7
8
X = [1.0, 0.6, 1.065, 1.5, 1.72, 2.06, 2.84, 3.1, 3.15, 3.26, 3.55, 3.61, 4.0]
123
124
regresije
Y = [10.0, 10.6, 11.5, 10.8, 11.0, 20.6, 20.8, 30.1, 32.7, 33.4, 38.0, 37.0, 48.2]
10
11
12
k = np.polyfit(X,Y,1)
print Regresijski pravac: y=%.3fx%+.3f % (k[0], k[1])
13
14
15
16
17
18
19
20
21
22
legend(loc=2)
grid()
show()
Regresijski pravac: y=10.846x-2.035
50
To ke
Regresijski pravac
40
30
20
10
0
0.5
1.0
1.5
2.0
2.5
3.0
3.5
4.0
25.3
zadaci
[ C]
19.1
22.9
31.5
42.2
50.2
T2
[ C]
18.5
22.2
30.6
41.1
49.1
25.3 zadaci
Zadatak 25.2 Vrijednost gravitacijskog ubranje Zemlje g se minjenja s visinom, odnosno udaljenocu od zemljine povrine h, kako je dano u tablici.
Izracunaj vrijednost gravitacijskog ubrzanja na visini h = 126 km, koristeci
kvadratnu regresiju.
h[km]
h i
g sm2
0.1
20.0
40
60
80
100
120
140
9.81
9.7486
9.6789
9.6728
9.5681
9.5091
9.4506
9.3926
125
26
R J E AVA N J E S U S TAVA L I N E A R N I H J E D N A D B I
a12 x2
+ ...
a1n xn
b1
a21 x1
..
.
a22 x2
..
.
+ ...
a2n xn
..
.
b2
..
.
am1 x1
+ an2 x2
+ ...
+ ann xn
b
x
a11 a21 . . . a1n
1 1
a
12 a22 . . . a2n x2 b2
=
.
..
.. .. ..
..
..
.
. . .
.
bn
xn
an2 an2 . . . ann
(26.1)
= bn
(26.2)
odnsono
Ax = b
(26.3)
5 20
o
4810
26.1
127
128
5
6
7
8
9
10
A = loadtxt(A.txt)
B = loadtxt(B.txt)
11
12
n = len(B)
13
14
15
16
17
18
19
20
# Naivna eliminacija
for k in range(0,n):
for i in range(k+1,n):
faktor = A[i,k]/A[k,k]
for j in range(k+1,n):
A[i,j] = A[i,j] - faktor*A[k,j]
B[i] = B[i] - faktor*B[k]
21
22
23
24
25
26
27
28
# Supstitucija unatrag
X = empty(shape(B))
for i in range(n-1,-1,-1):
suma = 0
for j in range(i+1,n):
suma = suma + A[i,j]*X[j]
X[i] = (B[i]-suma)/A[i,i]
29
30
print X
31
32
33
34
35
# Scipy rjesenje
A = loadtxt(A.txt)
B = loadtxt(B.txt)
print linalg.solve(A,B)
Izvodenje
izvornog koda 26.1 vidimo da su oba ispisana rjeenja (Gaussova eliminacija i numpy funkcija linalg.solve) identicna:
[-0.19367432
[-0.19367432
26.2
0.07619065
0.07619065
0.03675057
0.03675057
0.39036472]
0.39036472]
lu dekompozicija
5
6
7
8
9
A = loadtxt(A.txt)
B = loadtxt(B.txt)
10
11
n = len(B)
12
13
# LU dekompozicija
14
15
L = zeros([n,n])
26.2 lu dekompozicija
16
U = zeros([n,n])
17
18
19
20
21
22
23
24
25
26
27
28
for k in range(0,n):
for i in range(k,n):
suma = 0
for m in range(0,k):
suma = suma + L[i,m]*U[m,k]
L[i,k] = A[i,k] - suma
for j in range(k+1,n):
suma = 0
for m in range(0,k):
suma = suma + L[k,m]*U[m,j]
U[k,j] = (A[k,j]-suma)/L[k,k]
29
30
31
for i in range(0,n):
U[i,i] = 1
32
33
# rjesavanje sustava
34
35
36
C = empty(shape(B))
X = empty(shape(B))
37
38
39
40
41
42
for i in range(0,n):
suma = 0
for j in range(0,i):
suma = suma + L[i,j]*C[j]
C[i] = (B[i]-suma)/L[i,i]
43
44
45
46
47
48
for i in range(n-1,-1,-1):
suma = 0
for j in range(i+1,n):
suma = suma + U[i,j]*X[j]
X[i] = C[i] - suma
49
50
print X
51
52
53
# Scipy rjesenje
print linalg.solve(A,B)
[-0.19367432
[-0.19367432
0.07619065
0.07619065
0.03675057
0.03675057
0.39036472]
0.39036472]
129
27
KO INTEGRIRANJE
NUMERIC
27.1
trapezna formula
Svojstvo odredenog
integrala je da ga moemo rastaviti na konacni broj
Zb
f(x)dx =
a
Zb
f(x)dx + f(x)dx.
(27.3)
N
1X
(xk+1 xk ) (f(xk+1 ) + f(xk ))
2
(27.4)
k=1
gdje je N broj podintervala za koje vrijedi a < x1 < x2 < < xN1 <
xN < b .
N
hX
(f(xk+1 ) + f(xk ))
2
(27.5)
k=1
131
numeri cko
integriranje
132
Funkcija prima set (vektor) vrijednosti podintegralne funkcije u tockama diskretiziranog intervala [a, b]. Za neuniformnu diskretizaciju intervala [a, b]
potrebno je funkciji proslijediti vrijednosti diskretizirane varijable integracije
(vektor x-eva) a za uniformnu diskretizaciju dovoljno je specificirati irinu
samo vektor y, pretpospodintervala. Ukoliko je funkciji trapz proslijeden
tavlja se da je rijec o uniformnoj diskretizaciji sa irinom podintervala 1.
integral na uniformno diskretiU izvornom kodu 27.1 rjeen je odreden
ziranom intervalu implementacijom trapezne formule (27.5) te koritenjem
funkcije trapz sa vektorom diskretizirane varijable integracije i sa irinom
podintervala.
2
3
4
import numpy as np
import matplotlib.pyplot as plt
5
6
7
def f(x):
return -25.0*x +200.0*x**2 +400.0*x**4 -500.0*x**5
8
9
10
11
# Granice integrala
# granice (a,b)=(0.0,1.0)
a, b = 0.0, 1.0
12
13
14
# Broj podintervala
n = 10
15
16
17
18
19
20
# Sirina intervala
h = (b-a)/n
21
22
23
24
25
26
27
28
29
30
31
print Rjesenje 1: %f % I
32
33
34
35
# Rjesavanje pomo
cu numpy.trapz funkcije
print Rjesenje 2: %f %np.trapz(Y, X)
# pomocu vektora X
print Rjesenje 3: %f %np.trapz(Y, dx=h) # pomocu razmaka dx
36
37
38
39
40
41
42
43
44
45
# Crtanje
plt.figure(figsize=(8,5))
Xplt = np.linspace(min(X), max(X), 1000)
plt.plot(Xplt,f(Xplt), lw=2)
plt.plot(X, Y, ro)
for i in range(n+1):
plt.plot([X[i], X[i]], [0.0, Y[i]], k--)
plt.fill_between(X,f(X),color=DarkSeaGreen)
plt.show()
Rjesenje 1: 50.419500
Rjesenje 2: 50.419500
Rjesenje 3: 50.419500
133
120
100
80
60
40
20
0
20
0.0
0.2
0.4
0.6
0.8
1.0
Slika 27.2: Racunanje povrine ispod krivulje pomocu trapeza (Izvorni kod 27.1)
27.2
simpsonove formule
Simpsonova pravila (ili Simpsonove formule) koriste kvadratni ili kubni polinom za aproksimaciju funkcije prilikom numericke integracije. Zbog nemo
gucnosti odredivanja
aproksimacijkog polinoma na jendom intervalu (dvije
tocke), Simpsonove formule se korsite obuhvacajuci dva podinervala (za
aproksimaciju kvadratnim polinomom) ili na tri podintervala (za aproksimaciju kubnim polinomom).
Za aproksimaciju kvadratnim polinomom na intervalu [xi , xi+2 ] vrijedi:
Z xi+2
h
f(x)dx = (f(xi ) + 4f(xi+1 ) + f(xi+2 ))
(27.6)
3
xi
gdje je x uniformno diskretiziran (xi+2 xi+1 = xi+1 xi = h).
Izraz (27.6) c esto se naziva Simpsonova 1/3 formula a dobiven je integracijom kvadratnog polinoma koji prolazi kroz tocke (xi , f(xi )), (xi+1 , f(xi+1 )),
(xi+2 , f(xi+2 )).
Viestrukom primjenom na sve parove uniformno diskretiziranih podintervala na [a, b] dobiva se
Zb
n2
n1
X
X
1
f(x)dx = h f(x0 ) + 4
f(xi ) + 2
f(xi ) + f(xn )
(27.7)
3
a
i=1,3
i=2,4
Simposonova 1/3
formula je definirana
na parovima
podintervala, to
uvjetuje da za njeno
koritenje podrucje
odredenog
integrala
[a, b] treba podjeliti
na paran broj
podintervala.
numeri cko
integriranje
134
Funkciju simps se moe koristit za poznate vrijednosti podintegralne funkcije y u tockama x ili za razmak dx uniformne diskretizacije. Argumentom
even odreduje
se nacin na koji se racuna odredeni
integral nad parnim brojem tocaka (neparni broj podintervala):
? even = first, prvi podinterval se racuna pomocu trapezne formule
? even = last, zadnji podinterval se racuna pomocu trapezne formule
? even = avg, rezultat integracije je prosjecna vrijednost integrala izracunatih sa opcijom even = first i even = last.
5
6
7
8
9
10
11
# Podintegralna funkcija
def f(x):
return 20.0*sqrt(x) - 0.2*x**2 - 2.0*sin(x)
12
13
14
# Granice odred
enog integrala
a, b = 0.0, 10.0
15
16
17
# Broj podintervala
n = 40
18
19
20
21
h = (b-a)/n
X = linspace(a,b,n+1)
Y = f(X)
22
23
24
25
INT = 0.0
for i in range(0, n - 1, 2):
INT = INT + (1.0/3.0)*h*(Y[i] + 4*Y[i+1] + Y[i+2])
26
27
28
# "Ru
cno" rjeenje
print INT
29
30
31
# Scipy rjesenje
print simps(Y,X)
351.089170175
351.089170175
27.3
quad se zansiva na
naprednije metode
Scipy nudi funkciju quad koja koristi napredniju adaptivnu metodu za numericku integraciju.
Osnovna upotreba funkcije quad zahtjeva podintegralnu funkciju f te gra
nice odredenog
integrala a i b.
27.4 zadaci
scipy.integrate.quad(f, a, b)
2
3
4
5
6
7
8
# Podintegralna funkcija
def f(x):
return 20.0*sqrt(x) - 0.2*x**2 - 2.0*sin(x)
9
10
11
# Rjeavanje odre
denog integrala na intervalu [0, 10]
rj, gr = quad(f, 0, 10)
12
13
print rj
351.292211631
27.4
zadaci
Protok [l/s]
Vrijeme [min]
Protok [l/s]
0.0
10.6
0.0
11.2
2.8
10
10.0
4.2
11
9.5
6.9
12
4.3
10.1
13
1.8
10.5
14
0.2
11.0
15
0.0
Ako vrijedi
ZT
Q(t)dt
V=
0
135
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 I
PDJ
28
K E M E T O D E Z A R J E AVA N J E O B I C
NIH
NUMERIC
DIFERENCIJALNIH JEDNADBI
obi cne
diferencijalne jednadbe 1. reda
28.1
y0 =
dy
= f(x, y)
dx
y(x0 ) = y0
28.1.1
(28.1)
(28.2)
Eulerova metoda
Eulerova metoda slui za numericko rjeavanje diferencijalne jednadbe prvog reda (28.1) sa zadanim pocetnim uvjetom (28.2) a temelji se na aproksimaciji funkcije y(x) pomocu prvog c lana Taylorovog reda u okolini tocke
x:
y(x + x) y(x) + y 0 (x) x
(28.3)
Runge-Kutta metode
28.1.3
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as intgr
6
7
8
9
10
11
# Po
cetni uvjet
139
numeri cke
metode za rjeavanje obi cnih
diferencijalnih jednadbi
140
12
13
x0 = 0.
y0 = 20.
14
15
16
# Krajnja to
cka intervala
xf = 10
17
18
19
# Diskretizacija
X = np.linspace(x0, xf, 200)
20
21
22
# Rjeavanje ODJ
Y = intgr.odeint(f, y0, X)
23
25
26
27
28
29
# Vizualizacija
plt.plot(X, Y, r, lw = 2)
plt.xlabel(x)
plt.ylabel(y(x))
plt.grid()
plt.show()
20
15
10
y(x)
24
5
0
5
0
10
28.2
28.3
obi cne
diferencijalne jednadbe vieg reda
29
ETNI PROBLEMI
POC
29.1
A
)
P
enegetska linija
vodno lice
referentna ravnina
Slika 29.2: Energetske linije u strujanju fluida otvorenim vodotokom
141
142
po cetni
problemi
Pretpostavke:
? kut je mali
? strujanje je izrazito jednodimenzionalno
? tlak je iskljucivo hidrostatski
Opcenito se strujanje u kanalu opisuje sustavom parcijalnih diferencijalnih jednadbi, koje proizlaze iz zakona ocuvanja mase i zakona ocuvanja
kolicine gibanja. Ako pretpostavimo da se radi o prizmaticnom kanalu, moemo ih zapisati u obliku:
A Q
+
=0
t
x
v
+g
t
x
(29.1)
v2
y+
= g(S0 Sf )
2g
(29.2)
Q
y je dubina vode, v brzina, a Q protok, pri c emu vrijedi relacija v = .
A
dH
Sf je pad energetske linije
, definiran Manningovom formulom (koja je
dx
prikazana u nastavku). Uvedimo oznaku
dH
= Sf
dx
S S0 smo oznacili nagib dna kanala, tj. S0 =
29.1.1
(29.3)
dz
= tan().
dx
Stacionarno strujanje
(29.4)
(29.5)
p
v2
+
=H
g 2g
(29.6)
prema kojoj je ukupna energija konstantna du strujnice. Vrijednost energetske linije oznacimo s H. Uvaavanjem jednakosti p = gy , slijedi z + y +
v2
= H, odnosno deriviranjem po x dobijemo diferencijalnu jednadbu za
2g
dubinu vode y = y(x):
2
dz dy
d
Q
dH
+
+
=
(29.7)
dx dx dx 2gA2
dx
Vrsta kanala
Manningov koeficijent
Betonski kanal
0.015
0.030
Rijecni tokovi
0.030 - 0.070
143
Maningova formula
Manningova formula, jo poznata kao GaucklerManningova formula ili GaucklerManningStricklerova formula, je empirijska jednadba za strujanje
u otovrenim kanalima ili strujanja sa slobodnom povrinom pod utjecajem
gravitacije. Definirana je kao:
Sf =
Q2 n2
2
R4/3)A
(29.9)
A
gdje je n Manningov koeficijent trenja, R =
je hidraulicki radijus, a P
P
perimetar.
dy
S Sf
= 0
dx
BQ2
1
gA3
(29.10)
BQ2
Opazimo da jednadba (29.10) vrijedi za
6= 1
gA3
(29.10) je diferencijalna jednadba prvog reda oblika
dy
= f(x, y(x))
dx
za koju analiticko rjeenje znamo odrediti samo u nekim posebnim slucajevima, za razliku od numerickog rjeenja koje znamo odrediti u podrucju
u kojem je diferencijalna jednadba dobro definirana. Da bi problem bio u
potpunosti modeliran potrebno je zadati i pocetne uvjete.
Zadatak: Za pocetni
uvjet y(x0 ) = y0
odrediti dubinu vode
y(x) iz
diferencijalne
jednadbe (29.10).
144
po cetni
problemi
29.1.3
S0 = Sf
1
1/2
AR2/3 S0
n
(29.12)
B - irina kanala
A(y) = B y
dA
=B
dy
(29.13)
(29.14)
P(y) = B + 2y
(29.15)
Trapezni kanal
P(y) = B0 + 2y
1 + Z2
dA
= B0 + 2yZ
dy
(29.16)
(29.17)
Zadatak 29.1 Odrediti normalnu dubinu vode yn u trapeznom kanalu, s bocnim nagibom Z = 2, te irinom dna B0 = 10m. Nagib dna kanala je konstandz
tan i jednak S0 =
= 0.001 (1m po km duljine) a Manningov koeficijent
dx
n = 0.013.
Rjeenje
Dubinu vode oznacimo s y. Iz slicnosti trokuta slijedi 1 : z = y : x, pa je
x = zy. Povrina omocenog presjeka trapeza
je A = (B0 + zy)y. Opseg
omocenog presjeka trapeza je P = B0 + 2y 1 + z2 . Hidraulicki radijus
je
R=
A
(B0 + zy)y
.
=
P
B0 + 2y 1 + z2
S0
2
B0 + 2yn 1 + z
Nakon uvrtavanja poznatih vrijednosti dobijemo
F(yn ) = 12.33(10 + 4.47yn )2/3 ((10 + 2yn )yn )5/3 = 0
Nul tocka funkcije F(y) predstavlja rjeenje gornje jednadbe. Moe se
odrediti pomocu neke od numerickih metoda npr. bisekcijom ili Newtonovom metodom. Rjeenje je
yn = 1.09m
29.1.4
Kriticna dubina
(29.18)
145
146
po cetni
problemi
Q
. Karakteristika kriticne dubine je da je to dubina kod koje je
A
specificna energija
fluida minimalna.
29.1.5
Hidraulicki skok
yc < yn
U tom se slucaju linija kriticne dubine nalazi ispod linije normalne dubine.
Tim je dvjema linijama podrucje strujanja podijeljeno u tri zone (vidi sliku
3.). Oblik rjeenja, dakle vodno lice, ovisi o pocetnom uvjetu. Traena se
rjeenja odreduju
iz diferencijalne jednadbe (29.10), koja se za promatrani
pravokutni prizmaticni kanal moe zapisati u obliku:
yn 10/3
1+
dy
y
= S0
3
dx
yc
1
y
(29.21)
U ovisnosti o zoni u kojoj se nalazi pocetni uvjet, dakle pocetna dubina ovisi
sami oblik rjeenja. Znacajno je naglasiti da dubina vode, odnosno rjeenje
ne moe prijeci diferencijalne jednadbe iz jedne u drugu zonu dakle, ako
29.1.6
Numericko rjeavanje
147
po cetni
problemi
148
3
4
5
6
pravokutni kanal
transkriti
cno strujanje
rjeavanje ODJ
"""
7
8
9
10
11
from
from
from
from
numpy import *
scipy.optimize import *
scipy.integrate import *
matplotlib.pyplot import *
12
13
g = 9.81
14
15
16
17
18
19
20
Q = 10.0
21
22
23
yc = ((Q/B)**2/g)**(1.0/3.0)
print(yc = +str(yc))
24
25
26
27
28
29
# osnovne veli
cine
A = lambda y: B*y
P = lambda y: B+2*y
R = lambda y: A(y)/P(y)
Sf = lambda y: (n*Q/(R(y)**(2.0/3.0)*A(y)))**2
30
31
32
yn = fsolve((lambda y: Sf(y)-S0),yc)
print(yn = +str(yn[0]))
33
34
35
36
37
# ra
cunanje razine vode
x0 = 0.0
y0 = 0.42
x1 = 30.0
38
39
X = linspace(x0,x1,100)
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#crtanje
figure(1, [8, 3])
Ydno = -(X-x0)*S0
plot(X,Y[:,0]+Ydno)
plot(X,Ydno)
#plot(X,Y_2[:,0]-(X-x0)*S0);
legend((razina vode,dno),loc=best);
subplots_adjust(bottom=0.08,top=0.95,left=0.05,right=0.98)
show()
0.5
0.4
0.3
razina vode
dno
0.2
0.1
0.0
0.10
10
15
20
25
30
149
30
RUBNI PROBLEMI
savijanje grede
Za rjeavanje ovog primjer koriten je rjeavac bvp1lg. Prije instalacije modula bvp1lg potrebno je instalirati pakete koje on koristi:
sudo zypper in python-numpy-devel fparser-devel \
libatlas3 libatlas3-devel lapack-devel
q(x)
u(x)
E, I
Slika 30.1: Savijanje grede
EI
d2 u
= M(x)
d x2
(30.1)
ili proireno
d2
d x2
d2 u
EI
d x2
!
= q(x)
(30.2)
d4 u
= q(x)
d x4
(30.3)
Pomocu supstitucija:
w1 (x) = u(x)
du
dx
d2 u
w3 (x) =
d x2
d3 u
w4 (x) =
d x3
w2 (x) =
(30.4)
151
152
rubni problemi
= w2 (x)
= w3 (x)
(30.5)
= w4 (x)
=
1
q(x)
EI
Za sustav (30.5) potrebno je postaviti 4 rubna uvjeta kako bi se moglo dobiti rjeenje savijanja grede. Rubni uvjeti koje je moguce postaviti na krajeve
grede (Slika 30.2):
? Rubni uvjet progiba u|xbc = ubc . U tocki xbc postavlja se vrijednost
progiba ubc .
= vbc . U tocki xbc postavlja se vrijednost
? Rubni uvjet nagiba dd u
x
xbc
nagiba vbc .
? Rubni uvjet momenta
d2 u
d x2 x
d3 u
d x3 x
U izvornom kodu 30.1 prikazan je primjer rjeavanja savijanja grede koristeci bvp1lg paket koji je specijaliziran rjeavac za rubne probleme. U danom primjeru koriteni su sljedeci rubni uvjeti: lijevi rub je ukljeten (nema
progiba ni rotacije/nagiba) dok na desnom rubu zglob (nema pomaka ni
momenta). Greda je opterecenja konstantnim kontinuiranim opterecenjem
du cijele duine.
Izvorni kod 30.1: Rjeavanje elasticne linije savijanja
1
2
3
4
5
6
7
8
9
# Definiranje problema
EI = 1.0 # Youngov modul i moment otpora
L = 1.0 # Duzina grede
# Opterecenja
qq=-1.0
10
11
12
13
degrees = [1, 1, 1, 1]
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Rubni uvjeti
boundary_points = [0.0, 0.0, L, L]
def boundary_conditions(y):
u, du, d2u, d3u = y
return [u[0], du[1], u[2], d2u[3]]
28
29
30
31
32
33
34
35
36
38
39
40
41
42
43
44
45
46
# Vizualizacija rjesenja
figure(1, figsize=(8, 3))
x = solution.mesh
plot(x, solution(x)[:,0], b-, linewidth=2)
xlabel(x)
ylabel(y)
grid()
subplots_adjust(bottom=0.15,top=0.95,left=0.13,right=0.98)
savefig(greda.pdf)
show()
37
0.000
0.001
0.002
0.003
0.004
0.005
0.0060.0
0.2
0.4
0.6
30.2
0.8
1.0
153
31
K L A S I F I K A C I J A PA R C I J A L N I H D I F E R E N C I J A L N I H
JEDNADBI
(31.1)
u(x, y + y) u(x, y)
u
(x, y) = lim
y
y
y0
(31.2)
Parcijalna diferencijalna jednadba je jednadba koja sadri parcijalne derivacije nepoznate funkcije dviju ili vie nezavisnih varijabli.
Opceniti oblik linearne PDJ drugog reda s konstantnim koeficijentima je
A
2 u
2 u
2 u
+C 2 +D
+B
2
xy
x
y
(31.3)
155
K E PA R C I J A L N E D I F E R E N C I J A L N E J E D N A D B E
ELIPTIC
2 u 2 u
+ 2 =0
x2
y
(32.1)
Poissonova jednadba
u =
2 u 2 u
+ 2 = f(x, y)
x2
y
Kvaziharmonicka PDJ
u
kx
+
ky
= f(x, y)
x
x
y
y
(32.2)
(32.3)
progib plo ce
32.1
q
x
y
z
Promatramo plocu jednostavno poduprtu na rubovima, s povrinskim opterecenjem q (Slika 32.1). Progib tako slobodno oslonjene ploce u smjeru z
moe se odrediti iz PDJ eliptickog tipa
4 z
4 z
4 z
q
+
2
+
=
D
x4
x2 y2 y4
(32.4)
(32.5)
2 z
=0
n2
(32.6)
Parametar D definiran je s
D=
Et3
2(1 2 )
(32.7)
157
32
elipti cke
parcijalne diferencijalne jednadbe
158
2 z 2 z
+
x2 y2
(32.8)
(32.9)
(32.10)
z| = 0
(32.11)
7
8
9
10
11
from
from
from
from
numpy import *
scipy.linalg import *
matplotlib.pyplot import *
mpl_toolkits.mplot3d import Axes3D
12
13
14
15
16
17
18
# ulazni podaci
q = 10000.0 # [N/m^2]
d = 0.01
# [m]
L = 2.0
# [m]
E = 2.0*10**11 # modul elasti
cnosti
pbr = 0.3
# Poissonov broj
19
20
D = E*d**3/(12.0*(1.0-pbr**2))
# fleksna krutost
21
22
nm = 50
# broj to
caka po dimenziji
23
24
25
h = L/(nm-1)
n = (nm-2)
26
27
28
29
30
31
32
33
34
35
36
37
38
# rjeavanje
u = solve(A,b)
z = solve(A,u*h**2)
32.1 progib plo ce
39
40
41
42
43
# pakiranje rezultata
z = reshape(z,[n,n])
# ili: z = z.reshape([n,n])
Z = zeros([nm,nm])
Z[1:(nm-1),1:(nm-1)] = -z
44
45
46
47
# prikaz
pcolor(Z)
colorbar()
48
49
50
51
52
53
# 3d
l = linspace(0,L,nm)
X, Y = meshgrid(l,l)
figure().gca(projection=3d).plot_surface(X,Y,Z, \
rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0)
54
55
show()
159
33
METODA LINIJA
Metoda linija je opca tehnika za rjeavanje parcijalnih diferencijalnih jednadbi (PDE) koje obicno koriste konacne razlike za odnose prostornih derivacija i obicne diferencijalne jednadbe za vremensku derivaciju.
Za ilustraciju i detaljnije pojanjenje ove metode koristit c e se primjena
metode na problem nestacionarnog progrijavanja tapa. Parcijalna diferencijalna jednadvba koja opisuje promjenu temperature du osi tapa i u
vremenu je:
2 T
T
=D 2
t
x
(33.1)
(33.2)
(33.3)
.
Osnovna ideja metode linija je da se parcijalnu diferencijalnu jednadbu
(33.1) svede na sustav obicnih diferencijalnih jednadbi.
"ghost" point
i=1
i-1
i=n
i+1
x
x=0
x=L
Slika 33.1: Diskretizacija
(33.4)
(33.5)
(33.6)
161
162
metoda linija
(33.7)
(33.8)
Jednadbe (33.4), (33.7) i (33.8) tvore sustav obicnih diferencijalnih jednadbi koje se moe rjeiti prikladinim rjeavacem.
#!/usr/bin/python
# -*- coding: utf-8 -*-
3
4
5
6
7
from
from
from
from
scipy import *
scipy.integrate import *
matplotlib.pyplot import *
matplotlib.animation import *
8
9
10
11
12
13
nx = 50
x = linspace(0, 1, nx)
A = diag(ones(nx)*(-2.0), k=0) + \
diag(ones(nx-1)*1.0, k=1) + \
diag(ones(nx-1)*1.0, k=-1)
14
15
16
17
18
19
"""
Resetiraj jednadbu za prvu i zadnju to
cku
"""
A[0,:] = 0
A[-1,:] = 0
20
21
22
23
24
25
26
27
"""
Prva to
cka: izolacija dT0/dx = 0 ==> T_-1 = T_0
dT0/dt = k*(T_1 - 2*T_0 +T_-1)/dx^2
= k*(T_1 - T_0)/dx^2
"""
A[0,0] = -1
A[0,1] = 1
28
29
30
31
32
"""
Zadnja to
cka: fiksna temperatura dT/dt = 0
"""
A[-1,-1] = 0
33
34
35
36
37
38
dx=0.1;
k=0.01;
nt = 11
t = linspace(0.0, 100., nt)
39
40
41
T0 = sin(x*pi)
print shape(dot(A,T0))
42
43
44
45
46
47
48
"""
Postavi sustav ODJ
"""
def dT_dt(T, t):
dT = (k/dx**2.0)*dot(A,T)
return dT
49
50
51
52
"""
Rjei sustav ODJ
"""
metoda linija
53
54
55
56
57
58
59
60
"""
Crtanje i animacija rjeenja
"""
fig1 = figure()
lineGeom, = plot([], [], r-, lw=2)
titl = title()
61
62
63
64
65
66
def update_line(i):
lineGeom.set_data(x, rez[i,:])
titl.set_text(t=%f % t[i])
#fig1.savefig(img_%03d.png % i)
return
67
68
69
163
Dio VI
OPTIMIZACIJSKE METODE
34
(34.1)
(34.2)
optimizacijske varijable
(34.3)
(34.4)
Uvodenjem
omedenosti,
prostor pretraivanja suava se na
x Rn
(34.5)
Omedenost
(bound) kontinuiranih optimizacijskih varijabli je postavljanje
granica varijabli tj. definiranje doputenog intervala varijabli. Za svaku kontinuiranu varijablu xi moe se postaviti donja granica (lower bound) xmin
te
i
gornja granica (upper bound) xmax
i
onda
vrijedi:
i
i
h
xi xmin
, xmax
, i = 1, . . . , n
(34.6)
i
i
Uvodenjem
diskretnih varijabli, najcece indeksiranih pomocu cijelih ili
prirodnih brojeva, prostor pretraivanja se definira na skupu cijelih brojeva
x Zn
(34.7)
(34.8)
167
168
(34.9)
a s obizirom na omedenost
na:
? omedene
(bounded) i
? neomedene
(unbounded).
34.2
34.3
ograni cenja
(34.10)
35
LINEARNO PROGRAMIRANJE
Linearno programiranje je matematicka metoda pronalaska optimuma linearne funkcije vie varijabli potujuci ogranicenja zadana linearnim nejednakostima i jednakostima.
Linearno programiranje je razvijeno kao disciplina u 1940-ima, u pocetku
motivirano zbog potrebe za rjeavanje sloenih problema planiranja u ratnim operacijama. Njegov razvoj ubrzano raste u poslijeratnom razdoblju,
kad mnoge industrije pronalaze korisne primjene linearnog programiranja.
Iako je problem linearnog programiranja formulirao jo Furier, jedna od
prvih prakticnih upotreba imao je ruski matematicar Kantorovic ([5]) u pokuaju poboljanja ekonomskih planiranja 1939. godine u SSSR-u.
35.1
definicija lp problema
n
X
ci xi
(35.1)
i=1
(35.2)
gdje je x = (x1 , x2 , ..., xn ) vekor varijabli a c = (c1 , c2 , ..., cn ) vektor koeficijenata linearne jednadbe. Vektor x Rn predstavlja optimizacijske
varijable za koje se trai optimalno rjeenje x za koje vrijedi
f(x ) 6 f(x), x
(35.3)
> b1
> b2
..
.
> bm
(35.4)
169
Nejednadbe se mogu
zadavati sa razlicitim
operatorima
usporedivanja
(> i
6), a mjenjanje
operatora se moe
postici mnoenjem
cijele nejednandbe
sa -1.
170
linearno programiranje
= e1
= e2
..
.
= ep
Ogranicenja zadan
jednakostima mogu
se zadavati i kao
dvije identicne
nejednakosti sa
suprotnim znakom
nejednakosti (npr.
x1 + x2 > 0 i
x1 + x2 6 0 je isto
to i x1 + x2 = 0)
Dx = E
35.2
(35.5)
simpleks metoda
modula pulp
rjeavanje lp problema pomo cu
http://code.google.com/p/pulp-or/
2
3
4
5
6
7
# Varijable
x = LpVariable("x", 0, 3)
y = LpVariable("y", 0, 1)
8
9
10
# LP problem
prob = LpProblem("myProblem", LpMinimize)
11
12
13
# Cilj
prob += -4*x + y
14
15
16
17
# Ogranicenja
prob += x + y <= 2
prob += x == y
18
19
20
# Rjesavanje
status = prob.solve()
21
22
23
24
25
# Ispis
print LpStatus[status]
print value(x)
print value(y)
35.4
prakti cni
primjeri lp problema
35.4 prakti cni
primjeri lp problema
35.4.1
Teretni zrakoplov
Zadatak 35.1 Teretni zrakoplov ima tri odjeljka za teret: prednji, centralni i
stranji odjeljak. Odjeljci zrakoplova imaju ogranicenja s obzirom na masu i
volumen tereta koji mogu prihvatiti.
Odjeljak Doputena masa tereta [t]
Prednji 10
68
Centralni16
87
Stranji 8
53
Masa [t]
Zarada [A
C]
C1
18
4.80
310
C2
15
6.50
380
C3
23
5.80
350
C4
12
3.90
285
Bilo koja kolicina tereta je prihvatljiva. Cilj je pronaci koliko svakog pojedinog tereta treba ukrcati te kako ih distribuirati u odjeljke zrakoplova kako bi se
maksimizirao ukupan profit leta.
Rjeenje
Potrebno je odrediti mase svakog od c etri vrste tereta koje treba ukrcati
u svaki od tri odjeljaka. Neka je xij masa tereta i koji se ukrcava u
odjeljak j.
x = (x11 , x12 , x13 , x21 , x22 , x23 , x31 , x32 , x33 , x41 , x42 , x43 )
U zrakoplov se ne moe ukrcati vie tereta nego to ga ima na raspolaganju. To vrijedi za svaku od c etri vrste tereta.
x11 + x12 + x13 6 18
x21 + x22 + x23 6 15
x31 + x32 + x33 6 23
x41 + x42 + x43 6 12
Doputena ukupna masa tereta u svakom odjeljku ne smije biti prekoracena.
x11 + x21 + x31 + x41 6 10
x12 + x22 + x32 + x42 6 16
x13 + x23 + x33 + x43 6
171
172
linearno programiranje
2
3
4
5
6
7
8
# Varijable
x11 = LpVariable("x11", 0)
x12 = LpVariable("x12", 0)
x13 = LpVariable("x13", 0)
9
10
11
12
x21 = LpVariable("x21", 0)
x22 = LpVariable("x22", 0)
x23 = LpVariable("x23", 0)
13
14
15
16
x31 = LpVariable("x31", 0)
x32 = LpVariable("x32", 0)
x33 = LpVariable("x33", 0)
17
18
19
20
x41 = LpVariable("x41", 0)
x42 = LpVariable("x42", 0)
x43 = LpVariable("x43", 0)
21
22
23
# LP problem
prob = LpProblem("Plane Cargo", LpMaximize)
24
25
26
27
# Cilj
prob += (x11 + x12 + x13)*310 + (x21 + x22 + x23)*380 + \
(x31 + x32 + x33)*350 + (x41 + x42 + x43)*285
28
29
30
31
32
33
34
# Ogranicenja
prob += x11 +
prob += x21 +
prob += x31 +
prob += x41 +
x12
x22
x32
x42
+
+
+
+
x13
x23
x33
x43
<=
<=
<=
<=
18
15
23
12
(35.6)
35.4 prakti cni
primjeri lp problema
35
36
37
38
39
40
41
42
43
44
45
46
47
# Rjesavanje
status = prob.solve()
48
49
50
# Ispis rjesenja
print Status:, LpStatus[status]
51
52
53
for v in prob.variables():
print v.name, "=", v.varValue
54
55
173
36
NELDER-MEAD METODA
algoritam
Pod najgorom
tockom se
podrazumijeva tocka
u kojoj je vrijednost
funkcije najveca (kod
problema
minimizacije).
175
Pod najboljom
tockom se
podrazumijeva tocka
u kojoj je vrijednost
funkcije najmanja
(kod problema
minimizacije).
176
nelder-mead metoda
Slika 36.1: Tocke refleksije, ekspanzije, kontrakcije i redukcije kod Nelder-Mead metode optimizacije za funkciju dvije varijable. Tocke refleksije, ekspanzije ili kontrakcije mjenjaju
najgoru tocku simpleksa, dok tocke redukcije mjenjaju dvije nagore tocke simpleksa.
5
6
7
8
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
9
10
11
12
def f(x):
return np.sin(x[0]/20.0)/(x[0]**2.0/1000.0 + 1)*np.cos(x[1]/50.0)
#return x[0]**2.0 + x[1]**2.0
13
14
15
16
17
18
19
20
21
22
23
fig = plt.figure()
contour_plot = plt.contourf(X, Y, Z, 150, # [-1, -0.1, 0, 0.1],
#alpha=0.5,
#cmap=plt.cm.bone,
#origin=origin
)
24
25
26
27
28
29
30
31
32
# Postavke metode
alpha = 1.0
beta = 0.5
gamma = 2.0
delta = 0.5
maxiter = 15
eps = 0.0001
33
34
35
36
37
# Po
cetne to
cke
A0 = [-50, 50]
B0 = [-50, -50]
C0 = [50, 50]
38
39
40
41
A0.append(f(A0))
B0.append(f(B0))
C0.append(f(C0))
42
43
44
45
46
47
48
49
50
51
52
def init():
xline = [A0[0], B0[0], C0[0], A0[0]]
yline = [A0[1], B0[1], C0[1], A0[1]]
simpleks, = plt.plot(xline, yline, -o)
53
54
return simpleks
55
56
57
177
178
nelder-mead metoda
58
59
60
61
62
B = np.array(Ts[0])
S = np.array(Ts[1])
W = np.array(Ts[2])
63
64
M = (B + S) / 2.0
65
66
67
68
# Refleksija
R = M + alpha * (M - W)
R[2] = f(R)
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
if R[2]< W[2]:
# Kontrakcija vanjska
C = M + beta*(W-M)
C[2] = f(C)
89
90
91
92
93
94
95
96
S = B + delta * (S - B)
S[2] = f(S)
97
98
99
100
101
102
103
else:
# Kontrakcija unutarnja
C = M - beta * (W - M)
C[2] = f(C)
104
105
106
107
108
109
110
111
S = B + delta * (S - B)
S[2] = f(S)
112
113
114
115
116
117
T[0] = B
T[1] = S
T[2] = W
118
119
120
121
122
123
124
#plt.savefig(iteration%02d.pdf % it)
return simpleks
125
126
127
Writer = animation.writers[ffmpeg]
writer = Writer(fps=2, metadata=dict(artist=Stefan), bitrate=3600)
128
129
130
131
132
133
anim.save(nelder-mead.avi, writer=writer)
plt.show()
134
135
136
137
138
4.72068787e-03
-2.99504027e-03
8.40537250e-03
-6.01976050e-01]
-6.01976025e-01]
-6.01976024e-01]
40
20
0
20
40
60
60
40
20
20
40
179
37
SIMULIRANO KALJENJE
Simulirano kaljenje je stohasticka optimizacijska metoda namjenjena rjeavanju problema globalne optimizacije. 1983. godine su Kirkpatrick, Gelatt i
algoritam
1
ako je f < 0
p(T ) =
f
Ti
ako je f > 0
e
5. (Ne)prihvacanje novog stanja
6. Proces hladenja
Ti+1 = (Ti )
7. Sljedeca iteracija i = i + 1
x je nasumicni vektor pomaka kojim dobivamo novu tocku u blizini
stare. Vecina algoritama simuliranog kaljenja automatski reducira x tijekom samog procesa optimizacije kako bi se u pocetku pokrivalo to vece
podrucje (global search) a kasnije osigurala to bra konvergencija (local search).
modula inspyred
primjer simuliranog kaljenja pomo cu
5
6
181
182
simulirano kaljenje
7
8
9
10
11
12
F=[]
13
14
15
16
17
18
def f(X):
fit = 10.0 * len(X)
for x in X:
fit += (x**2.0 - 10.0*cos(2.0*pi*x))
return float(fit)
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
prng = Random()
prng.seed(time())
37
38
39
40
41
42
43
44
45
46
47
ea = inspyred.ec.SA(prng)
ea.terminator = inspyred.ec.terminators.evaluation_termination
ea.observer = observe
final_pop = ea.evolve(evaluator = evaluate,
generator = generate,
maximize = False,
bounder = inspyred.ec.Bounder(-5.12, 5.12),
max_evaluations = 3000,
temperature = 1000.0,
cooling_rate = 0.5)
48
49
50
best = min(final_pop)
print(Najbolje rjesenje: \n{0}.format(str(best)))
51
52
53
54
55
56
plot(F)
xlabel(iteracije)
xlabel(f)
grid()
show()
Najbolje rjesenje:
[-0.007675196458353489, -0.004919287254415098, -0.013702756782375067,
0.007230016365494668, 0.0016173493554606094, -0.02186560269034206,
-0.04488667414508021, 0.008940404646539009, -0.006383384005716428,
0.0035534794190288585] : 0.58284052168
modula inspyred
37.2 primjer simuliranog kaljenja pomo cu
200
150
100
50
0
0
500
1000
1500
f
2000
2500
3000
183
38
ESTICA
OPTIMIZACIJA ROJEM C
38.1
razvoj metode
? Prilagodavanje
smjera - svaki c lan jata giba se u usrednjenom smjeru
kretanja svojih susjeda,
? Kohezija - svaki c lan jata ostaje blizu svojih susjeda tj. ostaje u jatu.
Kennedy i Eberhart[6] su dodali gnijezdo u pojednostavljenu simulaciju
temeljenu na Reynoldsovom modelu. Simulacija je obuhvacala sljedece utjecaje gnijezda na jedinke jata:
? gnijezdo privlaci svaku jedinku,
? Svaka jedinka pamti gdje je bila najblia gnijezdu.
? Svaka jedinka razmijenjuje informacije sa susjedima o lokaciji najblioj
gnijezdu.
(38.1)
xt+1
= xti + vt+1
i
i
(38.2)
(38.3)
185
optimizacija rojem cestica
186
U osnovnom obliku, faktor inercije je konstantan u vremenu wt = w. U sluc aju w > 1, brzine c estica rastu u vremenu (cestice ubrzavaju) a formacija
roja divergira. Usporavanje c estica i smanjivanje brzine do nule postie se sa
w < 1. Veci faktor inercije omogucava lake globalno pretraivanje, sa povec anjem rasapa c estica, dok manji w omogucuje bolje lokalno pretraivanje
i bru konvergenciju. Odabir faktora inercije treba temeljiti na karkateristikama funkcije cilja i svodi se na balansiranje irine pretraivanja i brzine
konvergencije.
Prema [14]
w>
c1 + c2
1
2
(38.4)
garantira konvergenciju putanja c estica, a prema [1] preporuceni faktor inercije je w = 0.73.
38.2
modula inspyred
koritenje pso metode pomo cu
6
7
8
9
10
# Random generiranje
def generate_rastrigin(random, args):
size = args.get(num_inputs, 10)
return [random.uniform(-5.12, 5.12) for i in range(size)]
11
12
13
14
15
16
17
18
19
20
21
22
23
24
rand = Random()
rand.seed(int(time()))
pso = inspyred.swarm.PSO(rand)
pso.terminator = inspyred.ec.terminators.evaluation_termination
modula inspyred
38.2 koritenje pso metode pomo cu
25
26
27
28
29
30
31
32
33
final_pop = pso.evolve(generator=generate_rastrigin,
evaluator=evaluate_rastrigin,
pop_size=100,
maximize=False,
bounder=inspyred.ec.Bounder(-5.12, 5.12),
max_evaluations=20000,
mutation_rate=0.25,
num_inputs=5)
34
35
36
37
187
39
KI ALGORITMI
GENETIC
evolucijski algoritmi
50-ih i 60-ih godina 20. stoljeda nekoliko znanstvenika na podrucju racunarstva nezavisno su proucavali evolucijske sustave sa idejom da se evolucija
koristi kao optimizacijski alat za inenjerske probleme. Ideja u svim tim
sustavima bila je da populacija kandidacijskih rjeenja evoluira ka optimalnom rjeenju zadanog problema, koristeci operatore inspirirane prirodnom
genetskom varijacijom i prirodnom selekcijom.
Profesor John Holland, na sveucilitu u Michiganu, doao na ideju genetskog algoritma, koju je razvijao 60-ih i 70-ih godina zajedno sa svojim
studentima i kolegama. Hollandov cilj nije bilo dizajniranje algoritma za rjeavanje specificnih problema, vec proucavanje fenomena adaptacije kakav se
pojavljuje u prirodi, te razviti nacine kako mehanizme prirodne adaptacije
primjeniti u racunalnim sustavima. 1975 Holland je prvi koristio naziv genetski algoritam u knjizi Adaptation in Natural and Artificial Systems.
John Henry Holland smatra se ocem genetskih algoritama. 1989 David Goldberg sa sveucilita u Illinoisu primijenio je Hollandovu ideju na razlicita
inenjerska podrucja. Goldberg: Three billion years of evolution cant be
wrong. Its the most powerful algorithm there is..
Dananji moderni genetski algoritam svrstava se u evolucijske algoritme,
koji sadravaju iroki spektar mehanizama koji oponaaju procese prirodne
evolucije, gdje je glavni koncept opstanak najjaceg. Dananji najkoriteniji
evolucijski algoritmi su:
? Genetski algoritmi koji modeliraju genetsku evoluciju
? Genetsko programiranje koje je bazirano na genetskim algoritmima,
ali jedinke su programi (struktura hijerarhijskog stabla).
? Evolucijsko programiranje je izvedeno iz simuliranja adaptivnog ponaanja u evoluciji (phenotypic evolution).
? Evolucijske strategije su usmjerene prema modeliranju strategije parametara koji kontroliraju varijaciju u evoluciji, c esto nazivano Evolucija evolucije.
? Diferencijalna evolucija, koja je slicna genetskim algoritmima ali razlikuje se po koritenim mehanizmima reprodukcije.
? Kulturalna evolucija, modelira evoluciju kulture populacije i kako kultura utjece na genetsku i fenotipnu evoluciju jedinki.
? Koevolucija, namjerno glupe jedinke evoluiraju kroz kooperaciju, ili
kroz nadmetanje jedne sa drugom, a pritom stjecu potrebne karakteristike kako bi preivjele.
189
geneti cki
algoritmi
190
39.2
4
5
6
@author: stefan
"""
7
8
import random
9
10
11
12
13
14
15
16
17
18
19
DIMS = 10
LB = -100.0*np.ones(DIMS)
UB = 100*np.ones(DIMS)
20
21
22
23
24
25
26
# Funkcija cilja
# Rosenbrock funkcija
def evaluate(x):
x = np.array(x)
s = sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
return s,
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
toolbox = base.Toolbox()
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Statisti
cko pra
cenje algoritma
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", tools.mean)
stats.register("std", tools.std)
stats.register("min", min)
stats.register("max", max)
83
84
85
86
# Pokretanje algoritma
algorithms.eaSimple(pop, toolbox, cxpb=0.75, mutpb=0.8, ngen=200, stats=stats,
halloffame=hof, verbose=True)
87
88
89
90
91
92
93
94
95
96
97
98
99
100
evals
250
241
240
238
237
235
239
std
max
avg
[8.138e+09] [4.366e+10]
[5.711e+09] [2.543e+10]
[3.454e+09] [1.832e+10]
[1.913e+09] [1.194e+10]
[9.443e+08] [4.473e+09]
[5.374e+08] [3.477e+09]
[2.739e+08] [1.794e+09]
min
[1.676e+10] [9.85e+08]
[1.055e+10] [6.183e+08]
[6.01e+09] [6.183e+08]
[3.19e+09] [3.502e+08]
[1.735e+09] [2.265e+08]
[1.015e+09] [1.64e+08]
[6.411e+08] [1.211e+08]
191
192
geneti cki
algoritmi
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
237
238
234
244
234
236
241
238
243
230
235
239
235
235
233
234
236
241
235
238
236
234
234
237
242
234
234
237
242
237
235
241
244
234
246
235
238
239
239
234
232
241
237
238
242
229
239
239
225
233
230
242
238
233
240
240
231
240
236
241
240
233
238
236
230
242
236
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
237
238
239
238
239
235
234
241
240
238
242
237
244
241
238
243
230
244
239
241
243
234
239
235
239
237
233
239
238
230
239
238
243
239
240
238
238
241
236
237
236
241
236
232
235
236
239
240
238
235
238
240
241
241
232
239
245
236
238
241
243
235
242
237
231
240
238
[2283]
[2489]
[2032]
[1637]
[2292]
[2040]
[3623]
[1986]
[2757]
[1986]
[2064]
[1369]
[3604]
[2782]
[1717]
[1238]
[2571]
[4126]
[1784]
[3300]
[2112]
[1190]
[1216]
[1446]
[1419]
[2335]
[1694]
[2725]
[904.7]
[1020]
[1850]
[1275]
[1501]
[1411]
[588.3]
[1348]
[1954]
[876.8]
[1800]
[1454]
[1755]
[1623]
[1154]
[1236]
[1733]
[964.4]
[886]
[855.8]
[958.2]
[1769]
[1070]
[629.2]
[1230]
[1356]
[1345]
[1718]
[884.6]
[2529]
[991.9]
[1205]
[1302]
[931.8]
[2047]
[1823]
[1165]
[1321]
[1145]
193
194
geneti cki
algoritmi
141
243
[1129]
[1.223e+04] [339.6] [4.498]
142
233
[1841]
[1.926e+04] [503.9] [4.498]
143
227
[2081]
[2.256e+04] [440.2] [4.498]
144
237
[1637]
[1.377e+04] [463.4] [4.812]
145
227
[822.9] [5511]
[331.5] [4.812]
146
241
[1353]
[1.136e+04] [456.5] [4.511]
147
241
[2742]
[4.17e+04] [552.9] [4.359]
148
239
[1607]
[1.535e+04] [511.9] [4.501]
149
240
[1390]
[2.069e+04] [288.1] [4.207]
150
236
[2938]
[4.022e+04] [644.6] [4.207]
151
235
[1182]
[8947]
[463.4] [4.325]
152
240
[1623]
[2.288e+04] [419.3] [4.137]
153
235
[1488]
[1.018e+04] [488.9] [4.137]
154
237
[1428]
[1.126e+04] [406.1] [4.173]
155
238
[1028]
[1.098e+04] [407.9] [4.173]
156
242
[1936]
[2.189e+04] [512.9] [4.173]
157
239
[1401]
[1.565e+04] [482.9] [4.349]
158
231
[1646]
[1.815e+04] [470.4] [4.173]
159
240
[1213]
[1.234e+04] [380.1] [4.173]
160
237
[2538]
[2.251e+04] [663.3] [4.12]
161
238
[1553]
[1.415e+04] [555.3] [4.12]
162
242
[958.1] [6383]
[399.8] [4.12]
163
238
[2865]
[4.117e+04] [588.5] [4.12]
164
239
[1653]
[2.155e+04] [407.9] [4.12]
165
238
[1852]
[2.361e+04] [475.2] [4.149]
166
235
[1891]
[1.527e+04] [607.9] [4.12]
167
236
[3473]
[5.273e+04] [625]
[3.956]
168
239
[1542]
[1.697e+04] [463]
[3.956]
169
239
[807.2] [6581]
[350.1] [3.934]
170
241
[1412]
[1.861e+04] [425.3] [3.89]
171
231
[1155]
[9384]
[384.7] [3.771]
172
238
[1163]
[1.102e+04] [399.2] [3.771]
173
235
[1219]
[1.679e+04] [298.3] [3.705]
174
238
[1162]
[1.117e+04] [374.7] [3.705]
175
236
[1362]
[1.645e+04] [381.5] [3.546]
176
237
[1214]
[1.07e+04] [409.8] [3.546]
177
236
[1791]
[1.927e+04] [552.3] [3.488]
178
239
[848.6] [5107]
[369.8] [3.488]
179
237
[830.2] [4992]
[382]
[3.488]
180
243
[2064]
[2.391e+04] [454.4] [3.488]
181
236
[1035]
[9859]
[340.8] [3.488]
182
239
[1009]
[7094]
[379.3] [3.488]
183
238
[2095]
[2.451e+04] [513]
[3.418]
184
241
[1196]
[1.205e+04] [422.7] [3.418]
185
232
[1858]
[1.774e+04] [531.3] [3.48]
186
243
[1039]
[7818]
[369.3] [3.48]
187
241
[2927]
[3.483e+04] [681.6] [3.48]
188
239
[1053]
[1.037e+04] [337.1] [3.48]
189
237
[1260]
[1.353e+04] [440.2] [3.352]
190
233
[1493]
[1.131e+04] [541.1] [3.352]
191
238
[1221]
[1.254e+04] [363]
[3.352]
192
239
[1183]
[1.012e+04] [402]
[3.352]
193
237
[661.4] [6206]
[207.8] [3.352]
194
229
[973.4] [1.098e+04] [311.9] [3.352]
195
239
[819.5] [8727]
[309.5] [3.352]
196
241
[1426]
[1.023e+04] [544]
[3.352]
197
231
[1554]
[1.574e+04] [460.7] [3.299]
198
230
[871.4] [7335]
[357]
[3.299]
199
230
[1274]
[1.564e+04] [360.9] [3.337]
200
237
[1132]
[1.33e+04] [335.3] [3.299]
[[0.9766898231038279, 0.9607527096530896, 0.9065456124364575, 0.7944737905585467,
0.6248374250078815, 0.4065051529287608, 0.1803529539435661, 0.042390694202784074,
0.020730481699758788, -0.0009199868286795705]]
[deap.creator.FitnessMax((3.2990264400893148,))]
1011
min
avg
max
1010
109
108
107
106
105
104
103
102
101
100 0
50
100
150
200
195
Dio VII
DODACI
K O R I S N E N A R E D B E U L I N U X O P E R AT I V N O M S U S TAV U
a.1
ffmpeg (http://www.ffmpeg.org/)
Primjer kreiranja video datoteke iz skupa slika koristeci alat ffmpeg.
stefan@fuji:~> ls -la
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
-rw-r--r-- 1 stefan users
116833
120415
116858
113018
114172
114172
114172
111188
110868
110868
110868
110868
113035
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
Jun
11
11
11
11
11
11
11
11
11
11
11
11
11
17:21
17:24
17:26
17:29
11:10
11:21
11:32
11:43
11:54
12:05
12:16
12:27
12:38
slika_000.png
slika_001.png
slika_002.png
slika_003.png
slika_004.png
slika_005.png
slika_006.png
slika_007.png
slika_008.png
slika_009.png
slika_010.png
slika_011.png
slika_012.png
pra cenje
promjena tekstualnih datoteka
Cesto
se prilikom izvodenja
numerickih proracuna ili simulacija vane informacije o tijeku i napredku proracuna biljee u tekstualne datoteke. Za lake
lokalno i posebice udaljeno pracenje promjene tekstualne datoteke putem
terminala koristi se naredba tail.
Primjer dinamickog pracenja tekstualne datoteke:
tail -f log.txt
Primjer dinamickog pracenja prvih 100 znakova u novim linijama tekstualne datoteke:
tail -f log.txt | cut -b 1-100
199
BIBLIOGRAFIJA
[1] Daniel Bratton and James Kennedy. Defining a standard for particle swarm optimization. In Swarm
Intelligence Symposium, 2007. SIS 2007. IEEE, pages 120127. IEEE, 2007.
201
colophon
This work is licensed under a Creative Commons Attribution-ShareAlike
3.0 Unported License.
http://creativecommons.org/licenses/by-sa/3.0/