# Maxima (osnovno za informatièare)

## Uvod

### Operatori

Maxima je numerièki (2*2=4) i simbolièki (a+a=2a) kalkulator slièan alatu Mathematica.
Razlikuje mala i velika slova.
Radni list (*.wxm) sastoji se od niza æelija koje su oznaèene uglatim zagradama s lijeve strane.
Tip æelije (naslov, tekst, ulazne naredbe...) biramo u izborniku Cell.
Za unos ulaznih naredbi dovoljni je kliknuti na slobodno mjesto i poèeti pisati.
Više narebi možemo unijeti u istoj liniji odvajajuæi ih znakom ";". 
Linije s ulaznim (input) naredbama oznaèene su s adresom %iBROJ, a rezultati (output) s %oBROJ.
Prethodno upisano možemo po potrebi iskoristiti navoðenjem adrese upisanoga.
Prethodna linija dodatno je adresirana znakom %.
Aritmetièki operatori: +, -, *, /; a za potenciranje ^ ili **; te za faktorijel !.
Relacijski operatori: <, <=, >=, > te u jednadžbama = ili #.
Relacijske funkcije: equal, notequal.
Logièki operatori: and, not, or.
Prioritet operacija odvajamo obiènim zagradama ().
Upisana naredba izvršava se pritiskom tipki: Shift + Enter ili numerièki Enter.
Rezultati naredbi koje završavaju s ; ispisuju se, a s $ se ne ispisuju.
/* Komenatari se unose unutar ovih znakova. */
Upisom example(NAREDBA) ispisuju se postojeæi primjeri sa NAREDBOM.
Naredbom kill(all) brišemo memoriano.
Prekid izvršavanja najlakše je obaviti preko izbornika Maxima -> Restart Maxima.

2+3; 2-3; 2*3; 2/3; 2**3; %!; a*a*A;

### Varijable i tipovi podataka

Maxima automatski procjenjuje tipove unosenih podataka. 
Brojeve bez toèke tretira kao cjelobrojne i ne zaokruživa njihove vrijednosti u rezultatima.
Rezultat možemo aproksimirati konaènim decimalnim zapisom:
float(BROJ)
  = vraæa decimalni zapis
floor(BROJ) ili round(BROJ) ili ceiling(BROJ)
  = vraæaju cjelobrojne vrijednosti redom najmanju, najbližu, najveæu
rationalize(BROJ)
  = zapisiva decimali BROJ kao racionalni (razlomak)

2/3; float(%); 2.0/3; floor(2/3); round(2/3); ceiling(2/3);

rationalize(0.1); rationalize(0.5);

Maxima-definirane-konstante:

%e; %pi; %i; inf; minf;

float(%e); float(%pi); %i*%i;

Operatorom : pridružujemo vrijendosti varijablama èija imena trebaju biti razlièita od preddefiniranih.

b:3; beta:5; c1:2; b+beta+c1+c+e;

### Nizovi, liste i matrice

Osim ovdje obraðenih listi i matrica, èesto su u upotrebi i nizovi array.

IME:[ELEMENI ODVOJENI ZAREZOM] 
  = formira listu elemenata koje pozivamo sa IME[REDNI BROJ]
length(LISTA) 
  = broji elemente LISTE
lmin(LISTA) 
  = vraæa minimum LISTE
lmax(LISTA) 
  = vraæa maksimum LISTE

l:[a, b, c]; l[1]; length (l);
lmin ([-1,10,-20.2,100,15.0]);

makelist(IZRAZ, i, i_0, i_max, step) 
  = kreira listu prema IZRAZu redom za i=i_0, i_0+step,..., <=i_max 

makelist (i^2, i, 0, 6.5, 2);

matrix(RED_1, ..., RED_n)
  = formira matricu èiji su elementi u redcima dani kao liste RED_i odvojene zarezom

A: matrix([11,12,13],[21,22,23]);

append(LISTA_1,..., LISTA_n)
  = spaja navedene liste u jednu

append([a,b],[c,d,e]);

