You are on page 1of 93

Scilab

Scilab
Jurica Peri

1 / 93

Scilab

Sadraj
1 Uvod
Mogunosti Scilaba

2 Matrice
3 Graka
4 Funkcije, naredbe grananja i petlje
Funkcije
Naredbe grananja i petlje

5 Specijalni tipovi podataka

2 / 93

Scilab
Uvod

Scilab
Scilab (SCIentic LABoratory) je alat za numeriko raunanje.
Omoguava:
izvoenje kompleksnih prorauna
vizualizaciju rezultata
izvoenje simulacija
programiranje
Scilab ima vlastiti (interpretirani) programski jezik visokog
nivoa koji je jednostavan za koritenje i upotrebljava
standardiziranu matematiku sintaksu.

3 / 93

Scilab
Uvod

Korisniko suenje
Dijelovi korisnikog suelja:
console - interaktivna konzola u koju unosimo naredbe i u
njoj vidimo rezultat tih naredbi. Otvara se samim
pozivanjem Scilaba. Ispred unijete naredbe se nalazi

-->,

sve ostalo su rezultati koje vraa Scilab. Izraz se evaulira


pritiskom na tipku

Enter

editor - za pisanje skripti (sauvamo ih sa ekstenzijom

sce).

Otvara se pritiskom na prvu ikonicu u ToolBaru (Launch


SciNotes) ili sa

Applications->SciNotes

prozor za graku - otvara se izvravanjem neke od narebi za


crtanje grafove (Plot,

Plot3d, Surf, ...)


x = 0 : %pi/100 : 2*%pi; y = sin(x);
plot(x, y)
4 / 93

Scilab
Uvod

Help
Scilab dolazi sa jako iscrpnim Helpom. Helpu pristupamo sa

MenuBar->?->ScilabHelp/ScilabDemonstrations/...,
pritiskanjem zadnje ikonice na ToolBaru ili naredbom help
konzoli. U ScilabHelp-u koristimo TableOfContents za
cjelokupan sadraj, ili Search ako traimo informacije o

pojedinoj naredbi.
Osim toga, informacije o nekoj naredbii (sa eventualnim
primjerima) su dostupne iz konzole naredbom

help ime_funkcije.
Opcija ScilabDemonstrations

nam daje primjere za veinu

funkcija i naredbi.

?->ScilabHelp->TableOfContents->ElementaryFunctions
daje popis svih ugraenih funkcija.

?->ScilabHelp->TableOfContents->Console->Console
popis svih skraenica na tipkovnici.

daje

5 / 93

Scilab
Uvod
Mogunosti Scilaba
Pridruivanje se vri pomou operatora

=.

Primjer

a // greska
a=5; b=7;
a*b
a^2
a/b
c=sqrt(d) // greska
c=sqrt(a)
d=exp(a)
(c+d)^5
cos(%pi/2) // primijetimo, nije 0
Varijabli mora biti pridruena vrijednost (inae se javlja greka,

Scilab

ne podrava simboliko raunanje).

Ako se rezultat naredbe ne pridjeljuje nekoj varijabli, Scilab ga


pridjeljuje varijabli

ans.

6 / 93

Scilab
Uvod
Mogunosti Scilaba

Slaba tipiziranost
Scilab je slabo tipiziran jezik. Nije potrebno deklarirati kojeg
tipa e biti varijable, pojedine varijable mogu mijenjati svoj tip
u hodu:

a = [1 2 3; 4 5 6; 7 8 9]
a = 'neboder'
a.element = 123
Kada

Scilab

naie na pridru ivanje vrijednosti varijabli,

automatski se kreira ta varijabla i alocira se spremnik prikladne


veliine. Ako varijabla ve postoji,

Scilab

joj promijeni sadraj

i, ukoliko je potrebno, alocira novi spremnik.

7 / 93

Scilab
Uvod
Mogunosti Scilaba

Matrice
Primjer

-->A =[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];


-->B=[1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4];
-->A + B
-->A - B
-->A*B // obicno mnozenje matrica
-->A.*B // Hadamardovo mnozenje matrica
-->A.^B
-->inv(A)
Ukoliko elimo u istom unosu imati vie naredbi, odvajamo ih
zarezom ili sa

;.

Ukoliko elimo da se naredba izvri, ali da se

ne prikae rezultat, na kraj naredbe stavimo

;.
8 / 93

Scilab
Uvod
Mogunosti Scilaba
Unesimo prethodni primjer, ali koristei editor (kreirajmo
skriptu).
Skriptu izvravamo iz samog editora (iz ManuBara

Execute

izaberemo jednu od tri opcije izvravanja) ili iz ToolBara


pritiskom na ikonicu

Execute

(ili

Save&Execute)).

U konzoli se

prikae da je izvren niz naredbi iz skripte. Skriptu moemo


izvriti i iz konzole naredbom

exec ime_skripte.sce

(paziti da

je skripta u trenutnom direktoriju (pogledati sa

CurrentDirectory), ako nije promijeniti


opcijom ChangeCurrentDirectory).

trenutni direktorij sa

9 / 93

Scilab
Uvod
Mogunosti Scilaba

Graka

Unesimo u konzoli:
Primjer

x = 0 : %pi/100 : 2*%pi; // bez prikaza na ekranu


y = sin(x);
plot(x, y)
// Dodajemo oznake na osi i na sam graf,
// koristimo:
xlabel('x = 0 : 2/pi') // x os
ylabel('Sinus od x') // y os
title('Graf funkcije sinus', 'FontSize', 8) // graf
Otvara se poseban prozor za prikaz grake.
Komentar se unosi iza

// (sve u retku iza // Scilab zanemaruje).


10 / 93

Scilab
Uvod
Mogunosti Scilaba
Tri funkcije na istom grafu uz promjenu linija grafa.
Primjer

x = 0 : %pi/100 : 2*%pi; // domena za sve tri funkcije


y = sin( x );
y2 = sin( x - 1 );
y3 = sin( x - 2 );
plot( x, y, 'o', x, y2, 'x', x, y3, '<')

11 / 93

Scilab
Uvod
Mogunosti Scilaba

Crtanje funkcije vie varijabli


Primjer

