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
-
Napišite u Octavi funkciju
proj(u,v)
koja na izlazu vraća ortogonalnu projekciju vektorau
na vektorv
. -
Napišite u Octavi funkciju
kutVek(u,v,mjera)
koja na izlazu vraća kut između vektorau
iv
u zadanoj mjeri.mjera
može bitideg
,rad
ilidms
. -
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\). -
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. -
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.
-
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}\).
-
Riješite zadatak
seminari 3 -> zadatak 4
. -
Riješite zadatak
seminari 3 -> zadatak 1
. - 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)