sort(LISTA, KRITERIJ)
  = sortira danu listu prema kriterijima:
    - "<" - samo numerièke podatke od manjeg prema veæem 
    - ">" - samo numerièke podatke od veæeg prema manjem

L:[%pi,%e,1,20,3.14]$ 
sort(L, "<"); 
sort(L, ">");

### Uvjeti i petlje

if UVJET_1 then IZRAZ_1
if UVJET_1 then IZRAZ_1 else IZRAZ_0
if UVJET_1 then IZRAZ_1 elseif UVJET_2 then IZRAZ_2 elseif ... else IZRAZ_0
  - ako je ispunjen UVJET_k dok su prethodni neistiniti, izvršava se IZRAZ_k
  - ako ni jedan uvjet nije ispunjen izvršava se IZRAZ_0 ako postoji else

r:10$ if r>5 then "r>5" elseif r=5 then "r=5" else "r<5";

for X:X0 step dX thru GRANICA do NAREDBE
for X:X0 step dX while condition do NAREDBE
for X:X0 step dX unless UVJET do NAREDBE
  (0) varijabli X (može se zvati i drugaèije) pridružuje upisanu vrijednost X0 
  (1) prekida izvoðenje ako je X van GRANICE (thru) ili ako je UVJET ispunjen (unless) ili nije (while)
  (2) izvršava naredbe
  (3) poveæava X za dX
  (4) ponavlja (1)-(3) dok se ne izvrši prekid u (1)
display(IZRAZ)
  = prikazuje rezultate IZRAZA prilikom izvršavanja naredbi

for a:-3 step 2 thru 10 do display(a)$

### Funkcije

Poziv: imeFunkcije(argumenti odvojeni zarezom)
Imena trigonometrijskih, ciklometrijskih, hiperbolnih... funkcija:
  acos, acosh, acot, acoth, acsc, acsch, 
  asec, asech, asin, asinh, atan, atanh, 
  cos, cosh, cot, coth, csc, csch, 
  sec, sech, sin, sinh, tan, i tanh.

sin(%pi/2); sin(%pi/3); sin(%pi/6); sin(30.0); sin(30/180*%pi);

Èesto korištene funkcije:
   n povrh k: binomial(n,k)
   apsolutna vrijednost: abs(IZRAZ)
   predznak: signum(IZRAZ) 
   korijen: sqrt(IZRAZ)
   minimum: min(BROJEVI ODVOJENI ZAREZOM)
   maximum: max(BROJEVI ODVOJENI ZAREZOM)
   eksponencijalna funkcija: exp(x)
   prirodni logaritam: log(x)

binomial(5,4); signum(-13.9); abs(-13.9); min(-13.9,0,-20); exp(log(5));

Èesto korištene funkcije za kompleksne brojeve:
  modul kompleksong broja: cabs(IZRAZ)
  argument kompleksnog broja: carg(IZRAZ)
  kompleksno konjugirani izraz: conjugate(IZRAZ)
  realni dio: realpart(IZRAZ)
  imaginarni dio: imagpart(IZRAZ)
  polarni zapis: polarform(IZRAZ)
  reducirani oblik: rectform(IZRAZ)

z:1-%i; cabs(z); carg(z); conjugate(z); realpart(z); imagpart(z); polarform(z); rectform(z/%i);

Korisnik takoðer može definirati vlastite funkcije. 
Operatorom := pridružujemo definiciju funkcijama.

log10(x) := log(x) / log(10.0); log(100.0); log10(100.0);

Razlomljene funkcije definiramo pomoæu uvjetnih relacija, npr. za modul(x)=|x|

modul(x):=if x<0 then x*(-1) else x$
modul(2);
modul(-2);

### Algebarski izrazi

factor(IZRAZ) 
  = faktorizira (pojednostavnjuje) izraz, odreðuje proste faktore

(14*a+4*b)/(5*(49*a^2-4*b^2))*(35*a-10*b)/(4*a);
factor(%);

factor(x^2 + x -6);
factor(20!);
factor(2547895463);

expand(IZRAZ)
  = raspisiva (raèuna) izraz