help linspace;
x1 = linspace(-5, 5, 100);
y1 = linspace(-10, 10, 100);
[X, Y] = meshgrid(x1, y1);
Z = X.^2 + Y.^2;
mesh(X, Y, Z)

12 / 93

Scilab
Uvod
Mogunosti Scilaba

Funkcije

Moemo denirati funkcije (korisniki denirane funkcije, eng.


user dened functions). Npr. elimo denirati funkciju koja
prima dva argumenta, te ih mnoi. Druga funkcija isto prima
dva argumenta, ali vraa jednoretanu matricu (dva elementa u
retku). Funkcije moemo denirati ili u editoru ili (posebno ako
su jednostavije) u samoj konzoli.
Primjer

function y=f(a, b);y= a*b; end function


f(5, 7)
function y=g(a, b); y = [a + b a*b]; endfunction
g(7, 2)

13 / 93

Scilab
Uvod
Mogunosti Scilaba

Petlje

Kreirajmo skriptu koja provjerava da li je unijeti broj paran ili


neparan. Nakon izvrenja skripte, u konzoli unosimo broj.
Primjer

x=input('Unijeti broj:');
if modulo(x,2)==0 then
disp('Broj je paran.');
else
disp('Broj je neparan.');
end
Funkcija
Funkcija
Funkcija

input slui za interaktivni rad.


modulo vraa ostatak prilikom dijeljenja.
disp ispisuje stringove (nizove znakova unutar

navodnika).

14 / 93

Scilab
Uvod
Mogunosti Scilaba
Kreirajmo iduu skriptu.
Primjer

x=input('Unesite broj:');
select x
case 1
disp ("Jedan")
else
disp ("Broj razlicit od jedan")
end

15 / 93

Scilab
Matrice

Matrice
Matrice su u Scilab okruenju denirane sa brojem redaka,
brojem stupaca, te tipom podataka koje unosimo u matricu
(tipovi se ne smiju kombinirati). Skalari ne postoje u Scilabu,
oni se predstavljaju sa

11

matricama. Matrice sa jednim

stupcem ili retkom zovemo vektori (stupani, retani).


Unosimo ih na dva osnovna naina:
eksplicitan unos elemenata. Unos matrice poinje sa
otvorenom uglatom zagradom ([), te zavrava sa

zatvorenom uglatom zagradom (]). Stupci se odvajaju sa

razmakom ili zarezom, a prelazak u novi redak se dobiva


znakom

(ili sa

Enter

bez

;)

generiranje matrice koritenjem ugraenih funkcija (eng.


built-in functions)

16 / 93

Scilab
Matrice

Operacije sa matricama
Pretpostavimo da smo kreirali matricu

m n.

reda

Ako elimo dohvatiti element matrice u i-tom retku i j-tom


stupcu, izraz je

A(i, j).

Ako elimo dohvatiti cijeli k-ti stupac, izraz je

A(:, k).
Ako elimo dohvatiti cijeli k-ti redak, izraz je

A(k, :)

A(1:m, k)

A(k, 1:n)

ili

ili

Ako elimo promijeniti vrijednost pojedinog elementa matrice


(na vrijednost k), koristimo izraz

A(i, j) = k.

Ako elimo izbrisati k-ti redak (stupac) matrice A, izraz je

A(k, :)=[] (A(:, k)=[]).

17 / 93

Scilab
Matrice

ones(i, j) nam daje matricu reda i j sa svim elementima 1.


zeros(i, j) nam daje matricu reda i j sa svim elementima 0.
eye(i, j) nam daje matricu reda i j sa jedinicama na
glavnoj dijagonali (ostali elementi 0)
Konkatenacija je spajanje vie manjih matrica u jednu veu.
Primjer

redak = [0 : 2 : 20] . . . dobivamo retani vektor


stupac = linspace(1, 10, 10)' . . . dobivamo stupani vektor
ones(3, 5); eye(3, 3)
A = eye(2, 5)
A(:, 3) = [5 7] // greska
A(:, 3) = [5 7]'
A = [1 2 3; 4 5 6]; B = [1 3 5; 1 1 1]
C = [A B], D = [A; B]
18 / 93

Scilab
Matrice
Determinantu matrice A dobivamo sa
Inverz matrice A dobivamo sa

inv(A)

det(A).
(sami trebamo paziti da

je matrica invertibilna).

sum(A) daje sumu svih elemenata matrice A.


