Logički veznici

(1 > 2) & (3 <= 4)
1 > 2 | 3 < 4
!(1>2)
1>!2

Rješavanje algebarskih jednadžbi

Rješenje linearne jednadžbe \(2x+3=0\).
roots([2 3])
Rješenja kvadratne jednadžbe \(2x^2+3x-1=0\).
roots([2 3 -1])
Rješenja kubne jednadžbe \(x^3+3x^2+x+2=0\).
roots([1 3 1 2])

Programiranje u Octavi - skripte

Zadatak. Napisati program koji računa sumu kvadrata prvih n prirodnih brojeva. Program od korisnika traži da unese željeni prirodni broj n.
Pokazane su tri različite implementacije koje usput mjere vrijeme potrebno da se program izvrši.

sadržaj datoteke suma1.m
%racunanje sume kvadrata prvih n prirodnih brojeva preko while petlje
n = input("Unesite vrijednost za n: ");
tic();
i = 1;
suma = 0;
while (i <= n)
  suma += i^2;
  i++;
endwhile
toc();
disp("Suma: "); 
disp(suma);
pokretanje programa u terminalu
suma1
help suma1
sadržaj datoteke suma2.m
%racunanje sume kvadrata prvih n prirodnih brojeva preko for petlje
n = input("Unesite vrijednost za n: ");
id = tic();
suma = 0;
for i = 1:n
  suma += i^2;
endfor
toc(id);
disp("Suma: "); 
disp(suma);
pokretanje programa u terminalu
suma2
help suma2
sadržaj datoteke suma3.m
#racunanje sume kvadrata prvih n prirodnih brojeva preko vektora
n = input("Unesite vrijednost za n: ");
tic();
suma = sum((1:n).^2);
toc();
#{
komentar
kroz
vise
redaka
#}
printf("Suma: %d\n", suma);
pokretanje programa u terminalu
suma3
help suma3

Napomena. Kad god je to moguće, treba preferirati vektorski način programiranja zbog brzine izvođenja programa. Vektorske operacije su optimizirane u Octavi jer koriste LAPACK i BLAS biblioteke.
Pokrenite prethodna tri programa za \(n=10^6\) i usporedite vremena izvođenja. Uočite da zbog konačne aritmetike octave ne daje točno rješenje u ovom slučaju (samo je prvih 12 znamenaka ispravno; točno rješenje ima ukupno 18 znamenaka). Najsporiji je prvi program s while petljom, a najbrži je treći program s vektorskim pristupom.

Programiranje u Octavi - funkcije

Zadatak. Implementirati funkciju koja za unešeni kut u stupnjevima ili radijanima na izlazu vraća kut u stupnjevima, minutama i sekundama.
Pokazane su dvije slične implementacije, razlikuju se samo u obliku u kojemu vraćaju rezultat.

sadržaj datoteke DMS.m
function [stupanj, minuta, sekunda] = DMS(kut, mjera = "deg")

#{
Daje kut u stupnjevima, minuta, sekundama i stotinkama sekundi.
mjera='deg' -> pocetni kut unesen je u stupnjevima (default)
mjera='rad' -> pocetni kut unesen je u radijanima
#}

if strcmp(mjera, "rad")
  kut *= 180 / pi;
elseif !strcmp(mjera, "deg")
  disp("Error: mjera kut mora biti 'deg' ili 'rad'");
  stupanj = "undefined";
  minuta = "undefined";
  sekunda = "undefined";
  return;
endif

stupanj = floor(kut);
minuta = (kut - stupanj) * 60;
sekunda = (minuta - floor(minuta)) * 60;

minuta = floor(minuta);

if floor(sekunda) == 60
  sekunda = 0;
  if minuta < 59
    minuta += 1;
  else
    minuta = 0;
    stupanj += 1;
  endif
endif

endfunction
korištenje funkcije u terminalu
[deg,mn,sc] = DMS(56.7891)
[deg2,mn2,sc2] = DMS(2/3*pi+0.1,"rad")
[deg3,mn3,sc3] = DMS(2/3*pi+0.1,"radijan")
help DMS
sadržaj datoteke dms.m
function rez = dms(kut, mjera = "deg")

%{
Daje kut u stupnjevima, minuta, sekundama i stotinkama sekundi.
mjera='deg' -> pocetni kut unesen je u stupnjevima (default)
mjera='rad' -> pocetni kut unesen je u radijanima
%}

if strcmp(mjera, "rad")
  kut *= 180 / pi;
elseif !strcmp(mjera, "deg")
  disp("Error: mjera kut mora biti 'deg' ili 'rad'");
  rez.stupanj = "undefined";
  rez.minuta = "undefined";
  rez.sekunda = "undefined";
  return;
endif

rez.stupanj = floor(kut);
rez.minuta = (kut - rez.stupanj) * 60;
rez.sekunda = (rez.minuta - floor(rez.minuta)) * 60;

rez.minuta = floor(rez.minuta);

if floor(rez.sekunda) == 60
  rez.sekunda = 0;
  if rez.minuta < 59
    rez.minuta += 1;
  else
    rez.minuta = 0;
    rez.stupanj += 1;
  endif
endif

endfunction
korištenje funkcije u terminalu
kut1 = dms(56.7891)
kut1.stupanj
kut1.minuta
kut1.sekunda
dms(2/3*pi+0.1,"radijan")
dms(2/3*pi+0.1,"rad")
help dms