(x+y)^8;expand(%);

ratsimp(IZRAZ)
  = pojednostavnjuje racionalni izraz

(x/(x^2-36)-(x-6)/(x^2+6*x))/((2*x-6)/(x^2+6*x))+x/(6-x); ratsimp(%);

trigsimp(IZRAZ)
  = pojednostavnjuje izraz koristeæi trigonometrijske identitete
trigreduce (IZRAZ)
  = potencije i umnoške spaja u višekratnike argumenta

trigsimp(cos(x)^2 + sin(x)^2); trigreduce(cos(x)^2 + sin(x)^2);

trigexpand(IZRAZ)
  = raspisiva trigonometrijske izraze koristeci adicijske i redukcijske formule

trigexpand(cos(x)^2-cos(2*x));

## Matrice 

### Operacije s matricama

matrix (RED_1, ..., RED_n) 
  = formira matricu èiji su elementi u redcima dani kao liste RED_i odvojene zarezom
M[i][j]:x
  = upisuje x u Mij

OPERATORI:
  +, -, * i / vrše operacije izmeðu odgovarajuæih elemenata matrica ili skalara i svakog elementa matrice
  ** (^) obavljaju potenciranje svakog elementa matrice i skalara
  . i ^^ obavljaju nekomutativno matrièno množenje i potenciranje ulanèanih matrica
  M^^-1 vraæa inverznu matricu od M

DODATNO - ÈEŠÆE KORIŠTENO:
diagmatrix (N, X)
  = formira dijagonalnu matricu NxN s elementima X na dijagonali
ident (N)
  = formira jediniènu matricu NxN
zeromatrix (M, N)
  = fomira nulmatricu tipa MxN

A: matrix([11,12,13],[21,22,23]); 
B: matrix([1,2,3],[1,1,2])$ B[2][3]:1$ B; 
A+B; 2*B; 2**B; B**2;
minor(A, 1, 1);

A: matrix([1,2,3],[4,5,6]); B: matrix([1,1,1]); O:zeromatrix(3,1);
A.B; A.O;

rank (M)
  = vraæa rank matrice M
transpose (M)
  = vraæa transponiranu matricu od M
triangularize (M)
  = vraæa gornju trokutastu matricu za M
mattrace (M)
  = raèuna trag kvadratne matrice
  - uèitati paket: load ("nchrpl")
adjoint (M) 
  = vraæa adjunktu od M
determinant (M) 
  = vraæa determinantu matrice M
invert (M)
  = vraæa inverznu matricu od M

load ("nchrpl")$
M: matrix([1,2,3],[4,5,7],[7,8,10]); 
mattrace(M); 
adjoint(M);
det:determinant(M);
invert(M)-adjoint(M)/det;

### Pohrana i uèitavanje

PAKET: load (numericalio);
write_data (M, "DAT.txt");
  = pohranjuje matricu M u DAT.txt (linija = redak)
read_matrix ("test.txt",M);
  = uèitava sadržaj DAT.txt u matricu M 
  - za èitanje više redaka matricu M treba prije definirati
  - npr. M:zeromatrix (brREDAKA, brSTUPACA);

load (numericalio);
M1: matrix([1,2,3],[4,5,7],[7,8,10]);
write_data (M1, "test.txt")$
M2:zeromatrix (2, 3);
read_matrix ("test.txt",M2);

### Svojstveni vektori i svojstvene vrijednosti 

M:rationalize(M);
  - optimalnije je racionalizirati matricu prije poziva sljedeæih funkcija
ZA SLJEDEÆE FUNKCIJE POTREBO JE UÈITATI: load ("eigen")
eigenvalues (M) 
  = vraæa listu vlastith vrijednosti od M i lista njihovih kratnosti
eigenvectors (M) 
  = vraæa listu s 2 elementa
  - prvi je podlista vlastith vrijednosti od M i podlista njihovih kratnosti
  - drugi je list vlastitih vektora
uniteigenvectors (M)
  = vraæa isto kao eigenvectors(M) i normira svojstvene vektore