sum(A, 'r') (sum(A, 'c') daje sumu po stupcima
Izraz

(retcima)

matrice A.
Izraz mean(A) daje srednju vrijednost svih elemenata matrice
mean(A, 'r') (mean(A, 'c') daje srednju vrijednost po

A.

stupcima (retcima) matrice A.

size(A) daje broj redaka i stupaca matrice A.


length(A) daje ukupan broj elemenata u matrici A.
Izraz diag(A) daje glavnu dijagonalu matrice A.
Izraz matrix(A, i, j) pretvara matricu A u matricu sa i
redaka i j stupaca (length(A) mora biti i*j).
Izraz
Izraz

19 / 93

Scilab
Matrice

Primjer

A = [1 2 3; 4 5 9]
det(A) // greska, matrica nije kvadratna
A = [1 3 5 7
8 2 9 -5
-2 -1 6 20
1 4 -5 -3]
det(A)
B = A(2:3, 1:2) //
sum(A)
sum(A, 'c')
min(A) // minimalni element matrice
[vrijednost pozicija] = min(A) // na prvo mjesto se
// vraca minimalni element, na drugo pozicija
// minimalnog elementa
20 / 93

Scilab
Matrice

Operatori
+, -, *, ^

. . . standardni operatori sa matricama

Ako imamo toku

prije standardnih operatora, onda se

operacije obavljaju "po elementima"

' . . . konjugiranje i transponiranje


.' . . . transponiranje
A/b (A\b) . . . A b1 (A1 b)
Primjer

A=[1 2 3; 4 5 6; 1 + 2*%i 2 + 3*%i 7]


A'
A.'
B=[3 4 2; -1 -2 -7; 4 1 3]
A + B
%i

je imaginarna jedinica, tj.

a + b * %i

je kompleksni broj.

21 / 93

Scilab
Matrice

nd(), gsort(), unique()


Primjer

A=[1, -5, 6, 10; 6, 1, -90, 8; 1, 2, 3, 4;


9, 8, 7, 6; 6, 1, -90, 8]
gsort(A) // padajuci poredak
gsort(A, 'g', 'i') // rastuci poredak
gsort(A, 'r', 'i') // rastuce po stupcima
gsort(A, 'c', 'i') // rastuce po retcima
find(A < 9) // elementi manji od 9 stupac po stupac
find(A == 9)
find(A ~= 6)
unique(A) // razliciti elementi matrice
unique(A, 'r') // razliciti retci matrice
Ukoliko je matrica kompleksna, sortiranje se vri po apsolutnoj
vrijednosti.

22 / 93

Scilab
Matrice

Usporedba matrica
Rezultat usporedbe matrica je matrica booleanova.
Primjer

A = [1 2 3; -1 -2 -3; 7 8 9]
B = [3 0 0; 4 5 6; -3 -4 -5]
A > 0
B < 10
A > B
A < B
(A < B) | (A > B)

23 / 93

Scilab
Matrice

Boolean
Boolean varijable mogu imati vrijednost tono (true) ili
pogreno (false). True se u Scilabu unosi sa

%f

ili

%F.

%t

ili

%T,

a false sa

Boolean vrijednosti dobivamo najee kao rezultat

operatora usporeivanja.

& (logiko i), | (logiko ili), ~ (negacija), ==


~= (nejednakost), te <, >, <=, >=.

Operatori su:
(jednakost),
Primjer

a
b
c
d
c
c

=
=
=
=
&
|

1
2
(a == b)
(a ~= b)
d
d
24 / 93

Scilab
Matrice

Zadatak
Primjer (Matrica)

Napiite funkciju koja kao ulazne varijable prima dvije matrice,


A i B . Ako matrice A i B nisu istog reda, napisati takvu
obavijest i vratiti praznu matricu
C . Ako su istog reda, kreirajte

novu matricu C t.d. C =

1 , aij < bij


0 , aij = bij

1 , aij > bij

Primjer (Suma)

Napiite skriptu koja trai da upisujete brojeve sve dok im je


zbroj manji od 200. Upisane brojeve spremati u vektor. Ako je
unijeti broj brojeva paran, vratiti ih kao retani vektor, inae kao
stupani vektor.
25 / 93

Scilab
Graka

Plot
Osnovna funkcija za crtanje funkcije jedne varijable je

Plot.

Primjer

x = 0 : %pi/100 : 2*%pi;
y = sin(x);
plot(x, y)
Ako elimo dodati oznake na osi i sam graf (tu smo i poveali
slova), koristimo:
Primjer

xlabel('x = 0 : 2*pi')
ylabel('Sinus od x')
title('Graf funkcije sinus', 'FontSize', 6)
26 / 93

Scilab
Graka

Vie funkcija na istom grafu


Primjer

x = 0 : %pi/100 : 2*%pi;
y = sin( x );
y2 = cos( x );
y3 = - sin( x );
plot( x, y, x, y2, x, y3)
Vidimo da se razliitim funkcijama pridruuju razliite boje.
Kod grafa moemo i sami mijenjati boju linije (tj. markera za

"b" = plava (po defaultu), "k" = crna,"r" = crvena, "g"


zelena, "c" = cyan, "m" = magenta, "y" = uta, "w"= bijela.

graf ):
=

Primjer

plot( x, y, 'y', x, y2, 'm', x, y3)


27 / 93

Scilab
Graka
Stil markera za graf po defaultu su toke (spojene linijom). Stil
markera moemo mijenjati sa:

".", "+", "o", "x", "*", "s", . . .


Moemo mijenjati i stil linije: - (po defaultu), --, :, -.
Ukoliko speciciramo marker bez stila linije, prikazuju se samo
markeri.
Funkcija koju elimo nacrtati ne mora biti denirana prije
naredbe

plot.

Primjer

x=linspace(-5, 5, 100)
plot(x, x^2 - x)
plot(x, x^2 - x, ":")
plot(x, x^2 - x, ".-")
Kada crtamo novi graf, po defaultu se stari graf ne brie, nego
se samo novi graf dodaje starom. Ukoliko elimo izbrisati
prethodno kreirane grafove koristimo naredbu

clf().

28 / 93

Scilab
Graka
Nacrtajmo graf iste funkcije, ali sa razliitim domenama
(smanjimo broj toaka)
Primjer

x1 = 0 : %pi/100 : 2*%pi;
x2 = 0 : %pi/10: 2*%pi;
plot(x1, sin(x1), ':k', x2, sin(x2), '+r')
Moemo crtati i toku i niz toaka.
Primjer

plot(5, 2, "*k")
plot([1, 2, 3, 2], [5, 3, 7, 2])
\\po defaultu markeri su spojeni
plot([1, 2, 3, 2], [5, 3, 7, 2], ".r")
x=linspace(1, 100, 10);
plot(x, "<c")
29 / 93

Scilab
Graka

Naredba subplot
Naredba

mn

subplot(m, n, p)

particionira prozor za graku na

polje manjih slika, a trenutni plot je

p-ti

(brojimo ih

redak po redak).
Primjer

x = 0 : %pi/100 :
y = sin( x );
z = cos( x );
u = x.^2;
v = x;
subplot(2, 2, 1);
subplot(2, 2, 2);
subplot(2, 2, 3);
subplot(2, 2, 4);

2*%pi;

plot(x,
plot(x,
plot(x,
plot(x,

y)
z)
u)
v)
30 / 93

Scilab
Graka

Funkcije dvije varijable


Za crtanje funkcije dvije varijable, prvo generiramo matrice X i
Y koje e nam predstavljati domenu funkcije. Zatim koristimo
X i Y za evaluaciju i crtanje grake.
Primjer

x1 = linspace(-5, 5, 100);
y1 = linspace(-10, 10, 100);
[X, Y] = meshgrid(x1, y1);
Z = X.^2 + Y.^2;
mesh(X, Y, Z)
Jednoliku boju grafa biramo sa:

mesh(X, Y, Z, 'EdgeColor', 'green').


Ako elimo mijenjati boju grafa s obzirom na razinske krivulje,
koristimo

surf(X, Y, Z).
31 / 93

Scilab
Graka

Primjer (Plot)

Napisati skriptu u kojemu crtate (na istom grafu):


funkciju f (x) = log(x + 3) + ex crvenom bojom,
isprekidanom linijom
funkciju g(x) = x4 x2 + 1 plavom bojom, promijeniti
debljinu linije

funkciju h(x) = 3 x + 2 zelenom bojom


Primjer (Tangenta)

Napisati funkciju koja kao argumente prima fukciju, domenu i


toku t0 . Crta funkciju, te tangentu i normalu na graf te
funkcije u toki t0 .

32 / 93

Scilab
Graka

Primjer (Crtanje)

Kreirajte funkciju koja prima kao argumente funkciju i dva cijela


broja a i b. Funkcija generira vrijednosti funkcije u svim cijelim
brojevima od a do b, te crta dobivene vrijednosti na grafu.

33 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Kako kreirati korisniki deniranu funkciju ("user dened
function")?
Deniciju funkcije (koristei odgovarajuu sintaksu) unosimo u

Editor

i spremamo kao skriptu. Kada izvrimo skriptu, funkciju

(ukoliko je globalna) moemo koristiti u konzoli i u drugim


skriptama.
Denicija funkcije ima sintaksu:

function [a1, a2, ...] = ime_funkcije(b1, b2, ...)


tijelo funkcije
endfunction
Naredbe unutar funkcije odvajamo sa

;,

sa zarezom ili sa

prelaskom u novi redak.

a1, a2, ...


b1, b2, ...

su izlazne vrijednosti koje vraa funkcija.


su ulazni argumenti koje prima funkcija.

Funkcija se poziva sa

ime_funkcije

vrijednostima unutar oblih zagrada.

i odgovarajuim

34 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Primjer

function A = povrsina_trokuta(a, b, c)
// Funkcija povrsina_trokuta racuna povrsinu trokuta
// sa stranicama a, b i c
p = (a + b + c)/2
A = sqrt(p*(p-a)*(p-b)*(p-c))
endfunction
Sada skriptu moemo izvriti ili iz Editora ili iz konzole, te
pozvati

povrsina_trokuta(3, 4, 5).

Dobra praksa je pisati to vie komentara prilikom denicije


funkcije.

35 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Moemo kreirati i funkciju koja ne vraa izlazne vrijednosti.
Primjer

function grafika(x, y)
// funkcija samo crta funkciju y na domeni x
plot(x, y)
endfunction
Funkcija ne vraa izlazne vrijednosti, rezultat je graka. Nakon
izvrenja skripte, u konzoli pozovemo:

a=[-2: 0.1: 5];


b=a^2;
grafika(a, b)

36 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Razlikujemo lokalne i globalne funkcije. Lokalne funkcije su
ugnjeene u skriptu i samo ih ona moe koristiti. Globalne
funkcije su dostupne bilo kojoj skripti (skripta koja je sadri
mora biti izvrena).
Primjer

function y = vanjska( x )
a = 2*x
function y = unutarnja(x)
y = 3*x
endfunction
y = unutarnja(a)
endfunction
U ovom sluaju

vanjska

je globalna funkcija, a

unutarnja

je

lokalna funkcija. Unesimo u konzoli:

vanjska(5); unutarnja(5).
37 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Primjer

function y = vanjska( x )
a = 2*x
y = unutarnja(a)
endfunction
function y = unutarnja(x)
y = 3*x
endfunction
vanjska i unutarnja su globalne funkcije.
vanjska(5); unutarnja(5).
Naredba whereami() nam vraa cijelo ugnjeenje u trenutku
pozivanja. Ubacite je prije endfunction funkcije unutarnja.

U ovom sluaju i

Unesimo u konzoli:

38 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije

de()

deff()

nam slui za deniranje jednostavnih funkcija.

Sintaksa je:

deff ('y = ime_funkcije(b1,b2, ...)', 'y=izraz').


Primjer

deff('y = f(x)','y = x^5')


function y = g(x); y = x^5; endfunction
I u prvom i u drugom sluaju smo denirali istu funkciju, ali na
razliiti nain.

39 / 93

Scilab
Funkcije, naredbe grananja i petlje
Funkcije
Primjer

function y = g(x);
y = x^5;
endfunction
Ponovo smo denirali istu funkciju.
Ako elimo cijelu funkciju denirati u konzoli bez prelazaka u
idui redak, iza svake naredbe stavimo
Unutar funkcije naredba

return

ili zarez.

znai automatski izlazak iz

funkcije (obino se koristi kada nastavak izvrenja funkcije nije


potreban ili nije mogu).

40 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
U Scilabu su nam dostupne standardne naredbe za grananje i
petlje:

if
select
for
while

41 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje

If naredba
if

naredba (grananje) nam omoguava da se izvrava neki niz

naredbi sve dok je ispunjen odreeni uvjet (tj. sve dok vraa
boolen true).

if

naredba zavrava sa

end.

Sintaksa je:

if uvjet_1 then
naredba_1;
...
elseif uvjet_2 then
naredba_2;
...
else
naredba_4;
...
end

42 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
Unesite u

Editor:

Primjer

x = input('Unesite prvi broj:');


y = input('Unesite drugi broj:');
if clean(abs( x - y ))==0 then
disp('Brojevi x i y su preblizu')
else
z = 1 / ( x - y );
disp(z)
end
Izvrite za oba sluaja (kada su unijeti brojevi preblizu i kada
nisu preblizu).

43 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
Naredbe odvajamo sa

;.

Primjer

broj = input('Unesite broj: ');


if broj < 0 then
disp('Broj je negativan');
disp(broj*(-1))
elseif broj > 0 then
disp('Broj je pozitivan');
disp(broj)
else
disp('Broj je jednak nuli');
end

44 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje

Select naredba
Naredbu

select

(grananje) koristimo samo ako

uvjet

koji

provjerava postie konaan (mali) broj stanja. Ne moemo ga


koristiti ako je uvjet da je stanje vee ili manje od neega.

select uvjet
case 1
naredba1;
...
case 2
naredba2;
...
else
naredba;
...
end
45 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
Primjer

broj = input('Unesite broj od 1 do 3: ');


select broj
case 1
disp('Unijeti broj je 1');
disp(broj*10)
case 2
disp('Unijeti broj je 2');
disp(broj*10)
case 3
disp('Unijeti broj je 3');
disp(broj*10)
else
disp('Unijeti broj nije ispravan!')
end
46 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje

For naredba
for

naredba (petlja) nam omoguava da se neka naredba ili niz

naredbi izvrava vie puta, tj. sve dok ne proe po svim


zadanim vrijednostima. Vrijednosti po kojima prolazi petlja se
obino zadaje u obliku retane matrice.

for brojac = matrica_vrijednosti


naredba1;
...
end

47 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
Primjer

data=[3 9 45 6 7 16 -1 5];
for n = data
disp(n)
end
data=[3 9 45 6; 7 16 -1 5];
for n = data
disp(n)
// primijetimo u kojem poretku
// se ispisuju elementi matrice
end

48 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje

While naredba
while
uvjet

naredba (petlja) omoguava izvravanje petlje sve dok se


evaulira u boolean vrijednost

uvjet
while uvjet
naredba1;
Kada se

evaulira u

false,

true.

petlja se prekida.

...

end
Primjer

suma=0; br=0;
while suma < 200
br = br+1;
a(br) = input('Upisi broj:')
suma = suma + a(br);
end
disp(a, br)

49 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje

Break i continue
break

naredba:

doputa raniji izlazak iz


ili iz

if ... end

for ... end

ili iz

izvravanje se nastavlja od idue naredbe

while ... end

end

kod ugnjeenih petlji izlazi samo iz petlje u kojoj se nalazi


(najunutarnija petlja)

continue

naredba:

continue omoguava nasilan povratak na poetak


for ... end ili while ... end petlje (ne i if ... end)
naredbe izmeu continue i naredbe end na kraju petlje se
ne izvravaju

50 / 93

Scilab
Funkcije, naredbe grananja i petlje
Naredbe grananja i petlje
Primjer (Djeljivost)

Napiite skriptu koja od korisnika trai da upisuje brojeve sve


dok ne upie broj djeljiv sa 7. Ispisuju se svi unijeti brojevi i
koliko je brojeva upisano.
Primjer (Djelitelji)

Kreirajte funkciju koja kao ulaznu varijablu prima prirodni broj,


te ispisuje sve djelitelje unijetog broja.

51 / 93

Scilab
Specijalni tipovi podataka

type i typeof nam vraaju koji je tip neke varijable.


type vraa broj koji nam govori kojeg je tipa varijabla,
typeof nam vraa string ("constant", "string", . . . ).

Funkcije

Naredba
a

Osnovne vrste varijabli su:

type typeof

tip varijable

1
2
4
8
10
11
13
15

matrica

"constant"
"polynomial"
"boolean"
"int8", "int16", ...
"string"
"function"
"function"
"list"

polinom
boolean
matrica integera
string
nekompajlirana funkcija
kompajlirana funkcija
lista

52 / 93

Scilab
Specijalni tipovi podataka

Stringovi
U Scilabu,

string

je bilo koji niz znakova koji se nalazi unutar

jednostrukih ili dvostrukih navodnika.


Stringove spremamo u matrice na standardni nain (ukoliko
imamo samo jedan string, matrica je
Naredba
Naredba

1 1).

size vraa dimenzije matrice sa stringovima.


length vraa matricu broja znakova u svakom

stringu

matrice.

string(izraz) nam konvertira izraz u string.


Naredba strcmp nam slui za usporedbu stringova.
Naredba blanks kreira string praznih znakova.

53 / 93

Scilab
Specijalni tipovi podataka

isdigit provjerava da li su znakovi u stringu integeri


1 i 9 (isletter, isnum, . . . ).
Naredba isreal ima dvije sintakse. Ako stavimo samo
isreal(izraz), vraa da li je izraz realan broj. Ako stavimo
isreal(izraz, 0) vraa da li je izraz realan broj do na

Naredba
izmeu

apsolutnu vrijednost imaginarnog dijela.


Naredba

strcat

slui za konkatenaciju stringova.

54 / 93

Scilab
Specijalni tipovi podataka

Primjer

stringovi = ["abcde " "12345" "1a2b3c4d" "stan"]


size(stringovi)
length(stringovi)
typeof(stringovi)
type(stringovi)
strcat (["a" "b" "c" "d" ],", pa ")
strcat (stringovi," ")
strcmp ("a","b")
strcmp ("a","a")
strcmp ("b","a")
isdigit ("abcde")
isletter ("abcde")
isdigit ("123452.3")
isletter("123452.3")
55 / 93

Scilab
Specijalni tipovi podataka

Polinomi
Polinomi se u Scilabu zadaju na dva naina, ili zadavanjem
nul-toaka polinoma ili zadavanjem njihovih koecijenata.
Pomou nultoaka se zadaje sa:

poly(matrica_nultocaka, "nepoznanica").
Pomou koecijenata se zadaje sa:

poly(matrica_koeficijenata, "nepoznanica", "coeff ").


Vrijednosti polinoma u toki se raunaju sa

horner(polinom, matrica_tocaka).
Naredba spec nam vraa svojstvene vrijednsoti

polinoma.

Kada podijelimo dva polinoma, rezultat je racionalna funkcija.

56 / 93

Scilab
Specijalni tipovi podataka

Primjer

pol1 = poly([1 1], "x")


roots(pol1)
pol2 = poly([1 -2 1], "y", "coeff")
pol1 + pol2 // greska
pol2 = poly([1 -2 1], "x", "coeff")
pol1 + pol2
pol1 - pol2
pol2 = poly([1 3 2 4], "x", "coeff")
a = pol1/pol2
typeof(a)
pol3 = poly([1+2*%i 1 - 2*%i 0 1], "x")
// mogu i kompleksni korijeni
roots(pol3)

57 / 93

Scilab
Specijalni tipovi podataka

Hipermatrice
Matrica je imala odreeni broj redaka i odreeni broj stupaca, a
pojedinim elementima smo pristupali sa dva indeksa (prvi za
redak, drugi za stupac).
Hipermatrica je generalizacija matrica, elementima pristupamo
sa vie od dva indeksa.

hypermat(matrica_dimenzija)

kreira hipermatricu sa svim

elementima nula.

zeros(dimenzije) kreira matricu sa svim elementima nula.


ones(dimenzije) kreira hipermatricu sa svim elementima
jedan.
Kao i kod matrica, svi elementi hipermatrice moraju biti istog
tipa.

58 / 93

Scilab
Specijalni tipovi podataka

Primjer

A= hypermat([4 ,3 ,2])
A (3 ,1 ,2)=7
A(:, 1, 2)
B=2 * ones (4 ,3 ,2);
A + B
hypermat ([2 3 2] ,1:12)
// ret\v{c}ani vektor se prema kao hipermatrica
// vrijednosti se spremaju po stupcima
A(1, 1, 1) = "abcd" // greska

59 / 93

Scilab
Specijalni tipovi podataka

Liste
Lista je tip podatka koji obino koristimo za spremanje (i rad sa
njima) podataka razliitog tipa. Lista moe sadravati bilo koji
tip podatka (ukljkuujui funkciju), pa tako i samu listu
(ugnjeene liste).

list
null
lstcat
size

kreiranje liste
brisanje elementa liste
konkatenacija listi
broj elemenata liste

60 / 93

Scilab
Specijalni tipovi podataka

Primjer

broj1 = 12345;
string1 = "znakovi"
mat1 = [1 2 3 4; 5 6 7 8]
lista1 = list(broj1, string1, mat1)
type(lista1)
typeof(lista1)
lista1(1)
lista1(2)
lista1(3)
size(lista1)
[s1 s2 s3] = lista1(1:3)
s3(7)
lista1(3)(7) \\ dobijemo isto kao u prethodnoj naredbi,
ali je puno elegantnije i "jeftinije"
61 / 93

Scilab
Specijalni tipovi podataka

Struct
struct

je tip podatka koji moe imate podatke razliitih tipova

(koje zovemo poljima), koji nisu ureeni (ne pristupa im se sa


rednim brojem, nego sa njihovim imenom). Varijabli
pridruujemo tip podatka koristei naredbu

struct.

struct dohvaamo sa imenom varijable iza kojih


., te ime polja koje elimo dohvatiti. Na taj nain
moemo i promijeniti vrijednost nekog polja struct.
Moemo kreirati i ugnjedene struct, to jest struct koja sadri
neke druge struct.
Elemente

stavimo

62 / 93

Scilab
Specijalni tipovi podataka

Primjer

student= struct ("ime" , "Pero","grad", " Omis ",


"godina",2010)
student.ime
student.grad
student.godina
\\ struct unutar struct
student1 = struct ("ime" , "Irena", "grad", "Neretva",
"godina" ,2007);
student2 = struct ("ime" , "Pero", "grad", "Trogir",
"godina" ,2009);
student3 = struct ("ime" , "Jure", "grad", "Omis",
"godina" ,2011);
godina_upisa = struct ("prvi", student1, "drugi",
student2, "treci", student3)
godina_upisa.prvi
63 / 93

Scilab
Specijalni tipovi podataka

struct moemo spremiti i u retani vektor (niz). Pojedinoj


struct pristupamo sa rednim brojem n (ime_niza.n). Niz od
struct kreiramo na dva naina: ili prvo kreiramo nekoliko
struct, pa ih spojimo (konkatenacija) u niz ili kreiramo praznu
listu, te zatim ubacujemo struct, jedan po jedan.
struct ubacujemo na kraj niz konkatenacijom.

64 / 93

Scilab
Specijalni tipovi podataka

Primjer

stu1= struct ("ime", "Jure","datum" ,2005,


"prosjek", 4.5);
stu2= struct ("ime", "Irena","datum" , 2006,
"prosjek", 3.7);
stu3= struct ("ime", "Ivica","datum" ,2011,
"prosjek", 5.0);
stu4= struct ("ime", "Milena","datum" ,2004,
"prosjek", 4.2);
studenti = [stu1, stu2, stu3, stu4]
studenti(2)
s=[studenti(1).prosjek studenti(2).prosjek
studenti(3).prosjek studenti(4).prosjek]
mean(s)
studenti = [ studenti stu1]
65 / 93

Scilab
Specijalni tipovi podataka
Prvo kreiramo niz

struct,

a zatim ubacujemo polje po polje.

Primjer

s(1:3)= struct ("ime" ,[], "godina" ,[])


\\ popunimo svaki element niza sa struct
s(1).ime = "Pero";
s(1). godina =1999;
s(2). ime = "Petra";
s(2). godina =2001;
s(3). ime ="Zrinka";
s(3). godina = 2012;

66 / 93

Scilab
Specijalni tipovi podataka

Cell
Cell (elija) je niz (moe biti i sa vie redaka) varijabli, s tim da
varijable mogu biti bilo kojeg tipa (u istoj eliji mogu biti
varijable razliitog tipa).
Primjer

c = cell (3 ,4)
typeof(c)
c (2 ,1)=25 \\ kriva sintaksa
c(2 ,1). entries =25 \\dobra sintaksa
c(1 ,3). entries ="izraz"
c (1 ,3). entries =[] \\ brisanje elementa
x=c (1:2 ,1)
typeof(x)
x = c (1:2 ,1). entries
typeof(x)
67 / 93

Scilab
Specijalni tipovi podataka

Derivacija
Naredba

derivative(funkcija, tocka)

nam daje derivaciju

funkcije u toki.
Primjer

derivative(sin, 3) // greska
derivative(sin(x), 3) // greska
deff('y = f(x)', 'y = sin(x)')
derivative(f, 3)
deff('y=g(x)','y=sin(x) * exp(-x^2)')
derivative(g,1.3)

68 / 93

Scilab
Specijalni tipovi podataka

Primjer

deff('y=f(x)', 'y = x^3 - x^2')


deff('y=f2(x)', 'y=derivative(f,x)');
derivative(f2, 4)
derivative(f2, 0)
Za deriviranje polinoma i racionalnih funkcija koristimo naredbu

derivat.
Primjer

z1 = poly([1 2 -1], 'x');


z2 = poly([1 2 3 4], 'x', 'coeff')
derivat(z1)
u = derivat(z1/z2)
typeof(u)
horner(u, 0)
69 / 93

Scilab
Specijalni tipovi podataka
Scilab je alat za numeriko rjeavanje, ne simboliko.
Primjer

deff('y = f(x)', y = a * x^2')


f(5) // greska
a = 5
f(5)

70 / 93

Scilab
Specijalni tipovi podataka

Integracija
Z

f (x)dx,

Ako elimo izraunati

koristimo naredbu

integrate('f(x)', 'x', a, b).


Primjer

integrate('x', 'x', 0, 1)
integrate('sin(x^2)', 'x', 0, 1)
deff('y=funk(x)','y = exp(-x) * cos(x^2)');
integrate('funk(x)', 'x', 0 , 5)
integrate('x^2', 'y', 0, 1) // greska

71 / 93

Scilab
Specijalni tipovi podataka

Primjer (Derivacija)

Denirajte funkciju koja kao argument prima funkciju f i


domenu(vektor) x. Funkcija na istom grafu crta funkciju f i
njenu derivaciju na domeni x.

72 / 93

Scilab
Specijalni tipovi podataka

Nultoke
Naredba

fsolve(tocka, funkcija)

vraa nultoku funkcije, s

tim da traenje nultoke poinje u danoj toki. Zbog toga je


dobro prvo nacrtati graf funkcije, te iz njega odrediti gdje se
otprilike nalaze nultoke.
Primjer

deff('y=f(x)','y=x^2 - 1')
fsolve(-2, f)
fsolve(2, f)
deff('y=g(x)','y=derivative(f,x)')
x = fsolve(-2, g)
clean(x)
fsolve(2, g)
73 / 93

Scilab
Specijalni tipovi podataka

Sustav jednadbi
Pretpostavimo da moramo rijeiti sustav:

2x1 + 5x2 + x3 =
4
3x1 + x2 + x3 = 2
2x1 + 3x2 x3 =
6
Iz sustava izvucimo matricu sustava i vektor slobodnih
koecijenata:

2 5 1
4
A = 3 1 1 , b = 2
2 3 1
6
Rjeenje sustava je

clean(A*x - b).

x = A\b

Napomena: pogledajmo

to lagano moemo provjeriti sa

A*x == b.
74 / 93

Scilab
Specijalni tipovi podataka

Obine diferencijalne jednadbe


Pretpostavimo da je zadana obina diferencijalna jednadba

u0 = f (t; u)
u(t0 ) = u0
n
n
n
n
gdje je: u(t) R , f : R R R , u0 R poetni uvjet, a
rjeenje u(t) traimo na intervalu [t0 , T ]. Kako rjeavamo ODJ?


1 napiemo funkciju

2 izaberemo vremenske korake tk za koje elimo priblina


rjeenja

u(tk )

3 deniramo vektor poetnog uvjeta


4 pozovimo

u = ode(u0 , t0 , t, f )

75 / 93

Scilab
Specijalni tipovi podataka

Primjer

y 00 = 0.4(1 y 2 )y 0 y, y(0) = 2.5, y 0 (0) = 2.5

Prvo zapiemo kao sistem diferencijalnih jednadbi prvog reda uz


y(t)
 = u1 (t): 


u1 (t)
u2 (t)

c(1

u2 (t)
2
u1 (t))u2 (t)

u1 (t)

Zatim napiemo funkciju desne strane:

function [f] = funk(t,u)


f = [ u(2) ; 0.4*(1 - u(1)^2)*u(2) - u(1) ]
endfunction

i zatim
T =
t =
u_0
u =

30 ; // trazimo rjesenje na [0, 30]


linspace(0,T, 500);
= [-2.5 ; 2.5]; // vektor pocetnih uvjeta
ode(u_0, 0, t, funkl); // poziv naredbe
76 / 93

Scilab
Specijalni tipovi podataka

function y = kvad ( x )
y = x^2
endfunction
function y = kvad1 ( x )
y = 2 * x^2
endfunction
x= linspace ( 1 , 10 , 50 );
y1= kvad( x );
plot ( x, y1, "+-" )
y2 = kvad1 ( x );
plot ( x, y2, "o-" )
plot(x, y1, x, y2) // razlicita boja
xtitle ( "Y os" ); //prvo naslov cijelog grafa
xtitle ( "Naslov" , "X os" ); //zatim naslov x-osi
xtitle ( "Naslov" , "X os" , "Y os" ); // zatim y-osi
legend ( "x^2" , "2 * x^2" );
77 / 93

Scilab
Specijalni tipovi podataka
Kada smo kreirali neku graku, moemo ju premiti u neki le (u
razliitim formatima, tj. sa razliitim ekstenzijama) na dva
naina. Moemo koristiti

File -> Export to-> ...

iz prozora

grake.

xs2 funkcije koje imaju sintaksu


xs2png ( prozor_grafike, ime_filea. gdje je ime_filea
Moemo koristiti i

ime

lea u koji elimo spremiti graku.

x=0 : %pi/100 : 2 * %pi:


y = sin(x);
xs2png ( 0 , "sinus.png" ) // ako zelimo spremiti negdje
// drugdje navedemo cijelu putanju (path)
// ovdje smo spremili u png formatu
// odredimo velicinu u kojoj cemo spremiti
f=gcf();
f.figure_size=[460,438];
xs2png(0,"sinus.png");
78 / 93

Scilab
Specijalni tipovi podataka
Za brisanje svih graka, koristimo naredbu

clf

("clear gure").

Ako elimo otvoriti drugi prozor za graku, koristimo naredbu

scf

("set current gure"). Primijetimo da svaka graka ima

svoj broj.

n, unesemo scf(n). Ako


brojem n, koristimo clf(n).

Ako elimo otvoriti graku sa brojem


elimo izbrisati samo graku sa
Ako elimo dobiti
koristimo naredbu

handle grake (identikator te


gcf(n) ("get current gure").

grake),

79 / 93

Scilab
Specijalni tipovi podataka

x=1 : 0.1 : 10;


plot(x, x^2, 'b-', x, x,'r-');
f=gcf(); // Get Current Figure
f.figure_size= [1000,500];
a = f.children(1);
a = gca(); // Get Current Axes
prvi = a.children(1).children(1); // za x^2
drugi = a.children(1).children(2); // za x
xmin=2; xmax=8; ymin=10; ymax= 80;
a.data_bounds=[xmin, xmax, ymin, ymax];

80 / 93

Scilab
Specijalni tipovi podataka

// promijenili x-os i y-os


a.axes_reverse=["off","on","off"];
// mijenjamo u kojem poretku se prikazuju osi
a.labels_font_color=5; // boja oznaka osi
a.grid=[2,2]; // dodajemo mrezu
// sa razlicitim bojama
a.thickness = 2; // mijenjamo velicinu fonta na osima

81 / 93

Scilab
Specijalni tipovi podataka

x = -3 : 0.1 : 3;
y = x^2;
plot(x, y);
a = gca();
a
linija = a.children.children
linija.thickness = 3; // velicina linije
linija.foreground = 3; // boja linije

82 / 93

Scilab
Specijalni tipovi podataka

Primjer - crtanje matrice


x=[1 1 1 1; 2 3 4 5;3 4 5 6; 4 5 6 7];
plot(x) // crta stupce s obzirom na broj retka
subplot(221)
plot(x, sin(x));
xtitle("sin(x")
subplot(224)
plot(x, x^2)
xtitle("x^2'')

83 / 93

Scilab
Specijalni tipovi podataka
Realne varijable se spremaju u Scilabu kao brojevi sa pominom
tokom (sa

64

bita) i zovemo ih

double.

Ako integer elimo spremiti, moramo odrediti u kojem formatu


ga spremamo.

y=int8(X) ... broj u rasponu [-128,127]


y=uint8(X) ... broj u rasponu [0,255]
y=int16(X) ... broj u rasponu [-32768,32767]
y=uint16(X) ... broj u rasponu [0, 65535]
y=int32(X) ... broj u rasponu [-2147483648,2147483647]
y=uint32(X) ... broj u rasponu [0, 4294967295]
int8([1 -120 127 312 128])
int([127 128 129 130])
uint8([1 -120 127 312])
x=int32(-200:100:400)
int8(x)
x=int8([0 12 140])
double(x) // nakon konverzije ne dobivamo stare brojeve84 / 93

Scilab
Specijalni tipovi podataka
Naredba

double

konvertira brojeve spremljene sa jednim, dva ili

etiri bytea u double.

x = 3
typeof(x)
type(x)
x=3.456
typeof(x)
type(x)
y = uint16(-2345)
typeof(y)
type(y)
x = double(y)
type(x)

85 / 93

Scilab
Specijalni tipovi podataka
Kako doznati kojeg je tipa integer?

x=uint16(1:10);
inttype(x)
y=34.2345
inttype(y)
inttype("abcd")

86 / 93

Scilab
Specijalni tipovi podataka
Naredba
naredba

int nam
fix).

vraa integer dio realnog broja (isto radi

x = [1, 2; 3.5, -4; 2 + 3.4*%i, - 4 - 2.1*%i]


int(x)
x = 3.4
y = -3.4
round(x)
round(y)
floor(x)
floor(y)
ceil(x)
ceil(y)
fix(x)
fix(y)
87 / 93

Scilab
Specijalni tipovi podataka
Scilab normalno radi sa kompleksnm brojevima u obliku

a + b . %i nam predstavlja imaginarnu jedinicu u Scilabu.


Naredba real nam vraa realni dio kompleksnog broja.
Naredba imag nam vraa imaginarni dio kompleksnog broja.

z1 = 5+4 * %i; z2 = - 4 - 2 * %i
z1 + z2
z1 * z2
z1/z2
complex(1,2)
complex([1 2],[3 4])
z = complex([1 2 3], 4)
z = complex(1, [2 3 4])
isreal([1 2]) // da li je realan
isreal([1+2*%i 2])
isreal(1+0*%i)
isreal(1+0*%i, 0)

88 / 93

Scilab
Specijalni tipovi podataka

Primjer (Kompleksan)

Napravite funkciju koja kao argument prima kompleksan broj


(provjeriti da li je unijet broj i da li je broj kompleksan), te crta
taj kompleksan broj (realni dio na x os, imaginarni dio na y os).
Primjer (NizKompleksnih)

Napravite funkciju koja kao argument prima niz kompleksnih


brojeva (provjeriti da li je argument dobar), te crta taj niz na
istom grafu (realni dio na x os, imaginarni dio na y os).

89 / 93

Scilab
Specijalni tipovi podataka
Scilab daje dvije funkcije za generiranje "pseudosluajnih"
brojeva. To su

rand i grand.

r=rand(1000,1,"uniform");
scf();
histplot(10,r);
r=rand(1000,1,"normal");
scf();
histplot(10,r);

90 / 93

Scilab
Specijalni tipovi podataka

rand.
rand() . . . vraa 1 1 matricu doubleova.
rand(m, n) . . . vraa m n matricu doubleova.
rand(m, n, ras) vraa m n matricu doubleova uz raspodjelu
ras (po defaultu je "uniform", moe biti i "normal")
rand(a) . . . vraa matricu dimenzije kao i a sa
"pseudosluajnim" elementima (ako je a realna, tada je realna,
ako je a kompleksna, tada je kompleksna).
Jedna sintaksa za grand:
grand(i,j,"uin",m,n) vraa matricu i j "pseudosluajnih"
integera izmeu m i n.
Osnovna naredba koju emo koristiti je

t= grand(1,4,"uin",1,6)
t

91 / 93

Scilab
Specijalni tipovi podataka
Naredba

bar(x,n,color)

crta bar graf:

x=[1:10];
n=[8,6,13,10,6,4,16,7,8,5];
bar(x,n)
bar(x, n, 'r')
X=[1,2,5];n1=[5,10,5];n2=[6,8,7];
bar(X,[n1',n2'])

92 / 93

Scilab
Specijalni tipovi podataka

Primjer

R = grand(400,800,"nor",0,1);
histplot(10,R);

93 / 93

You might also like