Napomena. Funkcije u Octavi se pozivaju po vrijednosti, a ne po referenci. Kompleksniji tipovi podataka poput vektora matrica i struktura se pozivaju po referenci, osim u slučaju ako se mijenjaju njihove vrijednosti unutar same funkcije (tada će Octave napraviti lokalnu kopiju te varijable kako se globalna varijabla ne bi promijenila).

a = 1.0567
dms(a,"radijan")
a
popis svih korisnikovih skripti i funkcija u radnom direktoriju
what
popis direktorija gdje octave traži funkcije
path
addpath('~/Documents/octave/OPM/funkcije')
path

Anonimne funkcije

f = @(n) (1+1/n)^n;
f(4)
whos

arrayfun

vek = 1:5
f(vek)
g = @(n) (1+1./n).^n;
g(vek)
arrayfun(f, vek)
B = [2 3 1; 4 6/7 -2]
g(B)
arrayfun(f,B)

Funkcije DMS i dms dobro djeluju na vektorima i matricama jer su sve operacije unutar tih funkcija dobro definirane na vektorima, matricama i strukturama.

kutovi = [45.5678, 34.2341, 78.2223451]
[u1,u2,u3] = DMS(kutovi)
rez = dms(kutovi)
rez.stupanj
rez.stupanj(2)
[v1,v2,v3] = arrayfun(@(x) DMS(x,"stupanj"), kutovi)

structfun

struktura = struct("prvi",6, "drugi",4.51, "treci", 3.124)
f(struktura)
structfun(f, struktura)
structfun(f, struktura, "UniformOutput", false)
dms(struktura)
q = structfun(@(x) dms(x,"radijan"), struktura)
q.stupanj
q.minuta
q.sekunda
w = structfun(@(x) dms(x,"radijan"), struktura, "UniformOutput", false)
w.prvi
w.prvi.stupanj

cellfun

celija1 = {2.32, 1.45, 1.908}
f(celija1)
cellfun(f, celija1)
cellfun(f, celija1, "UniformOutput", false)
cellfun(@(x) f(x), celija1)

celija2 = {rand(2,2), rand(2,2), rand(3,3)}
det(celija2)
cellfun(det, celija2)
cellfun(@det, celija2)
cellfun(@det, celija2, "UniformOutput", false)
cellfun("det", celija, "UniformOutput", false)

Skalarni, vektorski i mješoviti produkt vektora

a = [1 3 -2]
b = [5 -4 7]
c = [1 0 -1]
dot(a,b)
cross(a,b)
cross(b,a)
det([a; b; c])
norm(b)

Zadaci

  1. Napišite u Octavi funkciju proj(u,v) koja na izlazu vraća ortogonalnu projekciju vektora u na vektor v.

  2. Napišite u Octavi funkciju kutVek(u,v,mjera) koja na izlazu vraća kut između vektora u i v u zadanoj mjeri. mjera može biti deg, rad ili dms.

  3. Napišite u Octavi funkciju omjer(A,B,t) koja na izlazu vraća točku koja dužinu \(\overline{AB}\) dijeli u omjeru \(t\).

  4. Napišite u Octavi funkciju parts(A,B,n) koja na izlazu vraća točke koje dužinu \(\overline{AB}\) dijele na \(n\) jednakih dijelova.

  5. Odredite kut između vektora \(\vec{u}=(25.34,71.21,-87.87)\) i \(\vec{v}=(-57.27,68.21,31.29)\). Kut odredite u radijanima na 5 decimala i u stupnjevima, minutama i sekundama.

  6. Zadani su vektori \(\vec{a}=(3.21, 5, -12.21)\), \(\vec{b}=(-43.21, 11, 0.34)\) i \(\vec{v}=(-6, 2.4, 7)\). Odredite duljinu ortogonalne projekcije vektora \(\vec{b}\) na vektor \(\frac{3}{2}\vec{a}+4\vec{v}\). Odredite razliku vektora \((\vec{a}\times\vec{b})\times\vec{v}\)  i  \(\vec{a}\times(\vec{b}\times\vec{v})\). Odredite duljinu visine paralelepipeda razapetog s vektorima \(\vec{a}\), \(\vec{b}\) i \(\vec{v}\) na stranu određenu s vektorima \(\vec{b}\) i \(\vec{v}\).

  7. Riješite zadatak seminari 3 -> zadatak 4.

  8. Riješite zadatak seminari 3 -> zadatak 1.

  9. Riješite zadatak seminari 3 -> zadatak 2.

Instalacija paketa za simbolički račun

Na sljedećem linku skinite paket symbolic. Instalaciju u octave pokrenemo iz direktorija u kojem je sačuvana instalacijska datoteka.

pkg install symbolic-2.8.0.tar.gz

Napomena. Ovaj paket je baziran na pythonu i njegovom modulu sympy. Na linux operacijskom sustavu sve normalno radi ako je instaliran python i sympy. Za windows operacijski sustav pogledajte github.

Zadatak. Odredite \(x\in\mathbb{R}\) tako da vektori \(\vec{a}=(1,2,x)\), \(\vec{b}=(-2,1,1)\) i \(\vec{c}=(-7,-8,3)\) budu komplanarni.

pkg load symbolic
syms x
a = [1 2 x]
b = [-2 1 1]
c = [-7 -8 3]
mat = [a; b; c]
det(mat)
rj = solve(det(mat) == 0, x)
double(rj)
Simboličko određivanje sume kvadrata prvih n prirodnih brojeva

Kod simboličkog računa dobit će se točan rezultat za sumu kvadrata prvih \(10^6\) prirodnih brojeva jer se koristi egzaktna aritmetika koja se ne izvršava samo direktno u procesoru.

syms n
symsum(n^2,n,1,10^6)