M:ident(3);load ("eigen")$ uniteigenvectors(M);

### Primjeri

PR: Neka su vektori baze |1>, |2>, |3>, |4>, |5>, |6>. Matrica operatora H 
dana je sa H: -J matrix(
 [0, 1,0,0, 1,0], 
 [1,-2,1,1, 0,1], 
 [0, 1,0,0, 1,0], 
 [0, 1,0,0, 1,0], 
 [1, 0,1,1,-2,1], 
 [0, 1,0,0, 1,0])$
    gdje je J konstanta.
    (a) Izdvojite matricu H samo s numerièkim podatcima.
    (b) Odredite njene svojstvene vrijednosti i svojstvene vektore.
    (c) Postoje li karakteristiène vrijednosti višestruke kratnosti.
    (d) Odredite 2. svojstvenu vrijednost k. 
    (e) Napravite provjeru za 2. svojstveni vektor v raèunanjem Hv-kv.
    (f) Napišite eksplicitni izraz za |v>.

load ("eigen")$
H: matrix(
 [0, 1,0,0, 1,0], 
 [1,-2,1,1, 0,1], 
 [0, 1,0,0, 1,0], 
 [0, 1,0,0, 1,0], 
 [1, 0,1,1,-2,1], 
 [0, 1,0,0, 1,0])$
uniteigenvectors(H);

"0 je trostruka svojstvena vrijednost";

k:uniteigenvectors(H)[1][1][2]; E:-J*h^2/8/%pi^2*k;
v:uniteigenvectors(H)[2][2][1]; H.v-k*v;

"|v> = (|2>-|5>)/sqrt(2)";

PR: Ekvidistantne toèke možemo zapisati kao: 
    Xi=Xmin+i*dX, dX=(Xmax-Xmin)/N, i=0...N.
    Neka tridijagonalna matricu s redcima i=1...N-1, ima na  
    na glavnoj dijagonali elemente 2u+Vi te ispod i iznad dijagonale -u
    gdje su: u=Hbar^2/(2*m*dX^2), Vi=0 i Hbar=1.0545718E-34 m^2 kg / s. 
    (a) Odredite tridijagonalnu matricu za N=10, m=1 pg, Xmin=0, Xmax=2 nm.
    (b) Odredite njene svojstvene vrijednosti i svojstvene vektore.
    (c) Koliko iznosi minimalna svojstvena vrijednost.

N:10$ T:zeromatrix(N-1,N-1)$
m:1.0$ Xmin:0$ Xmax:2.0$ dX:(Xmax-Xmin)/N$ Hbar:1.0545718E-34*1.0E18*1.0E15$ u:Hbar^2/(2*m*dX^2)$
for i:1 step 1 thru N-1 do (T[i][i]:2*u);
for i:1 step 1 thru N-2 do (T[i][i+1]:-u,j:i+1,T[j][j-1]:-u);
T$ T:rationalize(T)$
load ("eigen")$
float(eigenvectors(T));
E:lmin(%[1][1]);

Napomena!
Radi kraæeg trajanja demonstracije uzet je mali N. 
Za preciznije rješenje i glaðe valne funkcije potreban je veæi N. 

## Jednadžbe

### Algebarske i transcendentne jednadžbe

solve([IZRAZ_1, ..., IZRAZ_N], [VAR_1, ..., VAR_n])
  = rješava egzaktno sustav algebarskih jednadžbi [IZRAZ_1, ..., IZRAZ_N]
  - vraæa listu rješenja [VAR_1, ..., VAR_n]
  - ako nema = u IZRAZ, solve pretpostavlja IZRAZ=0
  - ako je samo jedan IZRAZ, nisu potrebne [] za listu
  - ako je jedna VARIJABLA ne treba je navoditi
linsolve ([IZRAZ_1, ..., IZRAZ_m], [VAR_1, ..., VAR_n])
  = rješava egzaktno sustav linearnih jednadžbi [IZRAZ_1, ..., IZRAZ_m]
  - vraæa listu rješenja [VAR_1, ..., VAR_n]

