View
9
Download
1
Category
Preview:
Citation preview
BrzitecajPythonazaznanstvenike
Python nudi mnogo načina na koje se mogu modelirati i analizirati znanstveni podaci. Program se instalira
vrlo lako, a nije ga problem niti naučiti pa je zato popularan za korištenje u znanstvenoj zajednici. Kako bi
mogli uspješno izvršiti programe opisane u daljnjem tekstu potrebno je instalirati iduće na svoje računalo:
Python- verziju 3.3 ili stariju jer neke biblioteke nemaju verzije koje rade na novim verzijama Pythona
Numpy- osnovne numeričke ekstenzije za linearne algebre i višedimenzionalne polja
Scipy-dodatne biblioteke za znanstveno programiranje
Matplotlib- biblioteke koje se uglavnom koriste za grafički prikaz podataka
IPython-dodatne biblioteke potrebne za korištenje programa
Izrada nacrta koristeći Matplotlib:
Koristimo sučelje IPython kako bi pomoću biblioteke Matplotlib napravili graf nekog zadatka.
U prvom primjeru uspoređujemo rast dviju funkcija. Fibonaccijevog niza i faktorijela. Zanima nas koji od dva
niza brže raste, a to je najlakše prikazati grafom.
o Označava veličinu sučelja
o Crta funkciju faktorijela i stvara
naljepnicu „factorial“ na grafu
o Crta funkciju fibs i stvara
naljepnicu „Fibonacci“ na grafu
o Ispod x osi piše „n“
o Stvara na grafu legendu (ona
sadrži naljepnice)
Funkcija faktorijela raste mnogo brže pa funkciju Fibonacci gotovo i ne vidimo na grafu. Međutim, možemo
izračunati logaritamske vrijednosti kako bi mogli vidjeti i drugu funkciju jer će razlike biti manje.
o Pridružuje logaritamske vrijednosti faktorijelama
o Pridružuje logaritamske vrijednosti fibonaccijevom nizu
Sada se na grafu jasno vidi da funkcija faktorijela brže raste.
Numpy i Scipy
Numpy je biblioteka prilagođena za brzo računanje vektora, matrica i drugih operacija s područja linearne
algebre u Pythonu. Scipy sadrži dodatne funkcije za optimizaciju koda, neke specijalne funkcije i slično.Kod
stvaranja vektora možemo nakon upisivanja elemenata polja napisati zarez i unutar navodnika slovo.
(array([element polja1, element polja 2, ...], 'neko slovo') To nam slovo govori kojeg će tipa biti elementi
vektora.
o Pisanje 'd' stvara u polju brojeve float tipa
o Pisanje 'D' stvara u polju kompleksne brojeve float tipa
o Pisanje 'i' stvara u polju brojeve int tipa duge 32 bita
Kad stvaramo matrice možemo stvarati polja čiji su elementi liste ili koristiti posebne funkcije Numpyja za
stvaranje matrica.
o Stvaramo polje s elementima koji su liste
o Stvaramo matricu veličine 3 puta 3
koja za elemente ima samo nule
o Stvaramo matricu veličine 1 x 3
o Stvaramo matricu veličine 3 x 1
Možemo prmijetiti da su svi članovi navedenih matrica tipa float jer smo nakon izbora matrice koristili slovo
'd'. Možemo stvoriti i jediničnu matricu. Ili upisivanjem pojedinačno elemenata liste u polje ili:
o Naredba 'identity' stvara jediničnu matricu
o Matrica je veličine 4 x 4
o Tipovi u njoj su float
Ukoliko želimo odabrati elemente polja između vrijednosti a i b, a ne želimo ih ručno upisivati možemo
koristiti funkciju linspace(a,b):
o Koristeći funkciju linspace stvaramo polje elemenata
koji su između zadanih vrijednosti a i b - linspace (a,b). Rezultat je
nastajanje polja od 50 vrijednosti između zadanih parametara.
o Ukoliko u zagradu upišemo još jedan argument c – linspace(a,b,c) – on određuje od koliko će se
vrijednosti između zadanih parametara sastojati polje
Korištenje linspacea dolazi do izražaja kada želimo crtati funkcije jer nam tada treba dosta vrijednosti
između dva parametra kojima pridružujemo neku drugu vrijednost.
Nacrtati ćemo funkciju sin(x):
o Pomoću linspacea nađemo 50 vrijednosti x
parametra
o Izračunamo sinus od tih vrijednosti
o Pomoću matplotliba crtamo graf funkcije f(x)=sin(x)
Rad s matricama:
o Množimo jediničnu matricu s brojem 0.125
o Dodajemo jediničnoj matrici matricu [1,1],[1,2]
o Množi svaki identitet prve matrice s identitetom druge na istom mjestu
o Operacija dot(matrica1, matrica2) također množi
o [3,4] x [3,4] = 9+16=25
o Korijen(25)=5
Matricama možemo računati inverz (matrica.I), transponirati ih (matrica.T) ili računati determinantu
(matrica.D).
Operacija diag(lista vektora) prima kao argument listu vektora koje raspoređuje po dijagonali.
Funkcija solve(matrica1, matrica2) prima kao argument dvije matrice od kojih se prva sastoji od
elemenata linearne jednadžbe , a druga od vrijednosti iza znaka jednakosti te daje rješenja jednadžbi.
a+b+c=6
2b+5c=-4
2a+5b-c=27
Funkcija eigenvals(matrica) prima kao argument matricu i računa njene svojstvene vrijednosti. Funkcija
eigvalsh(matrica) prima kao argument matricu i računa svojstvene vrijednosti hermitske matrice.
Funkcija eig(matrica) prima kao argument matricu i računa njene svojstvene vrijednosti i svojstvene
vektore. Funkcija eigh(matrica) prima kao argument matricu i vrača svojstvene vrijednosti i svojstvene
vektore Hermitske matrice.
Računanje derivacije funkcije čija je definicija možemo riješiti računajući
funkciju tako da za jednoliko raspoređene točke na x-osi računamo odgovarajuće
točke na y osi.
Računanje derivacije:
o definiramo funkciju
nderiv()
o Dužina y
o Dok je i između 1 i n-1
puni elemente matrice d s
elementima derivacije
o Vraća d
U glavnom programu pokušat ćemo izračunati derivaciju funkcije f(x)=sin(x) ta usporediti dobiveni graf s
f(x)=cosx što znamo da je derivacija sinu
o Stvara argument dsin koji
poziva funkciju nderiv te
joj prosljeđuje argumente
sinx i x
o Stvara graf koji smo dobili
računajući derivacije
numerički (plavi)
o Stvara graf koji bi dobili
analitički (zeleni)
Vidimo da su vrijednosti koje smo dobili skoro pa potpuno točne. Dakle, kad nije potrebna ekstremno velika
preciznost, možemo ovom metodom računati derivacije.
Crtanje svojstvenih funkcija kvantnog harmoničkog oscilatora:
Želimo riješiti jednanžbu kada je potencijal harmoničkog
oscilatora
Koristit ćemo trik da pomnožimo obije strane jednadžbe sa ψ* te intgriramo po x kako bi iz diferencijalne
jednadžbe dobili matricu. Dobivamo: .Ovdije ćemo
opet koristiti aproksimaciju derivacije, ali sada druge . Sada su nam y(i) stanja.
Gledamo druge derivacije y(1), y(2).... ...y(n) te bi trebali dobiti Laplacianovu matricu
za prvi član Schrodingerove jednadžbe. Za drugi član dobivamo dijagonalnu matricu s V(��) dijagonalnim
elementima .
o Definiramo funkciju Laplacijan
o Pretpostavljamo jednoliko rasporedjene
točke
o Dok je i između 1 i n stvara elemente
matrice M
o Vraća M/ℎ�
Nakon što smo stvorili funkciju, možemo ju pozivati iz glavnog programa
Rješenja jednadžbe harmoničkog oscilatora kada su ona Hermitski polinomi:
U Numpyju postoji specijalna funkcija Hermite(argument) koja izračunava Hermitski operator od argumenta.
o Definiramo funkciju ho_evec
o Ako pozovemo funkciju Hermite
o Ona izračunava Hermitski operator
o Kojeg kasnije horistimo u vrijednosti koju vraća funkcija
o Iz glavnog programa pozivamo funkciju ho_evec()
koja aproksimira vrijednosti funkcije harmoničkog
oscilatora
o Izračunavamo vrijednosti koje znamo da bi trebali
dobiti numerički
o Dobivamo dvije krivulje koje se gotovo preklapaju
Možemo koristiti i subplot(a,b,c) funkciju koja dijeli graf na a x b dijelova i stavlja osi na poziciju c. Njome
ćemo odjednom prikazati različita rješenja za harmonički oscilator (n=1,2,3...) na više grafova.
o Crtamo 6 različitih grafova
o Subplotom dijelimo output na 2 x 3 dijela i
svaki put postavljamo koordinatne osi na
početak idućeg dijela
o Računamo funkciju analitički i numerički
te dobivamo približno iste vrijednosti za
mali n
Scipy sadrži još cijeli niz specijalnih funkcija kao što su Airyjeve funkcije, Besselove funkcije, Chebysheovi
polinomi, Legendreovi polinomi i slično.
Ako imamo podatke za koje otprilike znamo po kojoj funkciji se ravnaju, možemo koristiti izradu grafa na
temelju vrijednosti koje imamo. Pretpostavimo da imamo nekakve podatke raw_data
Crtanje grafova kada podaci rastu/padaju po nekoj funkciji:
o Stvara polje data koje se sastoji od naših podataka
o Stvara točke na grafu iz izračunatih podataka
o Vidimo da nastaje graf koji očito raste
eksponencijalno. Ako još k tome
znamo da naši podaci i trebaju rasti
eksponencijalno možemo im izračunati
logaritamske vrijednosti i trebali bi
dobiti pravac
o Uporabom funkcije semilogy dobivamo
logaritamske vrijednosti podataka na y osi
o I zaista je x-y ovisnost pravac
Postoji funkcija polifit() koja prilagođava podatke formi polinoma.
o Prilagođava podatke polinomu prvog
reda
Podatke možemo prilagođavati i drugim funkcijama kao što su polinomi viših redova ili Gaussijan.
U Pythonu postoji funkcija random(). Ona daje random brojeve između 0 i 1 kad ju se pozove.
o Na y-osi bira random brojeve
između 0 i 1, na x-osi ide od 1
do 100
Možemo izračunati broj pi tako da izabiremo random brojeve i računamo koliko se njih nalazi u kružnici
jedinične veličine.
Izračunavanje broja π:
o Računa random
vrijednosti za x
o Računa random
vrijednosti za y
o Jednadžba kružnice
o Zbraja one točke koje
su od središta udaljene za
manje od r (koje su unutar
kružnice)
o Crta točke (x,y) u plavoj boji ako su unutar
bkužnice
o Crta točke (x,y) u crvenoj boji ako su izvan
kružnice
Ideja ovog programa je da se za izračunavanje pi
koristi pretpostavka da je omjer točaka koje završe
unutra spram točaka koje završe van kružnice pi/4 o
čemu pa je zato u naslovu grafa računato:
π= �(�����������������)
�����������������
Želimo izračunati integral to možemo učiniti pomoću sljedećeg
programa:
o Stvara i crta funkciju f(x)=���
o Koristimo funkciju quad(a,b,c) koja
izračunava integral od a u granicama od b
do c koja vraća rezultat i procijenjenu
grešku računa
Ako imamo 'bučne' podatke (noisy data) često koristimo brze Fourijerove transformacije (fast Fourier
transform-fft) nad njima.
Računanje Fourijerovih transformacija:
o Vraća 4000 vrijednosti između
0 i 120 i pridružuje ih t
o Vraća random signale
o abs(fft(argument)-Računa
apsolutnu vrijednost
signala transformiranog
Fourijerovom transformacijom
o fftfreq(n,d)-vraća polje duljine
n koje se sastoji od frekvencija
razmaknutih za d
o crta graf Fourijerovih
transformacija
o crta graf Fourijerovih
frekvencija
Upravljanje podacima:
Korištenje podataka:
o Sve što se u Pythonu nalazi između trostrukih navodnika (''' ili “““) Python tretira kao jedan string
o Koristeći funkciju splitlines() myoutput smo
pretvorili u linije
Informacije iz liste koje nam trebaju da nacrtamo graf su: stupac u kojem pišu energije, Gmax stupac (sadrži
maksimalni gradijent pri svakom koraku) i Walltime stupac.
o Prolazi kroz sve linije osim prve dvije
o Fukncija split() vraća listu riječi u stringu line
o Tu smo listu nazvali words (riječi) iako se radi o
brojevima
o Pridružuje poljima energy, gmax i time vrijednosti
s točno određenog mjesta u stringu words.
Ovo je uredu za ispisivanje podataka, ali da bi nešto s podacima radili oni ne smiju ostati u obliku stringa već
moraju biti u formi brojeva (int, float, double...) jer naši podaci i jesu brojevi.
o To možemo postići koristeći naredbu float()
o Sada imamo numpy polje 'data' koje sadrži informacije koje trebamo. Ako na početku imamo podatke odvojene zarezom,
možemo koristiti sljedeći program:
o Jedan element liste words je sve ono do idućeg zareza
o Koristi funkciju map(tip podatka, string) koja vraća listu argumenata nekog tipa podatka iz words i stavlja ih u polje 'data'
Bez obzira na koji su način podaci bili zapisani sada se nalaze u polju data pa ih možemo dozvati iz memorije i pomoću njih nacrtati graf.
o Ispisujemo podatke iz polja 'data' i
crtamo ih na graf
Sofisticiranije korištenje podataka iz stringova:
o Pisanje %d stvara broj tipa integer
o Pisanje %f stvara broj tipa float
o Pisanje %.4f stvara broj tipa float, ali pokazuje samo prva 4 decimalna mjesta
o Pisanje %e stvara broj puta 10 na neku potenciju
Možemo napisati pismo koje, na primjer, šaljemo svima kojima neki proizvod nije dostavljen na vrijeme.
Forma pisma uvijek je ista, mijenjaju se samo datum, ime kupca i razlog zbog kojeg pošiljka nije stigla na
vrijeme. Kako ne bi morali svaki put pisati pismo ispočetka, možemo napisati sljedeći kod i kod funkcije
print svaki puta izmjeniti samo ove tri stvari.
%s ispisuje string
Upotrijebili smo %(ono što fali)s, a ne samo %s zato što u ovom slučaju ne treba pamtiti redosljed stvari
koje fale nego je u funkciji print dovoljno napisati “ono što fali“:“ono što treba pisati“
Možemo definirati i funkcije koje koriste nepoznat broj argumenata. To možemo činiti pomoću **kwargs ili
*args. Načelno, nakon zvijezdica može stajati bilo što (bitno je samo da li je jedna zvijezdica ili su dvije) , ali
najčešće se koriste ova dva naziva.
**kwargs –keyword argument koji uzima bilo koji dodatni argument dan funkciji i upisuje ga u
riječnik naziva kwargs. Kasnije u programu pozivamo ga metodom get() koja vraća vrijednost za
dani ključ
*args – argument koji uzima bilo koji dodatni argument dan funkciji i upisuje ga u listu naziva args
Korištenje argumenta kwargs:
o Definiramo funkciju my_linspace koja osim
ostalih argumenata koristi **kwargs
o Pretvaramo ključ iz kwargs riječnika u
vrijednost
o Punimo izračunate vrijednosti u polje v koje
se vraća u glavni program
o Pozivamo funkciju u glavnom programu i
prosljeđujemo joj argument False za endpoint
što znači da neće ispisati zadnju vrijednost (1)
o Output programa je lista između 0 i 1 od 5
elemenata od kojih zadnji nije 1
„List comprehensions“ i „generatori“:
List comprehension – Način stvaranja liste. Večinom izgledaju kao liste, ali s malo logike u njima.
Generator – Deklarira funkciju koja se ponaša kao iterator .
Iterator – Radi slijed objekata. Kako ne bi morali prolaziti brojačem kroz svaki pojedini element liste
koristimo iterator. Oni se koriste kako bi se ubrzao kod.
Stvaranje liste parnih brojeva:
o Udvostručava brojač i dok je on između 0 i 10
o Te ispisuje parne brojeve do 10
Srvaranje liste neparnih brojeva:
o Ostatak dijeljenja brojača i sa 2 je 1 ako je i neparan, pregledava za prvih 20 brojeva
o Dobivamo listu neparnih brojeva između 0 i 20
Ispisivanje parnih brojeva pomoću iteratora:
o stvara funkciju evens_below()
o Ona koristi xrange(n) što je iterator
od funkcije range(n) koja generira
listu od n vrijednosti
o Vraća parne brojeve
o Ispisuje parne brojeve do 9
o Od brojeva uvijek možemo napraviti listu koristeći list()
Korištenje generatora:
o Pozivamo funkciju
evens_gen koja se
ponaša kao iterator
Factory funkcije:
Factory funkcija – funkcija koja vraća funkciju jer je funkcija unutar funkcije
Crtanje Gaussijana pomoću factory funkcije:
o Stvaramo funkciju gauss_marker koja prima 3
argumenta
o Unutar nje stvaramo funkciju f koja vraća vrijednost
gaussijana
o Iz gauss_markera vraćamo vrijednost funkcije f
o g je funkcija gauss_marker(visina,širina,
centar)
koja vraća različite vrijednosti f
o crtamo graf
(vrijednosti između 0 i 1,g(od tih
vrijednosti) )
„Serialization“- spremanje za kasnije:
Serialization- ispisivanje podataka ili funckija u nekakvu bazu podataka kako bi podatak mogli
koristiti kasnije u programu
Program sprema tekst u memoriju:
o Imamo podatke koji se zovu json_data
o Koristimo json.loads () funkciju kako bi napunili podatke u memoriju
o Koristimo json.dumps() funkciju kako bi ispisali podatke
Funkcionalno programiranje:
Lambda –operator kojim se služimo umjesto da definiramo funkciju. Pomoću nje možemo drugim
funkcijama prenositi funkcije kao argumente
Map() –opetovano primjenjuje funkciju na listu
Sum() –zbraja elemente liste
Korištenje lambda:
38
Korištenje map:
Korištenje sum:
15
Objektno orijentirano programiranje:
Objektno orijentirano programiranje daje nam alate da sami deklariramo objekte i metode.
Ubrzavanje koda u Pythonu:
Najbolje je ne ubrzavati izvršavanje koda jer računalo računa dosta brzo, a pogotovo programe koje će
profesori najvjerojatnije koristiti. Ako smo sigurni da kod ipak treba optimizirati koristimo naredbe iz math
modula:
Timeit- govori nam koliko vremena treba računalu da nešto napravi
Profiling- pomoću njega možemo razumjeti na što točno program troši vrijeme
Ubrzati kod možemo i korištenjem swing, cython i PyPy metode, ali njih se ne ćemo doticati.
Korištenje timeit:
o Funkcija factorial koju smo sami napisali 100 je puta sporija od funkcije fact koju sadrži sam Python
Korištenje profiling:
o Poziva cProfile.run(a)- želimo vidjeti na
što funkcija a u argumentu troši
vrijeme
o Vidimo da poziva 4 funkcije u 0.36
sekundi
o Možemo vidjeti i koliko je puta
pozvana koja funkcija, koliko je poziv
trajao, koliko je svaki poziv trajao, kojoj
datoteci je pristupljeno i slično
Literatura:
http://nbviewer.ipython.org/gist/rpmuller/5920182
http://stackoverflow.com/
http://docs.scipy.org/
http://docs.numpy.org/
http://docs.python.org/
Seminar pripremila i napisala: Iva Vrsaljko, PFI
Recommended