jed:x^2+4; solve(jed=0,x); solve(jed);

solve([x+y,x-y],[x,y]);

linsolve ([x+y=1, 3*x+4*y=broj], [x,y]);

realroots(IZRAZ, PRECIZNOST) 
  = vraæa sve relane korjene odreðene numerièki s danom PRECIZNOŠÆU ako je zadana
allroots(IZRAZ, PRECIZNOST) 
  = vraæa sve korjene odreðene numerièki s danom PRECIZNOŠÆU ako je zadana
Napomene:
  - mogu se koristit samo polinomijalni IZRAZI bez simbola poput %pi
  - ako u IZRAZU nema = , pretpostavlja se IZRAZ=0
  - ako nema PRECIZNOST, uzima se vrijednost rootsepsilon = 1.0E-7

realroots(x^5+1); allroots(x^5+1);

find_root(IZRAZ, x, a, b) 
  = vraæa jedan od realnih korijena IZRAZA ako postoji takav a<=x<=b
  - ako u IZRAZU nema = , pretpostavlja se IZRAZ=0

find_root(sin(x), x, 0.01, 10);
find_root(x^3=10, x, 2, 5);
find_root(x^3=10, x, 0, 2);

### Primjeri

PR: Brzina èestice opisana je u ovisnosti o vremenu relacijom v(t)=t^4-5t^3-20. 
    U kojim se trenutcima èestica zaustavi?

realroots(t^4-5*t^3-20.0);

float(%[2]);

Trenutak smo mogli približno odrediti i crtanjem funkcije: 
oznaèimo izraz u argumentu od realroots
te odaberemo u izborniku Plot -> Plot 2d... 

plot2d([t^4-5*t^3-20.0], [t,0,7],
 [plot_format, gnuplot])$

PR: Za serijski spojenu zavojnicu (L=9 mH) s 2 kondenzatora (C1=8 (mikro)F i C2=6 (mikro)F)
    i otpornikom (R=20 (ohm)) odredite koliko je ms potrebno da ukupni naboj na
    kondenzatorima padne na 1/8 poèetne vrijednosti. Dakle, treba riješiti jednadžbu 
    q(t)=Q/8, odnosno 8exp(-dt)cos(wt)=1 gdje su d=R/(2L) i w=sqrt(1/(LC)-d^2).

C:1/(1/8E-6+1/6E-6); L:9E-3;R:20; 
d:R/(2*L); w:sqrt(1/(L*C)-d^2);
T:float(2*%pi/w);
t1:find_root(exp(-d*t)*cos(w*t)-1/8,t,0,T/4);
"t/ms="; t1*1000;

PAZITE NA GRANICE!
Granice treba ih postaviti u skladu sa zadanim problemom.
Problem nastaje kada postoji više rješenja, npr.

find_root(exp(-d*t)*cos(w*t)-1/8,t,0,4);

## Infinitezimalni raèun

### Limesi, sume, produkti

limit (IZRAZA, X, GRANICA, SMJER)
  = odreðuje limes IZRAZA kad varijabla X ide u GRANICU
  - SMJER može biti plus, minus ili prazno kada se podrazumjeva obostrani limes 

limit(x^2,x,2);
limit(x^2,x,minf);
limit(-1/x,x,0,plus);

lsum (IZRAZ, X, LISTA)
  = raèuna sumu IZRAZA koji su dobiveni za varijable X dane u LISTI 
sum (IZRAZ, I, I0, In)
  = sumira IZRAZE dobivene redom za indekse I=I0...In
product (IZRAZ, I, I0, In)
  = množi IZRAZE dobivene redom za indekse I=I0...In

lsum (s^i, i, [1, 2, 3]);
sum(s^i,i,1,3);
product(s^i,i,1,3);

### Razvoj u red

taylor (IZRAZ, X, A, N) 
  = razvija IZRAZ u Taylorov ili Laurentov red po varijabli X oko toèke A
  - do èlana (X - A)^N.

taylor ((sin(x)), x, 0, 10);
taylor (sqrt(x+1), x, 0, 1);
taylor (1/sqrt(x+1), x, 0, 1);

### Derivacije

diff (IZRAZ, X1, N1, ..., Xm, Nm)
  = derivira izraz Ni puta po Xi
  - diff (IZRAZ, X) = diff (IZRAZ, X, 1)
diff (FUNKCIJA) 
  = vraæa diferencijal FUNKCIJE
NAPOMENA: 'diff ispsiuje izraz umjesto raèunanja

'diff(x^3,x);
diff(x^3,x);
diff(x^3+y);

diff(x^3*sin(x)+log(cos(x))^4,x);

### Integrali

integrate (IZRAZ, X)
  = integrira IZRAZ po varijabli X
integrate (IZRAZ, X, A, B)
  = raèuna odreðeni integral od IZRAZA po X u granicama A do B
risch (IZRAZ, X)
  = integrira IZRAZ po X koristeæi transcendentalni oblik Rischovog algoritma

'integrate(6*x+3, x);
integrate(6*x+3, x);
'integrate(6*x+3, x,0,2);
integrate(6*x+3, x,0,2);

f(x):=cos(x)^3*sin(x)^5$
'integrate(f(x), x);
integrate(f(x), x); Iint(x):=%$
risch(f(x), x); Iris(x):=%$
"provjera:";Iint(10)-Iris(10);

changevar (IZRAZ, f(X,Y), Y, X)
  = mijenja varijablu integracije X u Y koristeæi f(X,Y) = 0 
assume (PRETPOSTAVKA)
  = rješava uz PRETPOSTAVKU

kill(x,y)$
assume(a > 0)$
'integrate (%e**(a*x**2)*x, x, 0, 4);
changevar (%, y-x**2, y, x);

## Obiène diferencijalne jednadžbe

ode2 (ODJ, Y, X)
  = rješava obiènu diferencijalnu jednadžbu (ODJ) 1. i 2. reda
  - X tretira kao nezavisnu varijablu, a Y kao zavisu
  - pri uspješnom izvršavanju vraæa eksplicitni ili implicitni izraz RJ
  - %c oznaèava konstantu integracije ODJ 1. red
  - %k1 i %k2 oznaèavaju konstante integracije ODJ 2. red
ic1 (RJ, X=X0, Y=Y0)
  = prilagoðava opæe rješenje RJ od ODJ 1. reda poèetnim uvjetima 
ic2 (RJ, X=X0, Y=Y0, 'diff(Y,X)=D0) 
  = prilagoðava opæe rješenje RJ od ODJ 2. reda poèetnim uvjetima 
bc2 (RJ, X=X1, Y=Y1, X=X2, Y=Y2)
  = prilagoðava opæe rješenje RJ od ODJ 2. reda uvjetima Y(X1)=Y1, Y(X2)=Y2 

'diff(y,x) + 3*x = cos(x);
ode2(%,y,x);
ic1(%,x=0,y=0);

'diff(x,t,2) + 4*x = 0;
ode2(%,x,t);
ic2(%,t=0,x=5,'diff(x,t)=0);

desolve ([EQ1, ..., EQn], [Y1, ..., Yn])
  = Laplaceovom transformacijom rješava sustav liearnih DJ 
  - EQi su DJ u zavisnim varijablama Xi
  - eksplicitna ovisnost (X) mora biti korištena
  - poèetni uvjeti se prosljeðuju prije rješavanja
atvalue (IZRAZ, [X1=A1, ..., Xm=Am], C) 
  = dodjeljuje vrijednost C IZRAZU u toèki koordinata Xi=Ai

o1:'diff(p(x),x)='diff(q(x),x)-x;
o2:'diff(q(x),x,2)='diff(p(x),x);
atvalue('diff(q(x),x),x=0,5);
atvalue(p(x),x=0,1);
atvalue(q(x),x=0,1);
desolve([o1,o2],[p(x),q(x)]);

o1:'diff(y(x),x,2)=-25*y(x);
atvalue(y(x),x=0,5);
atvalue('diff(y(x),x),x=0,0);
desolve(o1,y(x));