12.07.2015 Views

Skripta dr Željka Jurića

Skripta dr Željka Jurića

Skripta dr Željka Jurića

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERZITET U SARAJEVUPRIRODNO-MATEMATIČKI FAKULTETODSJEK ZA MATEMATIKUDr. Željko Jurić:Interaktivna računanja uprogramskom paketuMathematica/ skraćena verzija /Priručnik za laboratorijske vježbe na predmetu“ Računarski sistemi ”Februar, 2006.


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”1. UvodU matematičkoj praksi se u sve većoj mjeri upotrebljavaju takozvani algebarski računarski paketi,među kojima je Mathematica firme Wolfram Research Inc. vjerovatno najmoćniji. Rad na ovomprogramu započeo je Stephen Wolfram prije skoro 30 godina, i on se do današnjeg dana neprestanousavršava. Pomoću njega možemo lako rješavati složene matematičke zadatke čak i na relativno slabimračunarima. Oblasti matematike koje su pokrivene ovim paketom uključuju numerički proračuniproizvoljne tačnosti, sređivanje algebarskih izraza, linearna algebra, apstrakna algebra (teorije grupa ipolja), teorija brojeva, razne oblasti analize (simboličko i numeričko diferenciranje i integriranje,rješavanje diferencijalnih jednačina, itd.), rješavanje jednačina i sistema jednačina, itd.Paket Mathemtatica posjeduje i naredbe za grafiku. Sa tim naredbama lako crtamo, na primjer,grafike funkcija. Grafove funkcija jedne promjenljive možemo predstaviti u Dekartovim ili polarnimkoordinatama, a mogu biti zadane i u parametarskom ili implicitnom obliku. Graf funckija dvijepromjenljive može se prikazati kao površ u prostoru. Grafički se mogu predstaviti i krivulje utrodimenzionalnom prostoru. Pored toga, postoje i <strong>dr</strong>uge mogućnosti prikazivanja funkcionalnih veza,kao što su dijagrami, itd. Posebno je moguće zadati i grafičke atribute, npr. kakav je oblik, debljina iboja linija, tip i veličina oznaka na grafikonu, itd. Pri prostornom predstavljanju objekata može sepodešavati lokacija izvora svjetlosti, njihova boja, itd. Grafički izvještaji mogu se lako “izvoziti” kaodatoteke različitih oblika, na primjer postscript datoteke, bit-mapirane slike, ili kao datoteke za ispis naštampaču. Takođe je moguće grafičke ispise prebacivati u <strong>dr</strong>uge dokumente (npr. dokumente kreirane saMicrosoft Word-om).Pored svega navedenog, programski paket Mathematica također uključuje i vlastiti programskijezik interpreterskog tipa, tako da je moguće kreiranje vlastitih programskih modula i biblioteka, pa čak ikompletnih matematičkih aplikacija. Pored osnovnih kontrolnih struktura koje se susreću u skoro svimprogramskim jezicima (IF – THEN – ELSE, FOR, WHILE itd.), jezici ugrađeni u računarske algebarskesisteme imaju posebne mogućnosti za simboličko programiranje. Ipak, namjera ovog priručnika nijeuvođenje u programiranje u paketu Mathematica, s obzirom da bi za tako nešto bio potreban mnogo većiprostor. Ovaj priručnik objašnjava samo interaktivna računanja, u kojem korisnik samo postavljaproblem koji želi riješiti, koristeći odgovarajuću sintaksu, i odmah dobija rješenje. Ovakav interaktivnirad ograničen je samo na onu klasu problema za koje Mathematica apriori zna riješiti, bez potrebe zapisanjem specijalnih programa. Međutim, vidjećemo da je klasa takvih problema izuzetno široka. Poredtoga, ograničićemo se samo na prikaz mogućnosti čije matematičko razumijevanje ne prelazi znanjestudenta prve godine studija matematike. Korištena verzija je Mathematica 5.0 (koja je u vrijeme pisanjaovog priručnika bila najnovija verzija), mada će većina opisanih stvari raditi i u verzijama 4.0 i 3.0.2. Transakcije u programskom paketu MathematicaKada se pokrene programski paket Mathematica, ono što korisnik ugleda na ekranu predstavljasamo jedan dio programskog paketa Mathematica, koji se naziva radno okruženje (MathematicaFrontEnd). Radno okruženje prihvata komande od korisnika i prikazuje rezultate izračunavanja u formipodesnoj za korisnika, koje korisnik po potrebi može dalje uređivati i oblikovati. Radno okruženjetakođer posjeduje mnoge karakteristike tekst procesora, odnosno programa za obradu teksta, tako da jepogodan i za uređivanje i oblikovanje matematičkih dokumenata. Međutim, stvarna izračunavanjaobavlja posve <strong>dr</strong>ugi program, nazvan Mathematica Kernel. Ovaj program se može pokrenuti zasebno, aliza time nema osobite potrebe, jer se Mathematica Kernel automatski poziva iz MathematicaFrontEnd-a) prvi put kada korisnik zatraži bilo kakvo izračunavanje, i ostaje aktivan u pozadini sve dozavršetka rada sa paketom Mathematica.Nakon pokretanja paketa Mathematica, pred korisnikom se ukazuje prazan dokument koji ćemozvati bilježnica (engl. notebook). Rad u bilježnici odvija se slično kao u svakom editoru teksta. Posebno,pritisak na tipku |Enter| na alfanumeričkom (slovnom) dijelu tastature vrši pomjeranje kurzora u novired, kao što je uobičajeno. Međutim, pritisak na kombinaciju tipki |Shift| + |Enter| proizvodi sasvim– 1 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”<strong>dr</strong>ugačiji efekat. Nakon pritiska na ovu kombinaciju tipki, tekst koji smo upravo ukucali MathematicaFrontEnd šalje Mathematica Kernel-u, koji tada vrši njegovu evaluaciju (izvršavanje, izračunavanje) išalje rezultat izvršavanja nazad Mathematica FrontEnd-u koji prikazuje rezultat izračunavanja. Ovuseriju događaja nazivamo transakcijom. Na mnogim Mathematica sistemima umjesto kombinacije|Shift| + |Enter| dovoljno je pritisnuti samo tipku |Enter| na numeričkom dijelu tastature.Cijeli rad sa paketom Mathematica odvija se u transakcijama: korisnik zadaje komandu (ili serijukomandi), nakon čega pritišće kombinaciju tipki |Shift| + |Enter|. Ukoliko je komanda ispravna, nakonkraćeg ili dužeg vremena (zavisno od složenosti komande) prikazuje se rezultat izvršavanja komande.Većina komandi u paketu Mathematica predstavljaju aritmetičke izraze ili seriju izraza. Na primjer,ukucajmo izraz2+3i pritisnimo |Shift| + |Enter| (ili, eventualno, tipku |Enter| na numeričkom dijelu tastature). Kao rezultat, ubilježnici ćemo ugledati odgovor 5, odnosno bilježnica će izgledati ovako:In[1] := 2+3Out[1] = 5Ovim je obavljena jedna transakcija: zadali smo paketu Mathematica da izračuna koliko je 2+3, idobili smo odgovor 5. Komanda koju smo zadali (2+3) smještena je ulaznu ćeliju, a rezultatizračunavanja (5) u izlaznu ćeliju. Sve transakcije, ulazne i izlazne ćelije, označene su uglastimzagradama uz desni rub dokumenta (bilježnice), kao što je prikazano na sljedećoj slici:Oznakaulazne ćelijeIn[1] := 2+3Out[1] = 5OznakatransakcijeMathematica ulaze u svaku od transakcija (2+3 u prethodnom primjeru) čuva u ulaznojtransakcionoj listi nazvanoj In, a rezultate izvršavanja transakcija u izlaznoj transakcionoj listi nazvanojOut. U kasnijem radu možemo se pozivati na sa<strong>dr</strong>žaje ovih listi. Indeks u ulaznoj zagradi predstavljaredni broj transakcije. Tako, In[1] označava da se radi o ulazu u prvu transakciju, a Out[1] označava dase radi o rezultatu prve transakcije. Zadamo li novu komandu, npr. 5+6 i pritisnemo |Shift| + |Enter| ubilježnici će se pojavitiIn[2] := 5+6Out[2] = 11Indeks 2 govori da se radi o <strong>dr</strong>ugoj transakciji. Redni brojevi transakcija rastu za 1 nakon svakeobavljene transakcije, sve do završetka rada sa tekućom bilježnicom (ili do prelaska u novu otvorenubilježnicu). Kasnije ćemo vidjeti zašto je dodjela ulaznoj listi izvršena pomoću znaka “:=” a izlaznoj listipomoću znaka “=”.Redni brojevi transakcija ne moraju odgovarati prostornom razmještaju transakcija u bilježnici.Naime, ukoliko izmijenimo sa<strong>dr</strong>žaj neke ulazne ćelije, i ponovo pritisnemo |Shift| + |Enter|, rezultattransakcije će prebrisati sa<strong>dr</strong>žaj stare izlazne ćelije, i transakcija će dobiti novi broj. Na primjer, ukolikose vratimo na prvu ulaznu ćeliju, izmijenimo broj 3 u 30 (tj. tako da komanda postane 2+30) i pritisnemo|Shift| + |Enter|, u bilježnici će se na mjestu gdje se nalazila prva transakcija pojaviti sljedeći prikaz:In[3] := 2+30Out[3] = 32Oznakaizlazne ćelije– 2 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Dakle, transakcija je označena rednim brojem 3, mada se ona u bilježnici sada nalazi ispred transakcijesa rednim brojem 2.Može se desiti da jedna transakcija kao rezultat proizvede više izlaznih ćelija. Tako je, na primjer,moguće zadati čitav niz komandi u jednoj ulaznoj ćeliji pri čemu se svaka komanda nalazi u posebnomredu (što možemo postići pritiskom na samo |Enter|), a zatim odjedamput izvršiti sve komande pritiskomna |Shift| + |Enter|. Na primjer:In[4] := 2+34+113*8Out[4] = 5Out[5] = 15Out[6] = 24Isto tako, jedna jedina komanda može kao rezultat proizvesti više od jedne izlazne ćelije, kao usljedećem primjeru (ne obraćajte pažnju što ne razumijete komandu, bitno je da uočite pojavu višeizlaznih ćelija):In[7] := Do[Print[i*i],{i,5}]1491625Također, može se desiti da komanda ne proizvede ni jednu izlaznu ćeliju kao rezultat, kao u sljedećemprimjeru:In[8] := cijena:=10U svakom slučaju, uvijek je moguće editirati sa<strong>dr</strong>žaj već postojećih ulaznih ćelija koristeći kurzorsketipke, obilježavanje, brisanje, komande Cut, Copy i Paste iz Edit menija, itd. na sličan način kao uprogramima za obradu teksta. Također je moguće kopirati dio sa<strong>dr</strong>žaja jedne ćelije u <strong>dr</strong>ugu ćeliju ili uprazan prostor u bilježnici. Kad god želimo da započnemo novu transakciju, dovoljno je da kliknemomišem ispod posljednje transakcije (prostorno gledano) u bilježnici.Da bismo izbrisati neku ćeliju (ulaznu ili izlaznu), mišem označimo odgovarajuću uglastu zagraduuz desni rub dokumenta i pritisnemo tipku |Delete| na tastaturi. Moguće je i odjednom obrisati čitavutransakciju ukoliko ozačimo uglastu zagradu koja obilježava transakciju. Također je moguće mišemobilježiti više ćelija i/ili transakcija i obrisati ih odjedanput.Sa<strong>dr</strong>žaj izlaznih ćelija nije moguće direktno mijenjati (editirati). Ukoliko probamo da editiramosa<strong>dr</strong>žaj neke izlazne ćelije, biće kreirana nova prazna ćelija neposredno ispod razmatrane izlazne ćelije(a neposredno iznad sljedeće ulazne ćelije), u koju će biti prepisan sa<strong>dr</strong>žaj razmatrane izlazne ćelije.Naknadni pritisak na |Shift| + |Enter| biće tretiran kao nova transakcija. Na primjer, vratimo li se naizlaznu ćeliju Out[2] i pokušamo na rezultat 11 dopisati +4, dobićemo situaciju koja izgleda kao nasljedećoj slici:In[2] := 5+6Out[2] = 1111+2Pritisak na |Shift| + |Enter| kreira novu transakciju:In[9] := 11+2Out[9] = 13– 3 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Bilježnicu snimamo na uobičajeni način, pomoću komande Save iz menija File. Kada sljedeći putponovo pokrenemo paket Mathematica i učitamo ranije snimljenu bilježnicu, potrebno je svakutransakciju ponovo evaluirati pritiskom na |Shift| + |Enter| da bi ona zaista bila izvršena. To nije ništaneobično s obzirom da Mathematica nije kompajler nego interpreter: bilo kakav program unesen u radnookruženje paketa Mathematica se ne prevodi u izvršni kod! Alternativno, možemo iz menija Evaluateizabrati komandu Evaluate Notebook koja će ponovo evaluirati sve transakcije pohranjene u bilježnici,redom jednu po jednu.U nastavku teksta više nećemo prikazivati oznake sa desne strane kojima se obilježavaju granicećelija, osim kada bude potrebno nešto posebno naglasiti. Također, brojeve transakcija u svakom novomodjeljku započinjaćemo od jedinice, mada oni u konkretnim slučajevima upotrebe paketa Mathematicamogu biti posve različiti. Za sve primjere koji budu navedeni po<strong>dr</strong>azumijevaće se da su izvršavani unavedenom redoslijedu, jer ponekad rezultat izvjesnih transakcija može ovisiti od rezultata izrvšavanjaprethodnih transakcija.3. Manipulacije sa brojevimaNajelementarnija vrsta podataka u paketu Mathematica su cijeli brojevi. Za obavljanje četiriosnovne računske operacije sa brojevima koriste se operatori “+”, “–“, “*” i “/”. Znakovi “+” i “-“ moguse koristiti i za zadavanje predznaka broja. Množenje i dijeljenje imaju prioritet u odnosu na sabiranje.Za promjenu prioriteta operacija mogu se koristiti zagrade, pri čemu se bez obzira na neophodni brojzagrada koriste isključivo male zagrade “(“ i “)”. Na primjer:In[1] := 2+7*(16–6*(4+9*2))/4Out[1] = –201Opseg cijelih brojeva sa kojima Mathematica može raditi ograničen je jedino kapacitetomraspoložive memorije i u praksi iznosi više stotina hiljada cifara. Na primjer:In[2] := 3842366234123678354234234 * 723345678234123456234345Out[2] = 2779359009646086917848666186402076501515725566730Ukoliko su svi operandi cijeli brojevi, rezultat je također cijeli broj, osim u slučaju operacijedijeljenja kada rezultat ne mora nužno biti cijeli broj. U tom slučaju rezultat se prikazuje u formiskraćenog razlomka p/q, tj. takvog razlomka da je NZD(p,q) = 1. Na primjer:In[3] := 28/12Out[3] =37Vidimo da Mathematica omogućava tačan rad sa razlomcima. Demonstrirajmo na primjeru malokompleksniji rad sa razlomcima:In[4] := (7+4/(3+5))/(3*2/(4+6)–1/(3+7/2))975Out[4] = 58Unošenje višestrukih razlomaka pomoću operatora “/” može biti nepregledno. Stoga Mathematicaomogućava da se razlomačka crta unosi direktno sa tastature pomoću kombinacije tipki |Ctrl| + | / |. Tako,na primjer, možemo unijeti i sljedeću transakciju:1 1In[5] := 3 25Out[5] =6– 4 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”ili, transakciju koja je ekvivalentna pretposljednjoj transakciji (da unesemo razlomak čiji je brojnik čitavizraz, prije nego što pritisnemo |Ctrl| + | / | moramo prethodno označiti odnosno markirati dio izraza kojiželimo da se pojavi u brojniku):In[6] :=3*43521463727975Out[6] =58Mathematica će dati tačan rezultat u formi razlomka jedino ukoliko su svi operandi cijeli brojevi ilirazlomci. S <strong>dr</strong>uge strane, ukoliko se u nekom broju pojavi decimalna tačka, tada će Mathematica taj brojtretirati kao aproksimativni realni broj. Ukoliko je makar jedan operand aproksimativni realni broj, čitavračun će se izvoditi aproksimativno (interno na oko 16 tačnih cifara, dok će se krajnji rezultat prikazivatisa 6 tačnih cifara). Na primjer:In[7] := 2.317 * 3.424Out[7] = 7.93341In[8] := 1.0/7Out[8] = 0.142857Zapravo, dovoljno je da se u broju pojavi decimalna tačka (makar iza nje ne stajalo ništa) da bi broj bioshvaćen kao aproksimativni broj:In[9] := 1./7Out[9] = 0.142857Odavde vidimo da je jedan od načina da kao rezultat dobijemo decimalni broj a ne razlomak daupotrebimo tačku u makar jednom od operanada:In[10] := (7.+4/(3+5)) / (3*2/(4+6)–1/(3+7/2))Out[10] = 16.8103Kasnije ćemo vidjeti da ovo nije najbolji način. Prvo, ovako ne možemo podešavati tačnost rezultata, a<strong>dr</strong>ugo, svi međurezultati se također računaju aproksimativno, zbog čega postoji mogućnostnagomilavanja greške u složenijim računanjima.Sljedeći operator koji se često koristi je operator stepenovanja “^”. Na primjer:In[11] := 2^50Out[11] = 1125899906842624Operator stepenovanja ima veći prioritet od množenja i dijeljenja, tako da je 2^3*4 isto što i(2^3)*4, a ne 2^(3*4). Također, operator stepenovanja je asocijativan nadesno, tako da je 2^3^4 istošto i 2^(3^4), a ne (2^3)^4. Umjesto operatora stepenovanja moguće je pisati izraz u obliku stepena saeksponentom, što je pomoću tastature moguće postići pritiskom na kombinaciju tipki |Ctrl| + |6|:In[12] := 2 50Out[12] = 1125899906842624Prilikom stepenovanja, rezultat će uvijek biti izražen kao tačan broj sve dok su u izrazu upotrebljenisamo tačni brojevi (cijeli brojevi i razlomci). Međutim, rezultat često može da bude iracionalan broj.Mathematica veliku klasu iracionalnih brojeva zna da zapamti tačno (npr. sve algebarske brojeve, tj.brojeve koji mogu biti nule nekog polinoma sa cjelobrojnim koeficijentima):In[13] := 2^(1/2)Out[13] = 2– 5 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[14] := 45^(1/2)Out[14] = 3 5In[15] := 2^(1/7)Out[15] = 2 1/7U posljednjem primjeru, program je zaključio da je najbolje ostaviti rezultat u izvornom obliku ukolikoželimo da ga tretiramo kao tačan broj. Naravno, jedan od načina (mada ne i najbolji) da dobijemoaproksimativne rezultate je da kao neki od operanada upotrebimo aproksimativni broj:In[16] := 2^(1/2.)Out[16] = 1.41421In[17] := 45 ^ .5Out[17] = 6.7082In[18] := 2. ^ (1/7)Out[18] = 1.10409Iz navedenih primjera vidimo i da se dio ispred decimalne tačke također smije izostaviti ukoliko jejednak nuli (recimo, smijemo pisati .5 umjesto 0.5).U slučaju da probamo izvršiti nedozvoljenu operaciju, recimo 0/0, Mathematica će ispisati porukuupozorenja. Poruke upozorenja su često dosta čudne, dok se korisnik ne navikne na njihovo tumačenje, sobzirom da su posljedica načina na koji Mathematica interno predstavlja podatke i operacije nad njima.Mathematica automatski po<strong>dr</strong>azumijeva množenje na mnogim mjestima gdje bi se onopo<strong>dr</strong>azumijevalo u standardnoj matematici ukoliko se znak množenja izostavi. Na primjer, faktori ispredzagrada mogu se pisati bez znaka množenja:In[19] := 3(5+6)Out[19] = 33In[20] := (3+8)(5+4)Out[20] = 99U većini slučajeva Mathematica običan razmak ukoliko se nalazi između operanada tretira kaonevidljivi operator množenja, što može djelovati pomalo neobično, ali ćemo vidjeti da je ovo svojstvojako praktično kod simboličkih računanja koje ćemo uskoro upoznati:In[21] := 2 3Out[21] = 6Pored osnovnih računskih operacija, Mathematica poznaje i brojne matematičke funkcije, poputlogaritamskih, trigonometrijskih, i <strong>dr</strong>ugih funkcija. Međutim, dok je u standardnoj matematici f(x)sintaksa za računanje vrijednosti funkcije f u tački x, u paketu Mathematica se umjesto običnih zagradakoriste uglaste zagrade, odnosno f[x] da se izbjegnu eventualne konfuzije sa zagradama koje o<strong>dr</strong>eđujuprioritet operacija. Naime, u izrazu poput a(x+3) može biti nejasno da li je to “a što množi x plus 3” ili“funkcija a od x plus 3”. Stoga je sintaksa za poziv funkcija u paketu Mathematica sljedeća:funkcija[argument]Za funkcije koje imaju više argumenata sintaksa je sljedeća:funkcija[argument 1 , argument 2 ,...argument N ]Mathematica poznaje nekoliko hiljada ugrađenih funkcija, a postoji i mogućnost da korisnik samdefinira svoje funkcije. Na primjer, jedna od ugrađenih funkcija je funkcija Sqrt, koja računa kva<strong>dr</strong>atnikorijen svog argumenta:– 6 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[22] := Sqrt[49]Out[22] = 7In[23] := Sqrt[27]Out[23] = 3 3In[24] := Sqrt[27.]Out[24] = 5.19615Mathematica pravi striktnu razliku između malih i velikih slova. Tako se funkcija Sqrt ne možepisati kao sqrt ili SQRT. Na primjer:In[25] := sqrt[9]Out[25] = sqrt[9]General::spell : Possible spelling error: new symbol name "sqrt" is similar to existing symbol "Sqrt".Paket Mathematica nije prepoznao funkciju sqrt i ostavio ju je neizračunatu, uz upozorenje da jevjerovatno trebala da bude upotrijebljena funkcija sličnog imena Sqrt. Treba zapamtiti da sve ugrađenefunkcije paketa Mathematica (i svi <strong>dr</strong>ugi ugrađeni simboli) imaju veliko početno slovo, a ostala malaslova, osim ukoliko se ime funkcije sastoji od više riječi. U tom slučaju, početno slovo svake riječi jeveliko, a između riječi ne postoji razmak (npr. ArcSin). Ukoliko pogriješimo u broju argumenata kojefunkcija zahtijeva, dobićemo također poruku o grešci.Mathematica poznaje i alternativnu sintaksu za pozivanje funkcija koje posjeduju jedan argument,koja često može biti jako praktična, a to je sintaksaargument // funkcijaNa primjer,In[26] := 49 // SqrtOut[26] = 7U ovom slučaju funkcija se zadaje u postfiksnoj formi, slično kao što se funkcije zadaju kod većinedžepnih kalkulatora, kada se oznaka funkcije zadaje tek nakon što se zada argument. Postfiksna formamože biti praktična kada se neka funkcija treba primijeniti na neki složeniji izraz. Na primjer, izrazpoput(7+4/(3+5))/(3*2/(4+6)–1/(3+7/2)) // Sqrtmože biti praktičniji i pregledniji od izrazaSqrt[(7+4/(3+5))/(3*2/(4+6)–1/(3+7/2))]Također, prilikom formiranja kompozicije funkcija, kada se, recimo, na argument x primijenjuje prvofunkcija f, zatim na njen rezultat funkcija g, a zatim na njen rezultat funkcija h, standardna matematičkanotacija koristi zapis oblika h(g(f(x))). U paketu Mathematica ova kompozicija se može prikazati na dvameđusobno ekvivalentna načina h[g[f[x]]] i x // f // g // h. Drugi način često može biti prikladniji. Ipak,treba voditi računa da operator poziva funkcije “//” ima veoma nizak prioritet, niži od svih računskihoperacija (poput sabiranja itd.), tako da se u izrazu poput 2+3//Sqrt funkcija Sqrt primjenjuje na čitavizraz 2+3 a ne samo na operand 3.Slično kao što razlomke možemo unositi direktno sa tastature, moguće je i znak za korjenovanjetakođer unijeti direktno sa tastature koristeći kombinaciju tipki |Ctrl| + |2|. Na primjer, možemo izvršitisljedeću transakciju:In[27] := 16 36 1Out[27] = 3– 7 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Veoma često je potrebno iskoristiti ulaz u neku transakciju ili rezultat neke transakcije za daljaizračunavanja. Za tu svrhu koriste se funkcije In i Out. Tako, In[n] predstavlja ulaz u n-tu transakciju,dok je Out[n] rezultat n-te transakcije. Tako, na primjer, možemo pisati Out[1]+6*Out[3] (rezultat ćebiti –187 ako su prva i treća transakcija bile onakve kakve su ovdje prikazane). Umjesto Out[n]skraćeno se može pisati %n (npr. %1+6*%3). Sam znak % skraćenica je za rezultat posljednjetransakcije, što se veoma često koristi. Na primjer:In[28] := 13*27–95Out[28] = 256In[29] := Sqrt[%]Out[29] = 16In[30] := %^2Out[30] = 256Veoma važna funkcija je funkcija N, koja pretvara tačan broj koji je proslijeđen kao argument uaproksimativni realan broj. Ova funkcija se često koristi kada želimo da dobijemo rezultat iskazan uobliku decimalnog broja. Na primjer:In[31] := N[Sqrt[2]]Out[31] = 1.41421Funkcija N najčešće se koristi u postfiksnoj formi:In[32] := Sqrt[2] // NOut[32] = 1.41421In[33] := 1/7+3/6 // NOut[33] = 0.642857Mada se u posljednjem slučaju dobija isti rezultat kao primjenom izraza 1./7+3/6, između ova dva izrazaje velika razlika. Naime, kod izraza 1/7+3/6 // N, prvo se izračunava izraz 1/7+3/6 kao tačan broj (čimese dobija rezultat 9/14), nakon čega se ovaj tačan broj aproksimira približnim decimalnim brojem. S<strong>dr</strong>uge strane, kod izraza 1./7+3/6 sav račun vrši se sa aproksimativnim brojevima, što kod složenijihproračuna može dovesti do akumuliranja greške.Funkcija N može se upotrebiti i sa dva argumenta. Pri tome, <strong>dr</strong>ugi argument predstavlja broj tačnihcifara koje želimo da dobijemo u aproksimativnom rezultatu. Na primjer:In[34] := N[1/19, 20]Out[34] = .05263157894736842105In[35] := N[Sqrt[2], 40]Out[35] = 1.414213562373095048801688724209698078570U ovim primjerima dobili smo 1/19 aproksimirano na 20 tačnih cifara i 2 aproksimiran na 40tačnih cifara. Međutim, da bi se aproksimacija izvršila sa proizvoljnom tačnošću, prvi argument morabiti tačan broj ili aproksimativni broj veće preciznosti od one koja se traži, inače se aproksimacija nemože izvršiti sa većom tačnošću, kao npr. u sljedećem primjeru:In[36] := N[Sqrt[3.7], 30]Out[36] = 1.92354U ovom primjeru 3.7 je aproksimativni realni broj o<strong>dr</strong>eđene fiksne tačnosti, pa je i njegov korijenizračunat aproksimativno kao broj iste tačnosti, kojem je tačnost nemoguće povećati. Da bismo dobilizahtijevanu tačnost, sve što trebamo uraditi je da preformuliramo ovaj izraz tako da se u njemu nepojavljuju aproksimativni već samo tačni brojevi (<strong>dr</strong>ugim riječima, da ne upotrebimo decimalnu tačku):– 8 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[37] := N[Sqrt[37/10], 30]Out[37] = 1.92353840616713447518553629212Mathematica poznaje veliki broj matematičkih konstanti koje pamti kao tačne brojeve, kao što sunpr. konstante “” i “e”, koje pri unosu možemo zadavati kao Pi i E, a koje se pri ispisu prikazuju kaotačni brojevi “” i “ ”:In[38] := 2*Pi*PiOut[38] = 2 2Naravno, primjenom funkcije N moguće je dobiti numeričke aproksimacije:In[39] := Pi*Pi // NOut[39] = 19.7392In[40] := N[Pi, 100]Out[40] = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680Ukoliko želimo, moguće je da umjesto simbola Pi direktno sa tastature unesemo znak “”.Mathematica omogućava da se pomoću tastature unese više stotina različitih znakova koji ne postoje natastaturi. Za tu svrhu se koristi tipka |Esc|: prvo se pritisne |Esc|, zatim se otkuca jedan ili višekarakterističnih znakova, a zatim ponovo tipka |Esc|. Na primjer, da bi smo dobili znak “”, pritisnemoprvo |Esc|, zatim slovo “p”, a nakon toga ponovo |Esc|, što ćemo skraćeno pisati kao |Esc| p |Esc|. Na tajnačin možemo izvršiti transakciju poput sljedeće:In[41] := 2 // NOut[41] = 19.7392Slično, konstantu “ ” možemo unijeti kao |Esc| ee |Esc| (slovo “e” javlja se dva puta). Alternativno, svenestandardne simbole, kao i razlomke, korijene itd. moguće je unositi koristeći odgovarajuće paletesimbola iz menija, slično kao što se koriste opcije Insert Symbol ili Equation Editor u Microsoft Word-u.Kompleksni brojevi također za sistem Mathematica ne predstavljaju nikakav problem. Imaginarnajedinica zadaje se kao I, a prilikom ispisa prikazuje se kao simbol “ ”:In[42] := (2+3I) (5+6I)Out[42] = –8 + 27Znak “ ” također možemo unijeti sa tastature, koristeći kombinaciju |Esc| ii |Esc|.Realni i imaginarni dio kompleksnog broja možemo izdvojiti pomoću funkcija Re i Im. FunkcijaConjugate daje konjugirano kompleksnu vrijednost kompleksnog broja, dok apsolutnu vrijednostkompleksnog broja možemo dobiti pomoću funkcije Abs (naravno, ova funkcija radi i sa realnimbrojevima):In[43] := Abs[3+4I]Out[43] = 5In[44] := (2+3I) (5+6I) // Re28Out[44] = 61In[45] := (2+3I) (5+6I) // Abs // NOut[45] = 28.1603Trigonometrijske funkcije pišu se redom kao Sin, Cos, Tan, Cot, Sec i Csc, a prihvataju argumenteu radijanima. Ukoliko želimo argument zadati u stepenima, možemo ga pomnožiti sa konstantomDegree koja ima vrijednost /180:– 9 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[46] := Sin[Pi/3]3Out[46] =2In[47] := Sin[Pi/5]1 1(5 2 2Out[47] = 5)In[48] := Sin[90 Degree]Out[48] = 1Umjesto konstante Degree možemo koristiti i simbol “” sa istim značenjem, koji možemo dobitipomoću tastature koristeći kombinaciju tipki |Esc| deg |Esc|:In[49] := Sin[23] // NOut[49] = 0.39073Sve funkcije koje Mathematica poznaje pokušavaju da kao rezultat daju tačan broj ukoliko su kaoargumenti zadani tačni brojevi. Ukoliko se kao rezultat ne može dobiti tačan broj, ili ukoliko je rezultatizražen kao tačan broj isuviše rogobatan, Mathematica ostavlja funkciju neizračunatu, osim ako smoeksplicitno zatražili numeričku aproksimaciju pomoću funkcije N:In[50] := 2+3+Sin[2]Out[50] = 5+Sin[2]In[51] := 3*Cos[Pi/8]Out[51] = 3Cos 8In[52] := 3*Cos[Pi/8] // NOut[52] = 2.77164Kasnije ćemo vidjeti kako možemo dobiti tačan rezultat za npr. cos /8 izražen preko korijena.Inverzne trigonometrijske (ciklometrijske) funkcije pišu se kao ArcSin, ArcCos, ArcTan, ArcCot,ArcSec i ArcCsc. Sve one vraćaju rezultat u radijanima (u slučaju da želimo rezultat u stepenima,uvijek možemo rezultat podijeliti konstantom Degree). Funkcija ArcTan može se upotrebiti i sa dvaargumenta: ArcTan[x, y] računa arkus tangens od y/x, ali uzimajući u obzir kva<strong>dr</strong>ant u kojem leži tačka(x, y) u koordinatnom sistemu, tako da se dobija rezultat u opsegu od – do (umjesto od –/2 do /2).Ova funkcija je korisna kada treba izračunati argument (polarni ugao) kompleksnog broja x + y .. Za istusvrhu moguće je koristiti i funkciju Arg koja ima samo jedan argument – kompleksan broj čiji seargument traži.Hiperbolne funkcije pišu se kao Sinh, Cosh, Tanh, Coth, Sech i Csch, a njima inverzne funkcije(area funkcije) kao ArcSinh, ArcCosh, ArcTanh, ArcCoth, ArcSech i ArcCsch.Logaritamska funkcija Log može se upotrebiti sa jednim argumentom, ili sa dva argumenta. Uprvom slučaju, po<strong>dr</strong>azumijeva se baza e, a u <strong>dr</strong>ugom slučaju prvi argument predstavlja bazu a <strong>dr</strong>ugilogaritmand. Rezultat se uvijek svodi na bazu e, osim ukoliko se rezultat može iskazati tačno, ili ukolikoje zatražena numerička aproksimacija:In[53] := Log[2, 3]Log[3]Out[53] =Log[2]In[54] := Log[2, 3] // NOut[54] = 1.58496– 10 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[55] := Log[2, 3.]Out[55] = 1.58496In[56] := Log[10, 1000]Out[56] = 3Inverzna funkcija funkciji Log je eksponencijalna funkcija Exp. Exp[x] je zapravo isto što i E^x.Sve elementarne funkcije Mathematica zna izračunati i za kompleksne vrijednosti argumenata:In[57] := Sqrt[5+12I]Out[57] = 3 + 2In[58] := %^2Out[58] = 5 + 12In[59] := Exp[2+ 9I] // NOut[59] = –6.73239 + 3.04517Isto vrijedi i za većinu <strong>dr</strong>ugih funkcija (preciznije, za sve funkcije koje se mogu smisleno definirati zakompleksne argumente).Operatori poput “+”, “–“, “*”, “/”, “^” itd. koji stoje između operanada zovu se infiksni operatori.Postoje i prefiksni operatori koji stoje ispred operanada, kao i postfiksni operatori koji stoje izaoperanada. Primjer prefiksnog operatora je unarni minus za promjenu predznaka koji stoji ispred broja(npr. –2). Najtipičniji primjeri postfiksnih operatora u paketu Mathematica su faktorijel “!” ipolufaktorijel “!!”. Faktorijel n! je produkt svih prirodnih brojeva od 1 do n, dok je polufaktorijel n!!produkt svih parnih odnosno neparnih brojeva od 2 do n odnosno od 1 do n, ovisno da li je n paran ilineparan:In[60] := 7!Out[60] = 5040In[61] := 7!!Out[61] = 105Treba voditi računa da funkcija faktorijel raste veoma brzo:In[62] := 150!Out[62] = 57133839564458545904789328652610540031895535786011264182548375833179829124845398393126574488675311145377107878746854204162666250198684504466355949195922066574942592095735778929325357290444962472405416790722118445437122269675520000000000000000000000000000000000000Zatražimo li numeričku aproksimaciju ovako velikog broja, kao rezultat ćemo dobiti broj prikazan ueksponencijalnoj notaciji (isto vrijedi i za veoma male brojeve):In[63] := % // NOut[63] = 5.71338 10 262Faktorijel od 1000000 ima 5565709 cifara, stoga bi ako zadate komandu poput 1000000! na rezultatčekali poprilično dugo (ako bi računar uopće imao dovoljno memorije da iziđe na kraj sa tolikimbrojem). Kao indikator da je sistem Mathematica zauzet računanjem rezultata neke transakcije, zagradakoja ograđuje ulaznu ćeliju te transakcije sa desne strane bilježnice postaje podebljana i obojena<strong>dr</strong>ugačijom bojom. Sve dok se izvođenje transakcije ne završi, sistem Mathematica ne može izvoditi<strong>dr</strong>uge transakcije, mada je editiranje u bilježnici moguće. Pošto neke transakcije mogu potrajati veomadugo, postoji način da se izvođenje transakcije obustavi. Za tu svrhu dovoljno je izabrati komandu Abortevaluation iz menija Kernel (isti efekat može se postići i kombinacijom tipki |Alt| + |.|). Umjestorezultata obustavljene transakcije ispisuje se simbol $Aborted:– 11 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[64] := 1000000!Out[64] = $AbortedUkoliko ova komanda ne pomogne, <strong>dr</strong>astičnija varijanta je izabrati komantu Quit kernel iz istog menija.Ova komanda uklanja Mathematica Kernel iz memorije (do naredne transakcije) tako da će gotovosigurno pomoći u slučaju kada se Mathematica “zaglavi”. Nuspojava ove komande je što će numeracijanarednih transakcija ponovo početi od jedinice, kao i što će ulazne i izlazne transakcione liste bitiizbrisane, s obzirom da se Mathematica Kernel mora ponovo pokrenuti. Stoga, ovu komandu trebakoristiti samo ukoliko Abort Evaluation ne pomogne. Ukoliko ne pomogne ni komanda Quit kernel (štoje zaista rijetkost), kao krajnje rješenje možete snimiti sa<strong>dr</strong>žaj bilježnice (to je moguće i dok je računanjeu toku), napustiti poptuno program, ponovo ga pokrenuti, i na kraju ponovo učitati sa<strong>dr</strong>žaj bilježnice.U sljedećoj tablici navedene su još neke od poznatijih matematičkih funkcija koje Mathematicapoznaje. Neke od navedenih funkcija same za sebe nisu osobito korisne, ali se mogu lijepo upotrebitiunutar složenijih izraza, prilikom definiranja vlastitih funkcija, ili pri programiranju.Floor[x]Ceiling[x]IntegerPart[x]Matematička funkcija x : daje kao rezultat najveći cijeli broj koji jemanji ili jednak od x.Matematička funkcija x : daje kao rezultat najmanji cijeli broj koji jeveći ili jednak od x.Daje kao rezultat cijeli dio broja x (pozitivni brojevi se zaokružujunaniže, a negativni naviše).FractionalPart[x] Daje kao rezultat decimalni dio broja x.Round[x]Quotient[x, y]Daje kao rezultat x zaokružen na najbliži cijeli broj.Daje kao rezultat cijeli dio od količnika x/y.Mod[x,y] Daje kao rezultat ostatak cjelobrojnog dijeljenja x sa y.Max[x 1 , x 2 , ...] Daje kao rezultat najveći od brojeva x i .Min[x 1 , x 2 , ...] Daje kao rezultat najmanji od brojeva x i .GCD[x 1 , x 2 , ...]LCM[x 1 , x 2 , ...]Sign[x]Binomial[n, k]Multinomial[n, k 1 , k 2 , ...]Prime[n]PrimePi[n]EulerPhi[n]DivisorSigma[n, k]PowerMod[x, y, n]Daje kao rezultat najveći zajednički djelilac brojeva x i , tj najveći broj xsa svojstvom da su svi količnici x i /x cijeli brojevi.Daje kao rezultat najmanji zajednički sa<strong>dr</strong>žilac brojeva x i , tj najmanjibroj x sa svojstvom da su svi količnici x/x i cijeli brojevi.Signum funkcija: rezultat je 1 ako je x>0, –1 ako je x


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Fibonacci[n]HarmonicNumber[n]Daje kao rezultat n-ti Fibonaci-jev broj F n (Fibonaci-jevi brojevi sudefinirani induktivnom relacijom F 1 = F 2 = 1 i F n = F n–1 +F n–2 , a mogu sedefinirati čak i za slučaj kada n nije cijeli broj, što je u paketuMathematica urađeno).Daje kao rezultat sumu harmonijskog reda 1/1+1/2+...+1/n.HarmonicNumber[n, k] Daje kao rezultat sumu hiperarmonijskog reda 1/1 k +1/2 k +...+1/n k .Ukoliko bilo kojoj od funkcija zadamo argument izvan njenog domena, Mathematica će prostofunkciju ostaviti neizračunatu (eventualno uz izdavanje poruke upozorenja):In[65] := Prime[12.5]Prime::intpp : Positive integer argument expected in Prime[12.5].Out[65] = Prime[12.5]Pored rada sa individualnim brojevima Mathematica poznaje i rad sa listama. Lista je zapravouređeni niz <strong>dr</strong>ugih objekata (recimo, brojeva), koje ćemo nazvati elementi liste. Liste zadajemo tako štonjene elemente navedemo unutar vitičastih zagrada. Na primjer:In[66] := {3, 9, 4, 5, 4}Out[66] = {3, 9, 4, 5, 4}U ovom slučaju sistem Mathematica je prosto ponovio listu koju smo mu zadali, što nije osobitokorisno. Mnogo korisnija je činjenica da gotovo sve matematičke funkcije koje Mathematica poznajeprihvataju liste kao svoje argumente, pri čemu se funkcija primjenjuje na svaki element listepojedinačno:In[67] := Sqrt[{3,9,4,5,4}]Out[67] = { 3 , 3, 2, 5 , 2}In[68] := % // NOut[68] = {1.73205, 3, 2, 2.23607, 2}Operatori poput “+”, “–”, “*”, “/ ” i “^” mogu se primjenjivati i kada su operandi liste, pod uvjetomda su obje liste jednake dužine. U tom slučaju, operacije se vrše nad odgovarajućim elementima objeliste:In[69] := {3, 9, 4, 5, 4} * {2, 6, 1, 3, 2}Out[69] = {6, 54, 4, 15, 8}Također, isti operatori mogu se primijeniti i kada je jedan argument broj a <strong>dr</strong>ugi lista. Tada se operacijaprimjenjuje nad tim brojem i svakim od elemenata liste:In[70] := 6 * {3, 9, 4, 5, 4}Out[70] = {18, 54, 24, 30, 24}In[71] := %/3Out[71] = {6, 18, 8, 10, 8}In[72] := % 2Out[72] = {36, 324, 64, 100, 64}In[73] := 16 / %4 4 1 4 1Out[73] = { , , , , }9 81 4 25 4Kasnije ćemo vidjeti da elementi listi u paketu Mathematica ne moraju biti samo brojevi, nego bilokakvi objekti koje Mathematica, poznaje, pa tako i same liste. Tako je, na primjer, lista– 13 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”{3, 4, {1, 2}, 5, {{2}, 3}, {}} sasvim legalna. Ova lista ima 6 elemenata: broj 3, broj 4, lista čiji suelementi brojevi 1 i 2, broj 5, lista čiji su elementi lista čiji je element 2 i broj 3, i konačno, prazna lista.Nad ovakvim složenim listama također se mogu primjenjivati sve funkcije koje se mogu primjenjivati ina proste liste. Specijalno, nad dvije složene liste mogu se primjenjivati i binarne operacije, pod uvjetomda su saglasne po strukturi. Na primjer:In[74] := {3, {2, 5}, 4} + {5, {1, 2}, {3, 3, 1}}Out[74] = {8, {3, 7}, {7, 7, 5}}U ovom primjeru smo imali 3 + 5 = 8, {2, 5} + {1, 2} = {3, 7} i 4 + {3, 3, 1}={7, 7, 5}.Mathematica poznaje i rad sa brojevima koji nisu zapisani u bazi 10. Brojeve zapisane uproizvoljnom brojnom sistemu možemo pisati kaobaza ^ ^ eksponentNa primjer, sljedeći broj predstavlja broj (100101101) 2 zapisan u binarnom sistemu (čija je dekadnavrijednost 301):In[75] := 2^^100101101Out[75] = 301U slučaju baza većih od 10, nedostajuće cifre iznad 10 pišu se kao slova abecede a, b, c itd. pričemu se ravnopravno mogu koristiti mala ili velika slova. Na primjer, slijedeći broj predstavljaheksadekadni broj (2d3b) 16 :In[76] := 16^^2d3bOut[76] = 11579Obrnuta pretvorba može se ostvariti pomoću funkcije BaseForm sa dva argumenta, koja ispisujevrijednost izraza datog prvim argumentom u bazi datoj <strong>dr</strong>ugim argumentom:In[77] := BaseForm[301, 2]Out[77] // BaseForm =100101101 2In[78] := BaseForm[11579, 16]Out[78] // BaseForm =2d3b 16In[79] := BaseForm[2^^10110101 + 2^^11001011, 2]Out[79] // BaseForm =110000000 2U posljednjem primjeru smo zapravo izračunali zbir (10110101) 2 + (11001011) 2 i rezultat ponovoprikazali u binarnom obliku. Primijetimo da u ovim primjernima u izlaznim ćelijama umjestouobičajenog Out[n] piše Out[n]//BaseForm. To je posljedica činjenice da se sa<strong>dr</strong>žaj izlazne ćelijezapravo čuva u dekadnom obliku, kako je i uobičajeno, a baza se koristi samo za potrebe ispisa, u šta selako možemo uvjeriti:In[80] := %Out[80] = 384Funkcije poput BaseForm, koje samo utječu na način ispisa ali ne i na način izračunavanja i pamćenjarezultata u izlaznoj listi nazivaju se funkcije omotači (engl. wrapper functions).– 14 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”4. Upotreba promjenljivih i simboličko računanjePromjenljive predstavljaju jedan od fundamentalnih objekata u većini programskih jezika.Promjenljive u paketu Mathematica pružaju znatno više fleksibilnosti nego promjenljive u klasičnimprogramskim jezicima, stoga će im biti posvećeno više pažnje.Promjenljive, slično promjenljivim u matematici, zapravo predstavljaju imena kojima su dodijeljeneo<strong>dr</strong>eđene vrijednosti. U matematici su imena promjenljivih obično ograničena samo na jedno slovo, dokse u sistemu Mathematica (kao i u klasičnim programskim jezicima) imena promjenljivih mogu sastojatiod više znakova. U sistemu Mathematica imena promjenljivih mogu se sastojati od slova engleskogalfabeta i cifara, pri čemu prvi znak ne smije biti cifra (npr. “a2” je legalno ime, ali “2a” nije). Poredslova engleskog alfabeta i cifara dozvoljeni su još neki specijalni znaci, ali u detalje nećemo ulaziti. Imene smije sa<strong>dr</strong>žavati razmake. Velika i mala slova se razlikuju, tako da “Abc” i “abc” predstavljaju dvarazličita imena.Promjenljivoj možemo dodijeliti vrijednost pomoću operatora dodjele “=”. Tipičan primjerupotrebe operatora dodjele ima oblik ime = izraz. Na primjer:In[1] := a=5Out[1] = 5In[2] := a+2Out[2] = 7Ovim je ime “a” postalo promjenljiva čija je vrijednost 5, i svaka upotreba imena “a” u računu bićezamijenjena sa vrijednošću 5. Promjenljiva za<strong>dr</strong>žava svoju vrijednost sve do nove dodjele, ili do brisanjavrijednosti pomoću naredbe Clear, o čemu će biti govora kasnije. Primijetimo da je rezultat operatoradodjele jednak upravo dodijeljenoj vrijednosti, što omogućava lančano dodjeljivanje, kao u sljedećemprimjeru:In[3] := a=b=c=12Out[3] = 12In[4] := a+b*cOut[4] = 156Ukoliko želimo da spriječimo ispisivanje rezultata izvršavanja neke komande, komandu možemozavršiti znakom tačka-zarez (“;”). To je posebno važno prilikom kreiranja programa, jer bi, usuprotnom, prilikom izvršavanja programa bili ispisivani brojni međurezultati koji nas ne zanimaju. Naprimjer:In[5] := a=20;Rezultat nije ispisan. Međutim, lako se možemo uvjeriti da je dodjela a=20 ipak izvršena:In[6] := aOut[6] = 20Znak “;” također može služiti i kao separator koji omogućava da više izraza (tipično u formikomandi) zadamo u jednom redu. Također, prilikom dodjeljivanja, sa desne strane operatora dodjelemože se nalaziti izraz, a ne samo brojčana vrijednost:In[7] := put = 300; vrijeme = 6; brzina = put/vrijemeOut[7] = 50Vidimo da se u ovom slučaju prikazuje rezultat izvršavanja samo posljednje komande. Da smo iposljednju komandu završili tačka-zarezom, ne bi bilo prikazano ništa (mada bi sve dodjele bile ispravnoizvršene).– 15 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Ono u čemu se algebarski računarski sistemi kao što je Mathematica suštinski razlikuju od klasičnihprogramskih jezika kao što su Pascal, C, C++ itd. je mogućnost rada sa promjenljivim koje nemajunikakvu definiranu vrijednost. U tom slučaju one se smatraju za simbole (što donekle odgovara pojmuopćeg broja u matematici). Mathematica automatski vrši neka elementarna sređivanja nad izrazima kojisa<strong>dr</strong>že simbole:In[8] := y^5 + x*x + 2 + 5*x + x/x – x*3Out[8] = 3 + 2 x + x 2 + y 5U simboličkim rezultatima simboli se uvijek sortiraju po abecedi (tako da se umjesto y + x dobijax + y, a umjesto y – x dobija se –x + y itd.). Također, članovi sa nižim stepenima simbola uvijek se nalazeispred članova sa višin stepenima, a slobodni članovi ispred članova koji sa<strong>dr</strong>že simbole. Možemoprimijetiti da je sistem Mathematica automatski izvršio kraćenje u izrazu x/x (tj. izvršio njegovuzamjenu sa 1) mada je takvo kraćenje dozvoljeno samo za x 0. Mathematica u ovakvim situacijamapo<strong>dr</strong>azumijeva produženje po neprekidnosti, tj. u graničnim tačkama definicionog po<strong>dr</strong>učjapo<strong>dr</strong>azumijevaju se granične vrijednosti (tj. smatra se da je x/x = 1 bezuvjetno). Mada ova konvencijamože ponekad da smeta, njome se izbjegava generiranje veoma složenih izraza koji bi mogli da nastanuukoliko se ovakva kraćenja ne bi vršila bezuvjetno.Podsjetimo se da se znak množenja “*” u sistemu Mathematica može zamijeniti razmakom, tj.umjesto x * y možemo pisati samo x y. Razmak se može i izostaviti ako to neće dovesti do zabune. Tako,na primjer, možemo pisati 2x umjesto 2 * x ili 2 x, ali ne možemo pisati xy umjesto x * y, jer će xy bitishvaćeno kao jedna promjenljiva sa imenom “xy ”. S <strong>dr</strong>uge strane, x y možemo pisati umjesto produktax * y.Ukoliko je potrebno da uklonimo vrijednost koju posjeduje neka promjenljiva (tj. da je pretvorimo usimbol bez vrijednosti), možemo koristiti funkciju Clear kod koje u uglastim zagradima navodimo imepromjenljive ili popis imena razdvojen zarezima kojima brišemo vrijednosti. Na primjer:In[9] := Clear[a,b,c]Funkcija (naredba) Clear ne daje nikakav rezultat. Nakon ove naredbe promjenljive “a”, “b” i “c” (kojesu ranije imale vrijednost) postaju ponovo simboli bez vrijednosti:In[10] := a+b+cOut[10] = a+b+cPromjenljive u paketu Mathematica mogu čuvati daleko složenije strukture podataka nego uklasičnim programskim jezicima (poput Pascal-a, C-a, C++-a, itd.), kao što su liste, matrice, skupovi,algebarski izrazi, pa čak i grafikoni, crteži, geometrijski objekti itd. Tako, promjenljiva u sebi možečuvati izraz u kojem se javljaju simboli, odnosno <strong>dr</strong>uge nedefinirane promjenljive. Na primjer,promjenljiva x može kao svoju “vrijednost” sa<strong>dr</strong>žavati izraz (a+b)/(a–b) gdje su a i b nedefiniranepromjenljive. Ilustrirajmo ovo na jednom primjeru:In[11] := x=a+b–3; y=a–b;In[12] := x+yOut[12] = –3 + 2 aIzrazi mogu pored nedefiniranih promjenljivih sa<strong>dr</strong>žavati i nedefinirane funkcije. Naravno,Mathematica ne može izračunati vrijednost nedefiniranih funkcija, stoga ih ostavlja neizračunate, alimože izračunati ostatak izraza koji eventualno sa<strong>dr</strong>ži nedefiniranu funkciju. Na primjer:In[13] := 7+2*funkc[5+3*6]–4Out[13] = 3 + 2 funkc[23]U navedenom primjeru nedefinirana funkcija je funkcija “funkc”.– 16 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Zbog mogućnosti da promjenljive sa<strong>dr</strong>že simboličke izraze koji ne moraju imati definiranevrijednosti, paket Mathematica posjeduje dva operatora dodjele: operator trenutačne dodjele “=” ioperator zakašnjele dodjele “:=”. Kod operatora trenutačne dodjele, sa desne strane operatora dodjeleizračunava se sve što se može izračunati (eventualne nedefinirane vrijednosti ostaju neizračunate), inakon toga, izračunati objekat dodjeljuje se lijevoj strani. Kod operatora zakašnjele dodjele, desna stranase dodjeljuje lijevoj strani neizračunata (tj. u promjenljivoj se čuva kompletan izraz, a ne njegovavrijednost). Izraz u promjenljivoj izračunava se tek onog trenutka kada se ta promjenljiva upotrebi unekom <strong>dr</strong>ugom izrazu. Da bismo vidjeli kakva je razlika između ove dvije dodjele, razmotrimo sljedećiprimjer:In[14] := a=10; x=a+b+2; y:=a+b+2;In[15] := xOut[15] = 12+bIn[16] := yOut[16] = 12+bNa prvi pogled bi se moglo učiniti da obje promjenljive “x” i “y” imaju isti sa<strong>dr</strong>žaj (12+b).Međutim, taj zaključak je netačan: sa<strong>dr</strong>žaj promjenljive “x” je zaista 12+b, jer je zbir a+2 (koji je utrenutku dodjele iznosio 12) izračunat odmah prilikom dodjele, dok je sa<strong>dr</strong>žaj promjenljive “y” a+b+2(preciznije, 2+a+b zbog načina na koji Mathematica sortira izraze), a vrijednost promjenljive “a”uvrštena je tek kada je promjenljiva “y” upotrijebljena. Ovo postaje očigledno ako promijenimo sa<strong>dr</strong>žajpromjenljive “a” (ili, još očiglednije, ako izbrišemo njen sa<strong>dr</strong>žaj):In[17] := a=15;xyOut[17] = 12+bOut[18] = 17+bIn[19] := Clear[a];xyOut[19] = 12+bOut[20] = 2+a+bBitno je napomenuti da se naknadna izračunavanja prilikom upotrebe promjenljivih vrše čak i uslučaju promjenljivih koje su definirane operatorom “=” ukoliko je u njima ostalo nedefiniranih simbola.Na primjer, vrijednost promjenljive “x” sa<strong>dr</strong>ži nedefinirani simbol “b” čija će vrijednost biti uvrštenaprilikom upotrebe promjenljive:In[21] := b=4;xyOut[21] = 16Out[22] = 6+aIn[23] := a=5;xyOut[23] = 16Out[24] = 11Pri radu sa promjenljivim, obično se koristi operator trenutačne dodjele. Operator zakašnjele dodjele sekoristi samo iznimno, kada za to postoje posebni razlozi.– 17 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Nakon izloženog, postaje jasno zbog čega Mathematica elemente ulazne transakcione listeautomatski dodjeljuje pomoću operatora “:=” a elemente izlazne transakcione pomoću operatora “=”:ulazna transakciona lista čuva neizračunate ulaze u transakciju, dok izlazna transakciona lista čuvaizračunate rezultate transakcija. Sljedeći primjer jasno ilustrira razliku (u slučaju da brojevi transakcijane odgovaraju primjeru, argumente funkcija In i Out potrebno je izmijeniti u skladu sa konkretnimbrojevima transakcija):In[25] := a=10; Clear[b];In[26] := a+bOut[26] = 10+bIn[27] := a=15;In[28] := In[26]Out[28] = 15+bIn[29] := Out[45]Out[29] = 10+bZapravo, svaka upotreba In[n] u nekom izrazu dovodi do ponovnog izračunavanja ulaza u n-tutransakciju, u skladu sa trenutnom situacijom.Treba obratiti pažnju na činjenicu da se u dodjeli tipa ime = izraz prvo izračunava izraz sa desnestrane, pa se tek tada vrši dodjela. Stoga, izraz sa desne strane može sa<strong>dr</strong>žavati čak i isto ime koje senalazi sa lijeve strane, pri čemu se prilikom izračunavanja koristi vrijednost tog imena prije dodjele. Naprimjer:In[30] := a=5Out[30] = 5In[31] := a=a+2Out[31] = 7In[32] := aOut[32] = 7Naizgled besmisleni izraz poput a = a + 2 ne treba posmatrati kao “a je jednako a plus 2” (što jeočito besmislica), nego kao “imenu a dodjeljujemo staru vrijednost imena a plus 2” odnosno “novavrijednost od a postaje stara vrijednost od a plus 2”, što možemo prosto iskazati i kao “vrijednost od a sepovećava za 2”. Kako se u radu često javlja potreba da se neka promjenljiva poveća ili smanji za nekuvrijednost, odnosno pomnoži ili podijeli sa nekom vrijednošću, Mathematica je uvela posebne operatore“+=”, “=”, “*=” i “/=” (koji su preuzeti iz programskih jezika C i C++). Tako, x += y, x = y, x *= y ix /= y predstavljaju respektivno skraćenice za fraze x = x + y, x = x – y, x = x * y i x = x / y. Matematičkičistunci će reći da je ovakav zapis matematički konzistentniji, jer ne asocira na jednakost veličina kojene mogu biti jednake. Na taj način, umjesto matematički “sumnjive” naredbe a = a + 2 koju smo koristilida povećamo vrijednost promjenljive “a” za 2, isti efekat možemo postići naredbom a += 2. Također,umjesto x+=1 odnosno x=1 možemo pisati x++ odnosno x– –.Bitno je napomenuti da naredbe poput x = x + 1 (odnosno x += 1 ili ++x) imaju smisla samo ukolikoje x zaista bila promjenljiva koja posjeduje vrijednost, a ne simbol bez vrijednosti. U suprotnom možemodobiti posve neočekivane rezultate, obično praćene porukama o grešci. Također je veoma bitno shvatitida se dodjela mora shvatiti kao imperativ u kojem se desna strana eksplicitno dodjeljuje lijevoj strani.Stoga, dodjela poput 5=x nije legalna (mada je dodjela x=5 posve legalna), jer pokušava da dodijelisimbol “x” broju 5, što očito nije moguće – objekat “5” spada u tzv. “sirove” objekte, čija je vrijednostnepromjenljiva, tj. onakva je kakva je:– 18 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[33] := 5 = xOut[33] = xSet::setraw : Cannot assign to raw object 5.Iz istog razloga, nemoguće je izvršiti i dodjelu poput 5 = x+3, a pogotovo ne možemo očekivati dabi takva dodjela mogla rezultirati da vrijednost promjenljive x postane 2. Dakle, znak “=” ne smijemoshvatiti kao znak matematičke jednakosti, niti izraz “5 = x + 3” kao matematičku jednačinu (posebno,vidjeli smo da operator “=”, za razliku od matematičke jednakosti, nije komutativan). Ukoliko nam je ciljbio da riješimo jednačinu “5 = x + 3”, to trebamo uraditi na <strong>dr</strong>ugačiji način, o čemu ćemo govoritikasnije. Dodjela poput x + 3 = 5 također nije dobra, jer pomoću nje Mathematica pokušava da dodijelivrijednost 5 izrazu “x + 3”, a ne vrijednost 2 (tj. 5-3) promjenljivoj x:In[34] := x + 3 = 5Out[34] = 5Set::write : Tag Plus in 3+x is Protected.Poruka upozorenja je u ovom slučaju <strong>dr</strong>ugačija, ali također ukazuje da dodjela nije legalna. Uglavnom,poruke Set::setraw ili Set::write najčešći su pokazatelji da smo pokušali izvršiti nekorektnu dodjelu.Nema nikakvog razloga da ne možemo nekoj promjenljivoj dodijeliti listu vrijednosti. Liste mogusa<strong>dr</strong>žavati i simboličke izraze. Na primjer:In[35] := lista = {3, –5,{1, 2}, x+1, {2, {x 2 , 0}}, x+y}Out[35] = {3, –5, {1, 2}, 1+x, {2, {x 2 , 0}}, x+y}In[36] := lista 2Out[36] = {9, 25, {1, 4}, (1+x) 2 , {4, {x 4 , 0}}, (x+y) 2 }In[37] := {lista, lista 2 }Out[37] = {{3, –5, {1, 2}, 1+x, {2, {x 2 , 0}}, x+y}, {9, 25, {1, 4}, (1+x) 2 , {4, {x 4 , 0}}, (x+y) 2 }}Kasnije ćemo vidjeti kako iz listi možemo izdvajati pojedine dijelove.Dodjela koja se vrši pomoću operatora “=” i “:=” je trajna, u smislu da vrijedi sve do nove dodjele,ili eksplicitnog brisanja naredbom Clear. Ponekad je, međutim, mnogo poželjnije nekom simboludodijeliti vrijednost privremeno, preciznije samo dok traje izračunavanje nekog izraza. Na primjer,pretpostavimo da želimo da izračunamo vrijednosti izraza “(3+2 x) (2+x) 2 ” za nekoliko različitihvrijednosti promjenljive x. Jedan od načina da to postignemo je sljedeći:In[38] := izraz := (3+2 x) (2+x) 2In[39] := x = 4; izrazOut[39] = 396In[40] := x = y+1; izrazOut[40] = (3+2 (y+1)) (3+y) 2In[41] := x = –3; izrazOut[41] = –3Osnovni nedostatak ovog rješenja je što nakon svake dodjele promjenljiva “x” zardžava svojuvrijednost do nove izmjene. Stoga su u paketu Mathematica uvedena tzv. pravila. Pravila se definirajupomoću operatora “–>” (koji se sastoji od dva znaka, “–” i “>”) koji editor automatski pretvori u znak“” (koji možemo direktno unijeti sa tastature kao kombinaciju |Esc|–>|Esc|), pa ćemo ga kao takvog ipisati. Pomoću pravila tipa ime izraz (npr. x 3) moguće je izvršiti privremenu dodjelu koja vrijedisamo za vrijeme izračunavanja nekog <strong>dr</strong>ugog izraza, preciznije izraza na koji je pravilo primijenjeno. Da– 19 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”bismo primijenili pravilo na neki izraz, koristimo operator smjene “/.” (sastoji se od dva znaka, “/ ” i “.”)koji se koristi u oblikuizraz /. praviloNa primjer:In[42] := x 2 + 3 x + 4 /. x 5Out[42] = 44Ispred i iza operatora smjene “/.” veoma je dobro ostavljati po jedno prazno mjesto, jer se inače možedesiti da se znakovi “/ ” i “.” koji sačinjavaju ovaj operator “slijepe” sa onim što slijedi ispred ili iza idovedu do pogrešne interpretacije, što ćemo vidjeti kasnije.Efekat posljednje transakcije je sličan kao da smo napisali x = 5; x 2 + 3 x + 4 uz jednu bitnu razliku:u navedenom primjeru promjenljiva “x” privremeno dobija vrijednost 5 samo za vrijeme izračunavanjaizraza “x 2 + 3 x + 4” (preciznije “x” se prosto zamjenjuje sa vrijednošću 5 za vrijeme izračunavanja ovogizraza). Izvan ovog izraza ona za<strong>dr</strong>žava svoju vrijednost kakvu je imala ranije (ili ostaje bez vrijednostiako nije imala vrijednost ranije):In[43] := xOut[43] = –3In[44] := Clear[x]Slijedi da je izračunavanja istog izraza (npr. izraza “izraz” koji smo već definirali) za nekoliko različitihvrijednosti neke promjenljive mnogo pametnije obaviti na sljedeći način (jer na taj način ne kvarimoeventualno postojeću vrijednost promjenljive “x”):In[45] := izraz /. x 4Out[45] = 396In[46] := izraz /. x y+1Out[46] = (3+2 (y+1)) (3+y) 2In[47] := izraz /. x –3Out[47] = –3Naravno, promjenljiva “x” je pri tome i dalje bez vrijednosti, kako je ostalo nakon izvršavanja naredbeClear:In[48] := xOut[48] = xPravila treba koristiti gdje je god to moguće, a dodjele samo gdje je to zaista nužno, jer se često dešavada zaboravimo da obrišemo neku promjenljivu koja nam više ne treba.Dodjele poput ime = izraz treba zapravo tumačiti kao pravila oblika ime izraz koja se primjenjujuuvijek, u svakoj prilici, a ne samo na izraze koji su iskorišteni unutar operatora “/.”, i koja su, prematome, prirodna svojstva objekta nad kojim je dodjela izvršena (objekta ime). S <strong>dr</strong>uge strane, pravila netreba posmatrati kao dodjele, jer su ona znatno univerzalnija od dodjela, i nisu vezana za objekte salijeve strane pravila. Pravila je najbolje shvatiti kao upute kako se vrše smjene prilikom upotrebeoperatora smjene “/.”, i njihov opći oblik ješta se smjenjuje s čim se smjenjujeNa primjer, dok je dodjela poput 1 = 2 besmislena, pravilo 1 2 je sasvim legalno, i tvrdi da svakupojavu broja 1 treba zamijeniti sa brojem 2:– 20 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[49] := (1+x) / (1–x) /. 1 22xOut[49] =2xU ovom primjeru je razmak iza operatora “/.” bio od presudne važnosti: da njega nije bilo, tačka izoperatora “/.” bila bi shvaćena kao dio broja (tj. .1), što bi dovelo do sasvim pogrešne interpretacije:In[50] := (1+x) / (1–x) /.1 210(1x)Out[59] = 21xIz istog razloga kao kod pravila 1 2, nema ništa loše u pravilima poput 5 x, 5 x+3 i x+3 5,mada su slične dodjele bile ilegalne:In[51] := (5+x) / (5–x) /. 5 x+3Out[51] = (2+x) / (2–x)Razlog zašto je pravilo 1 2 legalno a dodjela 1 = 2 nije, leži u činjenici da pravilo 1 2 samo govorida svaku pojavu objekta “1” treba zamijeniti sa “2” prilikom izračunavanja izraza na koji je praviloprimijenjeno, dok bi dodjela 1 = 2 tvrdila da uvijek treba da 1 bude jednako 2 (tj. da se “1” zamjenjuje sa“2” uvijek). Tako nešto bi zahtijevalo za trajno mijenjanje svojstava objekta “1”, što je svakakobesmisleno.Mada su pravila vrlo moćna, ona imaju i svojih ograničenja. Pravilo poput x+3 5 tvrdi da svakupojavu izraza “x + 3” treba zamijeniti sa “5”, ali ono ne govori da “x” treba zamijeniti sa “2”. Tomožemo vidjeti i iz sljedećeg primjera:In[52] := polinom := 1 + 3 x + 2 x 2 + x 3In[53] := polinom /. 3 x tOut[53] = 1 + t + 2 x 2 + x 3Ovdje je “3 x” zaista zamijenjeno sa “t”, ali “x” na <strong>dr</strong>ugim mjestima nije zamijenjeno sa “t/3” kao što bise moglo očekivati. Naime, pravila samo zamjenjuju doslovnu pojavu lijeve strane desnom, bez ikakvihimplicitnih zaključaka čime treba zamijeniti promjenljive koje figuriraju u lijevoj strani. Eventualno sena izraz u kojem se vrši smjena primjenjuju komutativni i distributivni zakoni da se ustanovi mogućnostprimjene smjene. Na primjer:In[54] := u + v + w /. w + u zOut[54] = v + zOvo ograničenje možemo izbjeći tako da željenu smjenu uvijek, ukoliko je to moguće, izrazimo što jegod moguće eksplicitnije po objektu koji želimo da smijenimo:In[55] := polinom /. x t / 32 32 t tOut[55] = 1 + t + 9 27Ovim smo dobili ono što smo vjerovatno željeli da dobijemo. Razlog za ovo prividno ograničenjeoperatora smjene leži u činjenici da je često potrebno primijeniti neke smjene koje je teško ili nemogućeeksplicitno izraziti. Na primjer, u izrazu 2 + 3 (x + Cos[x]) + (x + Cos[x]) 2 sasvim je legalno primijenitipravilo x + Cos[x] y i dobiti 2 + 3 y + y 2 , mada je iz navedenog pravila nemoguće izraziti eksplicitno xpreko y (tako da bi izraz 2 x + 3 (x + Cos[x]) nakon primjene istog pravila rezultirao izrazom 2 x + 3 y, štoje zapravo najbolje što se uopće može postići).– 21 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Prilikom primjene pravila, nikada se pravilo ne primjenjuje na dio izraza u kojem je već iskorišteno.Da nije tako, slijedeći primjer bi doveo do petlje bez izlaza (jer bi se, u suprotnom, u novodobijenomizrazu ponovo smjenjivalo “x” sa “x+1”, i tako bez kraja):In[56] := 1 + x + x 2 /. x x+1Out[56] = 2 + x + (1+x) 2Ukoliko želimo da na neki izraz primijenimo više pravila, jedan od načina koji možemo koristiti jekaskadna primjena operatora “/.”:In[57] := u 2 + v 2 + w 2 /. u 1 /. v 2 /. w 3Out[57] = 14Primijetimo da poredak zadavanja pravila može biti jako bitan:In[58] := u 2 + v 2 /. u v+1 /. v 2Out[58] = 13In[59] := u 2 + v 2 /. v 2 /. u v+1Out[59] = 4 + (1+v) 2U prvom slučaju, u izrazu “u 2 + v 2 ” se prvo zamjenjuje “u” sa “v+1”, čime se dobija izraz “(v+1) 2 + v 2 ”, azatim se u novodobijenom izrazu mijenja “v” sa “2”. U <strong>dr</strong>ugom slučaju, u izrazu “u 2 + v 2 ” se prvozamjenjuje “v” sa “2” čime se dobija izraz “u^2 + 4”, a zatim se u novodobijenom izrazu zamjenjuje “u”sa “v+1”.Alternativni, i često pogodniji način za višestruku primjenu pravila, je da sva pravila koja želimo daprimijenimo stavimo u listu:In[60] := u 2 + v 2 + w 2 /. {u 1, v 2, w 3}Out[60] = 14Mada je u ovom primjeru rezultat isti kao kod kaskadne primjene operatora “/.”, kod ovakve primjenepravila se sva pravila navedena u listi primjenjuju uporedo, tako što se na svaki dio izraza primjenjujusva navedena pravila redom, dok se ne naiđe na prvo pravilo koje se može primijeniti na razmatrani dioizraza. Pri tome se nikada na isti dio izraza ne primjenjuje više od jednog pravila (u suprotnom bi moglodoći do beskonačnih petlji, npr. ako bismo zadali listu pravila poput {u v, v u}). Slijedi primjer kojijasno ilustrira razliku (potrudite se da shvatite zašto je svaki od rezultata onakav kakav jeste):In[61] := u 2 + v 2 /. u v+3 /. v u+5Out[61] = (5+u) 2 + (8+u) 2In[62] := u 2 + v 2 /. v u+5 /. u v+3Out[62] = (3+v) 2 + (8+v) 2In[63] := u 2 + v 2 /. {u v+3, v u+5}Out[63] = (5+u) 2 + (3+v) 2Zapravo, samo je posljednji rezultat ono što smo najvjerovatnije željeli da postignemo. U slučaju kada seniti u jednom od pravila sa desne strane ne pojavljuje neka od promjenljivih koja se javlja sa lijeve stranenekog od pravila, tada je potpuno svejedno koju ćemo varijantu koristiti.Činjenica da se nikada na isti dio izraza ne primjenjuje više od jednog pravila (niti jedno praviloviše puta) može ponekad da smeta. Zbog toga je uveden i operator “//.” koji na izraz neprestanoprimjenjuje navedeno pravilo ili listu pravila, sve dok se to pravilo može upotrijebiti, odnosno sve dok semakar jedno od pravila navedenih u listi može upotrijebiti. Na primjer:– 22 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[64] := u 2 + v 2 /. {u v+1, v 2}Out[64] = 4 + (1+v) 2In[65] := u 2 + v 2 //. {u v+1, v 2}Out[65] = 13Ipak, pri upotrebi operatora “//.” treba biti veoma oprezan, jer će pravila poput x x +1 ili{x y, y x} neminovno dovesti do beskonačne petlje, koju doduše uvijek možemo prekinuti pomoćukomande Abort Evaluation iz Kernel menija. Alternativno, paket Mathematica će sam prekinuti ovupetlju kada se dostigne maksimalno dozvoljeni broj ponavljanja, koji je po<strong>dr</strong>azumijevano postavljen na65536.Umjesto liste pravila moguće je zadati i listu listi pravila. U tom slučaju se kao rezultat dobija listasastavljena od rezultata primjene svakog od pravila iz unutrašnjih listi. Na primjer:In[66] := x 2 + 5 x + 6 /. {{x 1}, {x 2}, {x 3}}Out[66] = {12, 20, 30}In[67] := u 2 + v 2 /. {{u 1, v 1}, {u 2, v 2}}Out[67] = {2, 8}Nema nikakvog razloga da ne zapamtimo čitavo pravilo, listu pravila ili listu listi pravila u nekupromjenljivu, tako da ga možemo primjenjivati kada god nam zatreba. Na primjer:In[68] := uvrsti3 := x 3In[69] := uvrsti3Out[69] = x 3In[70] := x 2 + 5 x + 6 /. uvrsti3Out[70] = 30In[71] := izraz /. uvrsti3Out[71] = 30In[72] := uvw := {u 1, v 2, w 3}In[73] := u + v + w /. uvwOut[73] = 6In[74] := u 2 + v 2 + w 2 /. uvwOut[74] = 14Podsjetimo se da promjenljiva izraz od ranije sa<strong>dr</strong>ži izraz “(3+2 x) (2+x) 2 ”.5. Manipulacije sa simboličkim izrazimaNajveća snaga paketa Mathematica leži upravo u mogućnosti rada sa simboličkim izrazima.Međutim, dok se operacije sa numeričkim izrazima obavljaju manje ili više automatski, kod simboličkogračunanja to nije tako. Razlozi za to su višestruki, a najvažniji je to što kod simboličkog računanja nijeposve očigledno šta bi trebao da bude rezultat. Na primjer, simbolički izraz (x–y+z) (x–z) – y (x–y) + z (z–y) nakon sređivanja može se napisati kao x 2 – 2 x y + y 2 ili kao (x–y) 2 , pri čemu je dosta upitno koji od ovadva oblika treba smatrati “rezultatom”. Kod simboličkih izraza ne možemo govoriti o rezultatu u onomsmislu kako možemo kod rada sa brojevima, jer su svi ekvivalentni izrazi jednako valjani (svaki na svojnačin), i svaki može biti smatran za “rezultat”. Stoga je kod simboličkih izraza bolje govoriti otransformacijama, koji izraz prevode iz jednog u <strong>dr</strong>ugi ekvivalentni oblik. Mathematica automatski vršisamo najelementarnije transformacije poput objedinjavanja članova sa istim simbolima (3 x y umjesto– 23 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”2 x y + x y), poništavanja identičnih članova (poput x–x), svođenja produkata simbola na stepene (x 2umjesto x x), kraćenja zajedničkih faktora u brojniku i nazivniku tamo gdje je to očigledno, i nekihelementarnih identiteta koji uključuju inverzne funkcije (npr. x 3 umjesto Sqrt[x] 6 ). Sve ostaletransformacije ne vrše se po automatizmu, već je potrebno zadati odgovarajuće funkcije pomoću kojih sevrši izbor transformacije koju želimo da obavimo nad izrazom. Na primjer:In[1] := (x*x+5)^2*(x–3)+1Out[1] = 1+(–3+x) (5+x 2 ) 2Vidimo da u ovom izrazu nije primijenjena ni jedna netrivijalna transformacija (izraz je samo maloprestruktuiran). Sasvim <strong>dr</strong>ugu situaciju dobijamo ako na navedeni izraz primijenimo funkciju Expand:In[2] := (x*x+5)^2*(x–3)+1 // ExpandOut[2] = –74 + 25 x – 30 x 2 + 10 x 3 – 3 x 4 + x 5Funkcija Expand vrši oslobađanje izraza od produkata i stepena sa cjelobrojnim eksponentima, inajčešće se koristi za množenje i stepenovanje polinoma:In[3] := (a x + b y 2 )(c x 3 – d y 2 ) // ExpandOut[3] = a c x 4 – a d x y 2 + b c x 3 y 2 – b d y 4In[4] := Expand[(x+y–z) 4 ]Out[4] = x 4 + 4 x 3 y + 6 x 2 y 2 + 4 x y 3 + y 4 – 4 x 3 z – 12 x 2 y z – 12 x y 2 z – 4 y 3 z+ 6 x 2 z 2 + 12 x y z 2+ 6 y 2 z 2 – 4 x z 3 – 4 y z 3 + z 4Funkcija Expand može se primijeniti i na izraze koji nisu polinomi, ali treba voditi računa da onane radi ništa više od oslobađanja od produkata i cjelobrojnih stepena:In[5] := (Cos[x]–Sin[x]) (Cos[x]+Sin[x]) // ExpandOut[5] = Cos[x] 2 – Sin[x] 2Primijetimo da Mathematica izraze poput cos 2 x ne prikazuje u obliku Cos 2 [x] (što, strogo rečeno, nije nimatematski skroz ispravno), nego u obliku Cos[x] 2 (što je matematski mnogo korektnije). O tometrebamo voditi računa i kada unosimo izraze: izraz oblika cos 2 x ispravno se zadaje jedino kao Cos[x] 2 , ane nipošto kao Cos 2 [x]!Mathematica sve iracionalne brojeve (u tačnoj formi) smatra također kao neku vrstu simboličkihizraza, i ne primjenjuje na njih po automatizmu nikakve dodatne transformacije osim već pomenutihnajelementarnijih transformacija. Stoga su sve funkcije za manipuliranje sa simboličkim izrazima (poputExpand) primjenljive i na manipulacije sa iracionalnim brojevima:In[6] := (Sqrt[2]+Sqrt[3])^2Out[6] =( 2 23)In[7] := % // ExpandOut[7] = 5 2 6Bitno je napomenuti da funkcija Expand ne djeluje na produkte i stepene koji su upotrebljeni kaoargumenti neke funkcije (tj. ona “ne zalazi” u dubinu izraza):In[8] := (Cos[(x+y)(x–y)]–Sin[(x–y) 2 ]) (Cos[(x+y)(x–y)]+Sin[(x–y) 2 ]) // ExpandOut[8] = Cos[(x+y)(x–y)] 2 – Sin[(x–y) 2 ] 2S <strong>dr</strong>uge strane, funkcija ExpandAll je slična funkciji Expand, ali djeluje na sve dijelove izraza, ma gdjese oni nalazili:In[9] := % // ExpandAllOut[9] = Cos[x 2 – y 2 ] 2 – Sin[x 2 – 2 x y + y 2 ] 2– 24 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Interesantno je demonstrirati kako funkcije Expand i ExpandAll djeluju na racionalne izraze. Radidaljeg eksperimentiranja, smjestićemo jedan racionalan izraz u promjenljivu “rac”:In[10] := rac = (x–3) 2 /((x+1)(x–5))+(2+x)(2–x)/((x+1) 2 (x 2 +1))2( 3x) (2 x)(2 x)Out[10] =2 2( 5 x)(1 x) (1 x) (1 x )U slučaju racionalnih izraza, funkcija Expand djeluje samo na brojnike u izrazu. Pored toga, ovafunkcija daje rezultat u obliku sume razlomaka u kojima se u brojniku javlja samo po jedan član izrazvijenog brojnika, dok se nazivnici samo prepisuju:In[11] := rac // Expand296 xx4Out[11] =2( 5x)(1 x) ( 5x)(1 x) ( 5x)(1 x) (1 x) (1 xFunkcija ExpandAll djeluje slično, samo se pored brojnika razvijaju i nazivnici:2x2 2) (1 x) (1 x )2In[12] := rac // ExpandAll9 6 xOut[12] = 254xx54xx22x54xx242 3 412x2x2xxx2 3 412x2x2xx2Pored funkcija Expand i ExpandAll, za rad sa racionalnim funkcijama korisne su i funkcijeExpandNumerator i ExpandDenominator. Funkcija ExpandNumerator, slično funkciji Expand,djeluje samo na brojnike, ali za razliku od nje, ne vrši dodatno razbijanje razlomaka na sabirke sajednočlanim brojnicima. S <strong>dr</strong>uge strane, funkcija ExpandDenominator djeluje samo na nazivnike:In[13] := rac // ExpandNumerator224x 96 x xOut[13] =2 2(1 x) (1 x ) ( 5x)(1 x)In[14] := rac // ExpandDenominator2( 3x) (2x)(2 x)Out[14] =22 35 4 x x 12 x 2 x 2 x xIn[15] := rac // ExpandNumerator // ExpandDenominator229 6 x x4 xOut[15] =22 3 45 4 x x 12 x 2 x 2 x x4Funkcija Together svodi racionalne izraze na zajednički nazivnik (pri čemu se eventualnizajednički faktori koji bi se mogli pojaviti u brojniku i nazivniku krate):In[16] := 1/(x 3 +x+1)+1/(x 4 +2x+1) // Together3 42 3x x xOut[16] =3(1 x x ) (1 2 x x )In[17] := rac // Together2117 x 9 x 3xOut[17] =( 5 x) (1 x) (1 x )23445 x xIn[18] := % // ExpandDenominator2 3 4117 x 9 x 3x5 x xOut[18] =259 x 8 x 8 x 3x x324555– 25 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Kao rezultat funkcije Together tipično se dobija razlomak sa manje ili više faktoriziranimrazlomkom (što možemo izbjeći naknadnom primjenom funkcije ExpandDenominator, kao uprethodnom primjeru), dok se brojnik ne pokušava faktorizirati, čak i ukoliko je to jednostavno (zapravo,ni nazivnik se ne faktorizira više od onog što je potrebno da bi se formirao zajednički nazivnik).Suprotan efekat od funkcije Together postiže se funkcijom Apart, koja rastavlja racionalni izraz naelementarnije razlomke, tj. razlomke sa jednostavnijim nazivnicima:In[19] := rac // Apart2 3Out[19] = 13(5x) 2(1 x)21 5x 6(1 x) 2(1 x2)Sve opisane funkcije rade i sa racionalnim funkcijama koje zavise od više promjenljivih:In[20] := (x + 3x 2 – 2y – 3x y)/(x 3 + 2y 3 – 2x 2 y – x y 2 ) // Apart1 1 2Out[20] = 2 x ( x y) 2 x (x y) x 2 yFunkcija Factor pokušava da rastavi izraz kao produkt izraza u kojima se javljaju članovi sa nižimeksponentima, i na izvjestan način je suprotna funkciji Expand:In[21] := x 2 +5 x+6 // FactorOut[21] = (2+x)(3+x)In[22] := x 4 – y 4 // FactorOut[22] = (x–y)(x+y)(x 2 + y 2 )In[23] := x 20 – y 20 // FactorOut[23] = (x–y)(x+y)(x 2 + y 2 )(x 4 – x 3 y + x 2 y 2 – x y 3 + y 4 )(x 4 + x 3 y + x 2 y 2 + x y 3 + y 4 )(x 8 – x 6 y 2 + x 4 y 4 – x 2 y 6 + y 8 )In[24] := Cos[x] 2 – Sin[x] 2 // FactorOut[24] = (Cos[x]–Sin[x])(Cos[x]+Sin[x])In[25] := x 4 + y 4 + z 4 – 2 (x 2 y 2 + x 2 z 2 + y 2 z 2 ) // FactorOut[25] = (x–y–z) (x+y–z) (x–y+z) (x+y+z)Bitno je napomenuti da funkcija Factor vrši rastavljanje na faktore samo nad skupom cijelih iracionalnih brojeva. Drugim riječima, ova funkcija nikada u rastavi ne generira iracionalne brojeve nitiiracionalne izraze:In[26] := x 2 + 5 x + 2 // FactorOut[26] = 2 +5 x + x 2In[27] := x 6 + 7 x 5 + 12 x 4 + 6 x 3 – 25 x 2 –30 x – 25 // FactorOut[27] = (5 + x) (1 + x + x 2 ) (–5 + x 2 + x 3 )Vidimo da je izraz x 2 + 5 x + 2 koji nema racionalnih nula ostao praktično netaknut (ako zanemarimopregrupiranje), dok je u posljednjem primjeru faktor –5 + x 2 + x 3 također ostao nerastavljen iz istograzloga. Funkcija Factor je ograničena na racionalne faktore zbog činjenice da i čovjek tako radi upraksi. Naime, svako će rastaviti x 2 – 4, kao (x+2) (x–2) ili x 2 + 5 x + 6 kao (x+2) (x+3), međutim, rastavupoputx 2 5 17 5 17+ 5 x + 2 = (x – ) (x – )22teško je smatrati “prirodnom”, “lijepom” i “praktičnom”. Još gori slučaj je sa slijedećom rastavom (kojabi se eventualno trebala generirati u posljednjem primjeru):– 26 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”U matematici se veoma često susreću različite transformacije izraza koji sa<strong>dr</strong>že trigonometrijskefunckije. Mathematica poznaje tri veoma moćne funkcije za manipuliranje sa trigonometrijskimizrazima. Funkcija TrigExpand koristi adicione teoreme sa ciljem da se oslobodi trigonometrijskihfunkcija složenijih argumenata (prvenstveno zbirova i razlika kao i višestrukih uglova). Pri tome serezultat pokušava izraziti preko stepena trigonometrijskih funkcija prostijih argumenata. FunkcijaTrigFactor također prvo eliminira trigonometrijske funkcije složenijih argumenata (ako ih ima), a zatimpokušava predstaviti trigonometrijsku funkciju kao produkt prostijih trigonometrijskih izraza, pri čemutaj pokušaj može dovesti do formiranja složenijih argumenata. Funkcija TrigReduce pokušava datrigonometrijski izraz predstavi kao zbir prostijih trigonometrijskih izraza koji mogu imati složenijeargumente. Slijedi nekoliko karakterističnih primjera:In[33] := Sin[x+y–z] // TrigExpandOut[33] = Cos[y] Cos[z] Sin[x] + Cos[x] Cos[z] Sin[y] – Cos[x] Cos[y] Sin[z] + Sin[x] Sin[y] Sin[z]In[34] := Sin[6 x] // TrigExpandOut[34] = 6 Cos[x] 5 Sin[x] – 20 Cos[x] 3 Sin[x] 3 + 6 Cos[x] Sin[x] 5In[35] := Sin[6 x] // TrigFactorOut[35] = 2 Cos[x] (–1 + 2 Cos[2 x]) (1 + 2 Cos[2 x]) Sin[x]In[36] := Sin[x] + Sin[y] // TrigFactorx y x yOut[36] = 2Cos Sin 2 2 2 2In[37] := Sin[x] Cos[y] // TrigReduceOut[37] =21 (Sin[x – y] + Sin[x + y])In[38] := Cos[x] Cos[y] – Sin[x] Sin[y] // TrigReduceOut[38] = Cos[x + y]In[39] := Cos[2 x] Sin[3 x] 2 // TrigExpand2482Cos[x] Cos[x] Cos[x] Sin[x] 3 2 2Out[39] = Cos[x] Sin[x] + 7 Cos[x] 6 Sin[x] 2 –2 4 4 2 24Sin[x] 35 4 4 Cos[x] Sin[x] + 7 Cos[x] 2 Sin[x] 6 8Sin[x]4 24In[40] := Cos[2 x] Sin[3 x] 2 // TrigFactorOut[40] = (1 + 2 Cos[2 x]) 2 (Cos[x] – Sin[x]) Sin[x] 2 (Cos[x] + Sin[x])In[41] := Cos[2 x] Sin[3 x] 2 // TrigReduceOut[41] = 41 (2 Cos[2 x] – Cos[4 x] – Cos[8 x])Funkcije TrigExpand, TrigFactor i TrigReduce pored klasičnih trigonometrijskih izraza rade i saizrazima koji sa<strong>dr</strong>že hiperbolne funkcije.Prilikom rada sa racionalnim trigonometrijskim ili hiperbolnim izrazima, u funkcije Together,Apart i Cancel može se kao dodatni parametar dodati opcija Trig–>True. Na taj način se dobijajumnogo bolji rezultati, jer se pored običnih manipulacija sa racionalnim izrazima primjenjuju itrigonometrijske transformacije:In[42] := 1/(Sin[x]+Cos[x]) + Sin[x]/Cos[2 x] // Together21Cos[x]Sec[2 x]Sin[x] Sec[2 x]Sin[x]Out[42] =Cos[x] Sin[x]– 28 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[43] := Together[%, Trig–>True]Cos[x]Out[43] =(Cos[x] Sin[x])(Cos[x]Sin[x])Za funkciju FunctionExpand teško je reći šta tačno radi. Generalno, ona pokušava transformiratineki izraz koji sa<strong>dr</strong>ži složenije matematičke funkcije u izraz koji sa<strong>dr</strong>ži jednostavnije operacije ijednostavnije argumente, čak i u slučaju ukoliko će se na taj način dobiti osjetno glomazniji izrazi. Ovafunkcija je naročito korisna za pretvaranje izvjesnih trigonometrijskih izraza u izraze (običnoiracionalne) koji ne sa<strong>dr</strong>že trigonometrijske funkcije, kao što pokazuju naredni primjeri:In[44] := Cos[Pi/24] // FunctionExpand2 14Out[44] = 3(2 2)42In[45] := Tan[3 Pi/8] // FunctionExpandOut[45] =2 2 22In[46] := Sin[Pi/17] // FunctionExpandOut[46] =148 215172(1717) 2346172(1717) 34(1717) 82(17 17) In[47] := Sin[ArcCos[x]/2] // FunctionExpand1 xOut[47] =2In[48] := Sin[2 ArcCos[x]] // FunctionExpandOut[48] = 2 1x x 1xČesto nam je cilj da neki izraz želimo predstaviti u što je god moguće jednostavnijem obliku, ali pritom ne znamo kako to učiniti, odnosno koju transformaciju ili niz transformacija primijeniti. Za tu svrhukoristi se funkcija Simplify. Ona pokušava da pronađe takve transformacije koje će dovesti do što je godmoguće jednostavnijeg izraza koji je ekvivalentan izrazu na koji je primijenjena. Slijedi nekolikoprimjera:In[49] := x 3 + 3x 2 + 3x + 1 // SimplifyOut[49] = (1 + x) 3In[50] := (x – y)(x 2 + x y + y 2 ) // SimplifyOut[50] = x 3 – y 3In[51] := Cos[(x–y)(x+y)] Cos[z 2 +2z+1] – Sin[(x–y)(x+y)] Sin[z 2 +2z+1] // SimplifyOut[51] = Cos[x 2 – y 2 +(1+z) 2 ]In[52] := a x a y a z // SimplifyOut[52] = a x+y+zU prva dva primjera bismo isti efekat dobili primjenom funkcija Factor odnosno Expand, aliprimjena funkcije Simplify nas oslobađa od potrebe da se brinemo koju transformaciju primijeniti daostvarimo željeni cilj. U trećem primjeru, prikazano pojednostavljenje je moguće dobiti samokombiniranjem raznih transformacija, dok pojednostavljenje prikazano u četvrtom primjeru nije mogućeizvesti ni jednom do sada opisanom funkcijom (osim Simplify). Treba napomenuti da zbog složenostiprocesa pojednostavljivanja u općem slučaju, primjena funkcije Simplify često zahtijeva dosta vremenaza izračunavanje.– 29 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Postoji i pojačana verzija funkcije Simplify, nazvana FullSimplify. Ova funkcija isprobava znatnoviše transformacija nego funkcija Simplify, što može rezultirati efikasnijim pojednostavljenjem.Nedostatak funkcije FullSimplify je što njemo izračunavanje često traje predugo, tako da moramoprekinuti izračunavanje (na već opisani način) prije nego što dočekamo rezultat. Stoga, funkcijuFullSimplify treba primjenjivati samo ukoliko vidimo da funkcija Simplify ne daje zadovoljavajućerezultate. Na primjer, funkcija Simplify se ne snalazi najbolje sa složenijim iracionalnim izrazima. S<strong>dr</strong>uge strane, funkcija FullSimplify se sa njima dosta dobro snalazi, kao što pokazuje sljedeći primjer:In[53] := 2 3 23 // SimplifyOut[53] = 23 23In[54] := % // FullSimplifyOut[54] = 6Također, treba znati da funkcije Simplify i FullSimplify imaju različit “osjećaj” za to šta znači“jednostavniji izraz”, tako da se njihovi rezultati i zbog toga mogu razlikovati, kao što je vidljivo izsljedećeg primjera (podsjetimo se da promjenljiva rac sa<strong>dr</strong>ži racionalni izraz koji smo definirali ranije):In[55] := rac // SimplifyOut[55] =2( 3x)(1x) 24x5x21 x2(1 x)In[56] := rac // FullSimplify11x (7 ( 3x)Out[56] =x (1 x))( 5 x) (1 x) (1 x )2226. Uvjeti i njihova upotrebaPod uvjetima ili logičkim izrazima smatramo bilo koji izraz čiji rezultat eventualnog izračunavanjamože biti jedino “tačno” ili “netačno”. Da bismo mogli formirati uvjete, neophodni su nam operatori kojikao rezultat izračunavanja daju isključivo rezultat tipa tačno/netačno. Mathematica poznaje čitavomnoštvo takvih operatora. Tu na prvom mjestu spadaju relacioni operatori “” (veće),“=” (veće ili jednako), “= =” (jednako) i “!=” (različito):In[1] := 2 < 3Out[1] = TrueIn[2] := 2 > 3Out[2] = FalseIn[3] := Sqrt[2] 3Out[6] = True– 30 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Ovakvi izrazi, koji se zapravo najviše i koriste u radu sa paketom Mathematica, nazivaju se otvoreniuvjeti ili predikati.Operatore “=” i “!=” editor automatski pretvara u znakove “”, “” i “”, koji se mogu ineposredno unijeti sa tastature pomoću kombinacije tipki |Esc| = |Esc| i |Esc| != |Esc|.Relacioni operatori imaju niži prioritet od aritmetičkih operatora “+”, “–”, “*”, “/ ” i “^”, tako da se izrazpoput x + y > a + b ispravno interpretira kao (x + y) > (a + b).Bitno je uočiti razliku između operatora dodjele “=” i operatora jednakosti “= =” (piše se sa dvaznaka “=”). Izraz sa operatorom dodjele poput x = y predstavlja imperativni iskaz nakon kojeg lijevastrana (tj. x) zaista postaje jednaka desnoj strani (tj. y), čak i ukoliko to nije vrijedilo prije. Također,rezultat takvog iskaza je upravo dodijeljena vrijednost (tj. y). S <strong>dr</strong>uge strane, izraz poput x = = y samovrši provjeru da li su lijeva i desna strana jednake, i daje rezultat True odnosno False ukoliko seodgovor može ustanoviti (ukoliko ne, izraz ostaje neizračunat). Na primjer:In[7] := a=3Out[7] = 3In[8] := a= =4Out[8] = FalseIn[9] := a= =3Out[9] = TrueIn[10] := a= =bOut[10] = a = = bIn[11] := a= =b /. b aOut[11] = TrueIn[12] := 2= =3Out[12] = FalseIn[13] := 2= 3Set::setraw : Cannot assign to raw object 2.Out[13] = 3U posljednjem slučaju izraz 2=3 predstavlja imperativni iskaz koji bi trebao da učini da objekat 2postane jednak objektu 3, što je jasno nemoguće, jer je 2 nepromjenljiv (“sirov”) objekat. Poznavaocijezika C i C++ mogu primijetiti da je razlikovanje operatora “=” i “= =” (kao i operator “!=”) preuzetoupravo iz ovih jezika.Mathematica često ne može da utvrdi eventualnu tačnost jednakosti ili nejednakosti direktno kakoje napisana, pogotovo ukoliko jednakost ili nejednakost sa<strong>dr</strong>že opće brojeve. U takvim slučajevima,primjena funkcije Simplify odnosno FullSimplify može pomoći da se utvrdi tačnost zadane jednakostiili nejednakosti:In[14] := (a+b) 2 = = a 2 + 2a b + b 2Out[14] = (a+b) 2 = = a 2 + 2a b + b 2In[15] := % // SimplifyOut[15] = TruePomoću operatora konjukcije, disjunkcije i negacije mogu se od prostijih uvjeta formirati složenijiuvjeti. Ovi operatori se, kao i u jezicima C i C++, pišu kao “&&” (konjukcija), “||” (disjunkcija) i “!”(negacija). Na primjer:– 31 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[16] := 2 < 3 && 4 > 5Out[16] = FalseIn[17] := 2 < 3 || 4 > 5Out[17] = TrueIn[18] := ! 4 > 5Out[18] = TrueOperatori “&&”, “||” i “!” imaju niži prioritet od relacionih operatora, tako da se izrazi poputa < b && c < d i ! a < b ispravno interpretiraju kao (a < b) && (c < d) i ! (a < b). Negacija ima viši prioritetod konjukcije, a konjukcija od disjunkcije, tako da se izraz poput x || y && z interpretira kao x || (y && z) ane kao (x || y) && z.. Za razliku od jezika C i C++ u kojima operator negacije ima veoma veliki prioritet,u paketu Mathematica je prioritet ovog operatora niži od prioriteta relacionih operatora.Umjesto operatora “&&”, “||” i “!” mogu se koristiti i operatori “”, “” i “” istog značenja, a čijaje notacija prilagođenija uobičajenoj matematskoj notaciji. Ovi operatori se mogu unijeti pomoćutastature kao kombinacije |Esc| && |Esc|, |Esc| || |Esc| i |Esc| ! |Esc| ili, alternativno, kao |Esc| and |Esc|,|Esc| or |Esc| i |Esc| not |Esc|. Pored ova tri operatora po<strong>dr</strong>žan je i operator implikacije, koji se piše kaoznak “”, a koji se može dobiti pomoću kombinacije tipki |Esc| => |Esc|. U suštini, izraz poput x yekvivalentan je izrazu !x || y.Za razliku od većine programskih jezika, Mathematica dopušta kaskadno kombiniranje relacionihoperatora, tj. pisanje izraza poput x < y < z, x y > z t, x y = = z, itd. koji su respektivno ekvivalentniizrazima poput (x < y) && (y < z), (x y) && (y > z) && (z t) i (x y) && (y = = z). U klasičnimprogramskim jezicima ovakvi kaskadni izrazi ili nisu sintaksno ispravni (npr. u Pascal-u), ili susintaksno ispravni ali ne daju očekivane rezultate (npr. u C-u i C++-u).U uvjetima se može koristiti i operator pripadnosti skupu “”, koji se koristi u oblikuelement skup. Znak “” možemo dobiti koristeći kombinaciju tipki |Esc| elem |Esc|. Ovaj operator sene može koristiti sa proizvoljnim skupovima, nego su po<strong>dr</strong>žani neki karakteristični beskonačni brojevniskupovi poput Primes (skup prostih brojeva), Integers (skup cijelih brojeva), Rationals (skupracionalnih brojeva), Algebraics (skup algebarskih brojeva), Reals (skup realnih brojeva) i Complexes(skup kompleksnih brojeva). Upotrebu ovog operatora možemo ilustrirati na sljedećim primjerima:In[19] := 3/7 IntegersOut[19] = FalseIn[20] := 19 PrimesOut[20] = TrueKao i kod svih ostalih uvjeta, u slučaju kada valjanost uvjeta koji sa<strong>dr</strong>ži operator “” nije očiglednana prvi pogled, funkcije Simplify odnosno FullSimplify mogu pomoći da se utvrdi valjanost:In[21] :=Out[21] =23 23 Integers23 23 In[22] := % // SimplifyOut[22] = True22 IntegersI zaista, uvjet je tačan, jer se, nakon pojednostavljenja, izraz sa lijeve strane operatora “” svodi naprirodan broj 6.– 32 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Uvjeti se veoma često koriste u kombinaciji sa funkcijama Simplify odnosno FullSimplify. Naime,često se neki izrazi mogu efektnije pojednostaviti ukoliko znamo da je neki uvjet ispunjen. Na primjer,kva<strong>dr</strong>atni korijen iz x 2 može se pojednostaviti samo na x ukoliko je x 0, odnosno na | x | ukoliko je xrealan (za kompleksno x, takvo pojednostavljenje ne vrijedi). Ukoliko želimo pojednostaviti izraz izrazuz pretpostavku da je uvjet uvjet ispunjen, koristimo sintaksuSimplify[izraz, uvjet]Isto vrijedi i za funkciju FullSimplify. Slijedi nekoliko primjera (primijetimo da uvjet poput x > -5implicitno po<strong>dr</strong>azumijeva da je x realan, s obzirom da se kompleksni brojevi ne mogu porediti poveličini):2In[23] := xOut[23] =2x// Simplify2In[24] := Simplify[ x , x 0]Out[24] = x2In[25] := Simplify[ x , x –5]Out[25] = Abs[x]2In[26] := Simplify[ xOut[26] = Abs[x], x Reals]In[27] := Sin[2k ] // SimplifyOut[27] = Sin[2k ]In[28] := Simplify[%, k Integers]Out[28] = 0In[29] := ArcSin[Sin[x]] // SimplifyOut[29] = ArcSin[Sin[x]]In[30] := Simplify[%, –/2 < x < /2]Out[30] = xIn[31] := Log[x] + Log[y] // SimplifyOut[31] = Log[x] + Log[y]In[32] := Simplify[%, x > 0 && y > 0]Out[32] = Log[x y]Posljednji primjer je naročito interesantan. Naime, ljudi često zaboravljaju da jednakostlog x + log y = log x y vrijedi samo za x > 0 i y > 0. I zaista, recimo za x < 0 i y < 0, lijeva strana ovejednakosti nije definirana u skupu realnih brojeva, a desna strana jeste!Konačno, Simplify i FullSimplify se mogu uspješno iskoristiti za dokazivanje tačnosti odnosnonetačnosti nekih jednakosti ili nejednakosti. Na primjer:In[33] := Simplify[x 2 0, x Reals]Out[33] = Truea b cIn[34] := Simplify[ 3 , a > 0 && b > 0 && c > 0]b c aOut[34] = TrueU posljednjem primjeru, dokazali smo da je zbir razlomaka a/b, b/c i c/a uvijek veći ili jednak od 3 poduvjetom da su a, b i c pozitivni.– 33 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”7. Rješavanje jednačina, nejednačina i sistemaU paketu Mathematica postoje brojne funkcije za rješavanje jednačina, nejednačina i sistemajednačina odnosno nejednačina, u zavisnosti od složenosti problema koji želimo da riješimo, i onoga štoželimo da dobijemo. Razmotrimo prvo šta uopće znači riješiti jednačinu, odnosno tvrditi da rješenjejednačine 3 x + 2 = 17 glasi x = 5. Oba izraza 3 x + 2 = 17 i x = 5 možemo posmatrati kao otvorene uvjete(predikate) koji mogu biti tačni ili netačni, u zavisnosti kakva je vrijednost x (tačni su samo ukoliko je tavrijednost 5). Međutim, predikat x = 5 zahtjev da x mora imati vrijednost 5 iskazuje eksplicitno. Stoga,riješiti jednačinu (ili nejednačinu) znači transformisati je u takav oblik u kojem se promjenljiva po kojojrješavamo jednačinu (ili nejednačinu) pojavljuje eksplicitno. To upravo radi funkcija Roots, u kojoj prviargument predstavlja jednačinu koja se rješava, a <strong>dr</strong>ugi argument promjenljivu po kojoj se rješava.Demonstrirajmo ovo na primjeru rješavanja jednačine x 2 + 5 x + 6 = 0:In[1] := Roots[x 2 + 5x + 5 = = 0, x]11Out[1] = x = = 5 5 22 || x = = 5 5 U slučaju da više volimo aproksimativna rješenja, možemo primijeniti numeričku aproksimaciju:In[2] := Roots[x 2 + 5x + 5 = = 0, x] // NOut[2] = x = = –3.61803 || x = = –1.38197Jednačine mogu zavisiti i od <strong>dr</strong>ugih promjenljivih ili parametara u odnosu na promjenljivu po kojojvršimo rješavanje:In[3] := Roots[x 2 + 5x + a = = 0, x]1Out[3] = x = = 5 254a 212 || x = = 5 254a Numerička aproksimacija u ovakvim slučajevima pretvara u decimalne brojeve samo one dijelove izrazanad kojima se može izvršiti takva pretvorba:In[4] := Roots[x 2 + 5x + a = = 0, x] // N0.5.5 1.25. 4.aOut[4] = x = = || x = = 0.55. 25. 4.a Naravno, ništa nas ne sprečava da jednačinu x 2 + 5x + a = 0 riješimo tako da smatramo da je anepoznata koju treba izraziti preko x:In[5] := Roots[x 2 + 5x + a = = 0, a]Out[5] = a = = –5x – x 2Bez obzira na prividnu snagu, funkcija Roots je prilično ograničena. Na prvom mjestu, ona jeograničena isključivo na rješavanje polinomskih jednačina, tj. jednačina kod kojih lijeva i desna stranapredstavljaju polinome po nepoznatoj promjenljivoj. U slučaju da jednačina nije takvog oblika bićeprijavljena greška (za takve jednačine postoje <strong>dr</strong>uge funkcije). Dalje, u slučaju jednačina koje sa<strong>dr</strong>žeparametre, funkcija Roots ne vrši nikakvu “diskusiju”, odnosno pretpostavlja da parametri imaju takvevrijednosti da su rješenja precizno definirana. Na primjer, posmatrajmo jednačinu a x = b. Njeno rješenjeje x = b/a, ali samo ukoliko je a ≠ 0. Za a = 0 rješenje ne postoji, osim ako je i b = 0. U tom slučaju,jednačina je identitet, bez obzira na x. O svemu ovome, funkcija Roots, kao što slijedi iz prikazanogprimjera, “nema pojma”:In[6] := Roots[a x = = b, x]Out[6] = x = = ab– 34 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Za rješavanje širih klasa jednačina, kao i za “diskusiju” rješenja u ovisnosti od parametara, koristise funkcija Reduce. Rezultat sljedećeg primjera treba tumačiti da je jednačina zadovoljena ako su b i anule, ili ako je a različit od nule, i pri tome x jednak b/a:In[7] := Reduce[a x = = b, x]Out[7] = b = = 0 && a = = 0 || a ≠ 0 && x = =abS <strong>dr</strong>uge strane, rješenja koja generira funkcija Reduce mogu biti prilično glomazna, s obzirom da sevrši detaljna analiza svih mogućnosti. Tako, recimo, pri rješavanju kva<strong>dr</strong>atne jednačine a x 2 + b x + c = 0,Roots ignorira činjenicu da se za a = 0 jednačina svodi na linearnu, dok Reduce uzima u obzir i tučinjenicu (kao i mogućnost da su svi koeficijenti nule):In[8] := Roots[a x 2 + b x + c = = 0, x] b Out[8] = x = =b2a2 4a c b || x = =b2a2 4a cIn[9] := Reduce[a x 2 + b x + c = = 0, x] b bOut[9] = a ≠ 0 && x2 2 4a c b b 4a c = =|| x = =2a ||2a ca = = 0 && b ≠ 0 && x = = || c = = 0 && b = = 0 && a = = 0bZa razliku od Roots, funkcija Reduce pored jednačina, može rješavati i nejednačine. Treba voditiračuna da rješenja i najprostijih nejednačina koje sa<strong>dr</strong>že opće parametre mogu biti veoma glomazna, jertreba diskutirati brojne mogućnosti različitih vrijednosti parametara. S porastom broja parametarasloženost rješenja <strong>dr</strong>astično raste:In[10] := Reduce[x 2 + 5x > 6, x]Out[10] = x < –6 || x > 1In[11] := Reduce[a x > 1, x]Out[11] = a < 0 && x < a1 || a > 0 && x > a1In[12] := Reduce[a x > b, x]babbb 0 &&a 0 && x || a 0 &&x aaOut[12] = x Reals && b 0 &&a 0 && x || a 0 || a 0 &&x ||Funkcija Reduce može da rješava i sisteme jednačina odnosno nejednačina. Postoje dva načina dazadamo sistem. Jedan način je da sve jednačine odnosno nejednačine koje tvore sistem povežemooperatorom konjukcije u jedan složeni uvjet. Drugi način je da jednačine odnosno nejednačine koje tvoresistem ubacimo kao elemente liste. U oba slučaja, kao <strong>dr</strong>ugi argument funkcije Reduce treba navestilistu promjenljivih po kojima želimo da bude iskazano rješenje. Slijede primjeri koji pokazuju obanačina za rješavanje sistema jednačina x + y = 5 i x y = 6:In[13] := Reduce[x + y = = 5 && x y = = 6, {x, y}]Out[13] = {x = = 2 || x = = 3} && y = = 5 – xIn[14] := Reduce[{x + y = = 5, x y = = 6}, {x, y}]Out[14] = {x = = 2 || x = = 3} && y = = 5 – xU oba slučaja, vidimo da rješenje za x može biti 2 odnosno 3, dok za obje vrijednosti x vrijednost za ymora biti 5–x, što znači 3 odnosno 2.ba– 35 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”U slučaju sistema koji ovise od parametara, Reduce također ispituje sve mogućnosti. Tako, naprimjer sistem jednačina x + a y = b i 3x + a = 2 ima “klasično” rješenje ukoliko je a ≠ 0. Međutim, i zaa = 0 postoji “specijalno” rješenje, pod uvjetom da je b = 2/3, kod kojeg je x = 2/3 a y može biti bilokakav. Reduce uspješno detektira sve ove slučajeve:In[15] := Reduce[{x + a y = = b, 3x + a = = 2}, {x, y}]2 2 2 a2 a 3bOut[15] = b = = && a = = 0 && x = = || x = = && a ≠ 0 && y = =3 3 3 3aVeć je rečeno da Roots može rješavati samo polinomske jednačine. S <strong>dr</strong>uge strane, Reduceuspješno rješava sve jednačine koje se algebarskim transformacijama mogu svesti na polinomske, štouključuje sve racionalne i iracionalne jednačine, kao i veliki broj eksponencijalnih, logaritamskih itrigonometrijskih jednačina. Slijedi primjer jednačine log 2 (x + 3) + log 2 (x + 1) = 3 koju Roots ne može dariješi, dok je Reduce rješava bez problema:In[16] := Roots[Log[2, x+3] + Log[2, x+1] = = 3, x]Log[1 x]Log[2]Log[3x]Log[2]Roots::neq: 3 is expected to be a polynomial in the variable x.Out[16] = Roots[Tan[x] 2 +5Tan[x] + 6, x]In[17] := Reduce[Log[2, x+3] + Log[2, x+1] = = 3, x]Out[17] = x = = 1Trigonometrijske jednačine obično imaju beskonačno mnogo rješenja, koja najčešće zavise od nekeproizvoljne cjelobrojne konstante. Tako, na primjer, jednačina tg 2 x + 5 tg x + 6 = 0 ima rješenjax = arc tg 2 + k ili x = –arc tg 3 + k , gdje je k proizvoljan cijeli broj. Mathematica eventualneproizvoljne konstante koje se mogu pojavljivati u rješenjima imenuje respektivno sa C[1], C[2], itd.Pogledajmo kako Reduce prikazuje rješenje ove jednačine:In[18] := Reduce[Tan[x] 2 +5Tan[x] + 6 = = 0, x]Out[18] = C[1] Integers && (x = = –ArcTan[2] + C[1] || x = = –ArcTan[3] + C[1])Eksponencijalne jednačine također često imaju beskonačno mnogo rješenja, ali od kojih su samoneka realna. Kompleksna rješenja eksponencijalnih jednačina nas obično ne zanimaju. Nezgoda je što seReduce uvijek trudi da pronađe sva rješenja, tako da se dobijaju vrlo nepregledni izrazi:In[19] := Reduce[3 x+3 3 x+1 = = 6561, x]2iC[1]Log[9]Out[19] = C[1] Integers && x = = Log[3] Log[3]2iC[1]i Log[9]|| x = = Log[3] Log[3]Srećom, kod eksponencijalnih jednačina se realna rješenja dobijaju gotovo isključivo kada proizvoljnakonstanta koja figurira u njima ima vrijednost 0, tako da to možemo iskoristiti da malo “prečistimo”rješenje:In[20] := % /. C[1] 0Log[9] i Log[9]Out[20] = x = = || x = =Log[3] Log[3]Ovim smo situaciju značajno “popravili” i sveli na dva rješenja: jedno realno (koje je ujedno i jedinorealno) i jedno kompleksno. Druga mogućnost je da prilikom rješavanja jednačine eksplicitno zadamo danas interesiraju samo realna rješenja:In[21] := Reduce[3 x+3 3 x+1 = = 6561 && x Reals, x]Log[9]Out[21] = x = =Log[3]– 36 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Ipak, na taj način možemo osjetno produžiti trajanje izračunavanja, jer Mathematica mora o<strong>dr</strong>eđivatikoje vrijednosti proizvoljne konstante daju realan rezultat. Interesantno je da paket Mathematica nijeprimijetio da se rezultat može pojednostaviti (rješenje je, zapravo x = 2, što zaista jeste isto što iln 9 / ln 3, ali Mathematica to, začudo, nije uočila). Primjena funkcije FullSimplify će pomoći:In[21] := % // FullSimplifyOut[21] = x = = 2Funkcija Reduce zna da rješava čak i Diofantske jednačine, tj. jednačine u kojima se tražeisključivo cjelobrojna rješenja:In[22] := Reduce[3 x + 2 y = = 7 && x Integers && y Integers]Out[22] = C[1] Integers && x = = 1 + 2 C[1] || y = = 2 – 3 C[1]Funkcija Reduce je očigledno jako moćna. Međutim, ona često daje rješenje u dosta nepreglednojformi (što je često uvjetovano i previše opsežnim diskusijama raznih slučajeva). Stoga je uvedena ifunkcija Solve, koja nije tako moćna i univerzalna kao funkcija Reduce, ali daje rješenja prikazana umnogo preglednijoj formi. Njena sintaksa slična je kao za funkciju Reduce. Ovdje je, kao demonstracija,prikazano rješavanje sistema x + y = 5 i x y = 6, kao i sistema x + a y = b i 3x + a = 2, na dva načina:In[23] := Solve[x + y = = 5 && x y = = 6]Out[23] = {{x 2, y 3}, {x 3, y 2}}In[24] := Solve[x + a y = = b && 3x + a = = 2, {x, y}]2 a 2 a 3bOut[24] = {{ x , y }}3 3aIn[25] := Solve[{x + a y = = b, 3x + a = = 2}, {x, y}]2 a 2 a 3bOut[25] = {{ x , y }}3 3aVidimo da Solve daje rješenja iskazana u vidu smjena, koje prikazuju sa čim treba smijeniti traženenepoznate da bi jednačine bile zadovoljene, što je mnogo čitljivije u odnosu na logičke izraze koje dajefunkcija Reduce. Međutim, iz posljednjeg primjera je također vidljivo da Solve ne vrši diskusiju uodnosu na slobodne parametre, jer nije razmotren specijalan slučaj za a = 0 koji je funkcija Reducerazmotrila (niti je uopće istaknuto da a mora biti različito od nule). Također, treba istaći da Solve rješavasamo jednačine i sisteme jednačina, ali ne i nejednačine.Za polinomske jednačine koje sa<strong>dr</strong>že samo jednu promjenljivu (opšti broj), moguće je izostavitipromjenljivu po kojoj se jednačina rješava i koristiti Solve kao funkciju samo sa jednim argumentom(ovo ne važi za funkcije Roots ili Reduce):In[26] := x 2 + 5x + 5 = = 0 // Solve1Out[26] = {{x 5 5 21 }}2 }, {x 5 5 Kod sistema jednačina se također može koristiti verzija funkcije Solve sa samo jednimargumentom, pod uvjetom da su sve jednačine polinomske, i da ne sa<strong>dr</strong>že nikakve promjenljive nitiparametre osim promjenljivih po kojima se sistem rješava:In[27] := x + y = = 5 && x y = = 6 // SolveOut[27] = {{x 2, y 3}, {x 3, y 2}}U slučaju da nam numerička aproksimacija rješenja više odgovara, možemo je uvijek zahtijevatiprimjenom funkcije N. Međutim, postoji i funkcija NSolve, koja je slična Solve, ali odmah dajenumerička aproksimativna rješenja, ne pokušavajući uopće naći tačna rješenja, što za slučaj složenijihjednačina može biti efikasnije:– 37 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[28] := x 2 + 5x + 5 = = 0 // Solve // NOut[28] = {{x –3.61803}, {x –1.38197}}In[29] := x 2 + 5x + 5 = = 0 // NSolveOut[29] = {{x –3.61803}, {x –1.38197}}Kada god znamo da nas zanimaju numeričke vrijednosti, mnogo je bolje odmah koristiti NSolve, ane prvo tražiti tačna rješenja sa Solve, a zatim ih aproksimirati. Naime, ukoliko su tačna rješenja vrloglomazna, u postupku njihove aproksimacije može se više izgubiti na tačnosti nego u slučaju kadaneposredno tražimo aproksimativna rješenja. Uzmimo kao primjer jednačinu x 3 – 6 x 2 – 2 x + 3 = 0, čija sutačna rješenja vrlo nezgrapna i glomazna:In[30] := x 3 – 6x 2 – 2x + 3 = = 0 // SolveOut[30] = {{x {x {x 11/ 3 153i 95192142 / 333 153i 9519 1/ 32131 i 3 153i 9519 1/27 1i 3 2 / 32 33153i 9519 1/ 32131 i 3 153i 9519 1/27 1i 3 2 / 32 33153i 9519 1/ 32 } ,2 } ,2 }}Probajmo aproksimirati ova rješenja:In[31] := % // NOut[31] = {{x 6.24338 + 5.55112 10 –17 }, {x 0.5821 – 4.44089 10 –16 },{x –0.825476 + 2.22045 10 –16 }}Rješenja izgledaju kao da su kompleksna. Međutim, ako pažljivije pogledamo ova rješenja,primijetićemo da im je imaginarni dio izuzetno mali (reda veličine 10 –16 odnosno 10 –17 ), što navodi napomisao da ovaj imaginarni dio potiče od nesavršeno izvedene numeričke aproksimacije tačnih rješenja,u kojima je figurirala imaginarna jedinica. Funkcija Chop može se koristiti da “prečisti” ovakva rješenja.Ona zaokružuje na nulu sve dijelove broja (realne ili imaginarne) koji su po apsolutnoj vrijednosti manjiod 10 –10 (takvi dijelovi obično su posljedica netačnosti računanja):In[32] := % // ChopOut[32] = {{x 6.24338}, {x 0.5821}, {x –0.825476}}Ovo već izgleda mnogo razumnije. Međutim, da smo na polaznu jednačinu primijenili funkciju NSolve,odmah bismo dobili ovakva rješenja, bez nepotrebnih komplikacija:In[33] := x 3 – 6x 2 – 2x + 3 = = 0 // NSolveOut[33] = {{x 6.24338}, {x 0.5821}, {x –0.825476}}Ukoliko verziju funkcije Solve sa samo jednim argumentom primijenimo na jednačinu ili sistem ukojima se javljaju još neke promjenljive ili parametri, pored onih promjenljivih po kojima želimo dobitirješenje, Solve će riješiti jednačinu ili sistem po onim promjenljivim po kojima se dobija najprostijerješenje, uz poruku upozorenja da to ne mora biti ono što smo željeli. Izlaz iz takve situacije je korištenjefunkcije Solve sa dva parametra, gdje ćemo pomoću <strong>dr</strong>ugog argumenta eksplicitno naznačiti po kojojpromjenljivoj želimo dobiti rješenje:In[34] := x 2 + a x + 5 = = 0 // SolveOut[34] = {{a Solve::svars : Equations may not give solutions for all "solve" variables.25x}} x2– 38 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[35] := Solve[x 2 + a x + 5 = = 0, x]12a 20a21 }}22Out[35] = {{x }, {x a 20a U slučaju kada jednačina nije polinomska, verzija funkcije Solve sa jednim argumentom možegenerirati manje ili više nedovršena rješenja, čak i u slučaju kada jednačina sa<strong>dr</strong>ži samo jednupromjenljivu. Za slučaj kada su rješenja veoma nedovršena (kao u <strong>dr</strong>ugom od dva primjera koja slijede),pa samim tim i neupotrebljiva, može se pojaviti i poruka upozorenja:In[36] := Tan[x] 2 + 5Tan[x] + 6 = = 0 // SolveOut[36] = {{Tan[x] –3}, {Tan[x] –2}}In[37] := 1 + Sin[2x] = = Cos[x] // SolveSolve::svars : Equations may not give solutions for all "solve" variables.Out[37] = {{Cos[x] 1 + Sin[2 x]}}Djelimično rješenje u tim situacijama je eksplicitno naglašavanje da želimo rješenje eksplicitnoizraženo po nepoznatoj promjenljivoj. Međutim, čak i u tom slučaju, Solve često neće biti u stanju dapronađe sva rješenja. To se najčešće dešava kod trigonometrijskih jednačina, koje obično imajubeskonačno mnogo rješenja. U takvom slučaju, Solve obično pronađe samo rješenja na osnovnomperiodu, uz prateću poruku upozorenja, koja nas upućuje da za kompletno rješenje trebamo koristitifunkciju Reduce:In[38] := Solve[Tan[x] 2 + 5Tan[x] + 6 = = 0, x]Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for completesolution information.Out[38] = {{x –ArcTan[2]}, {x –ArcTan[3]}}In[39] := Solve[1 + Sin[2x] = = Cos[x], x]Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for completesolution information.1 11/ 3 11/ 3 ArcCos 22424 87 283 87 },3 1261 1{x 1/ 3 13 ArcCos 1i 3 22424 87 1 i 3 283 87 1/ },3 24121 1{x 1/ 3 13 ArcCos 1i 3 22424 87 1 i 3 283 87 1/ }}3 2412Out[39] = {{x 0}, {x Kako su rješenja u posljednjem primjeru svakako preglomazna, uputno je tražiti njihovu numeričkuaproksimaciju (ili, još bolje, koristiti NSolve umjesto Solve):In[40] := % // NOut[40] = {{x 0.}, {x –1.21556}, {x 2.17858 – 0.591541 }, {x 2.17858 + 0.591541 }}Što se tiče logaritamskih jednačina, njih Solve obično rješava podjednako dobro kao i Reduce. Istovrijedi i za racionalne, kao i za iracionalne jednačine. Kod eksponencijalnih jednačina, Solve tipičnopronađe sva realna i pokoje kompleksno rješenje, tako da Solve obično daje mnogo pregledniji rezultatnego Reduce za slučaj eksponencijalnih jednačina (kompleksna rješenja ovakvih jednačina nas običnone zanimaju):In[41] := Solve[Log[2, x+3] + Log[2, x+1] = = 3, x]Out[41] = {{x 1}}In[42] := Solve[3 x+3 3 x+1 = = 6561, x]i 2 Log[3] Log[81]Out[42] = {{x 2}, {x }}Log[3]– 39 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Bez obzira da li koristimo funkciju Roots, Reduce ili Solve, Mathematica će uvijek uspjeti pronaćitačna rješenja u slučaju polinomskih jednačina čiji stepen ne prelazi 4, odnosno, pri primjeni funkcijaReduce ili Solve, <strong>dr</strong>ugih tipova jednačina koje se algebarskim postupcima mogu svesti na polinomskejednačine čiji stepen ne prelazi 4. Međutim, kod polinomskih jednačina čiji stepen prelazi 4, kao ijednačina koje se svode na polinomske jednačine stepena većeg od 4, u općem slučaju nije mogućeizraziti tačna rješenja preko elementarnih funkcija. Mathematica tačna rješenja takvih jednačina izražavapreko takozvanih Root objekata, kao što je vidljivo iz sljedećeg primjera:In[43] := x 7 + x + 1 = = 0 // SolveOut[43] = {{x Root[1+#1+#1 7 &, 1]}, {x Root[1+#1+#1 7 &, 2]}, {x Root[1+#1+#1 7 &, 3]},{x Root[1+#1+#1 7 &, 4]}, {x Root[1+#1+#1 7 &, 5]}, {x Root[1+#1+#1 7 &, 6]},{x Root[1+#1+#1 7 &, 7]}}Root objekte treba shvatiti kao specijalnu vrstu simbola, kao što 2 nije ništa <strong>dr</strong>ugo nego simbolza broj čiji je kva<strong>dr</strong>at jednak 2, odnosno kao što log 2 3 nije ništa <strong>dr</strong>ugo nego simbol za broj koji daje 3kada se 2 digne na taj broj. Mathematica zna izvoditi razne računske operacije sa Root objektima, pričemu se kao rezultat mogu dobiti <strong>dr</strong>ugi Root objekti, a ponekad i obični brojevi (za to je običnopotrebno izvršiti funkciju FullSimplify). Međutim, za nas je mnogo bitnije da Mathematica znaizračunati njihove numeričke aproksimacije:In[44] := % // NOut[44] = {{x –0.796544}, {x –0.705298 – 0.637624 }, {x –0.705298 + 0.637624 },{x –0.123762 – 1.05665 }, {x –0.123762 + 1.05665 },{x 0.979808 – 0.516677 }, {x 0.979808 – 0.516677 }}Već smo vidjeli da funkcija Solve daje rezultate u vidu pravila (preciznije, liste listi pravila). Ovinije uvedeno slučajno. Naime, ako se sjetimo kako se primjenjuju pravila na izraze, ovo svojstvo semože veoma efektno iskoristiti. Slijede tri interesantna primjera, koje je lako analizirati. Prvi kreira listučiji su elementi rješenja jednačine x 2 + 5x + 6 = 0, <strong>dr</strong>ugi primjer kreira listu čiji su elementi recipročnevrijednosti kva<strong>dr</strong>ata rješenja te iste jednačine, dok treći primjer kreira listu čiji su elementi vrijednostiizraza x 2 + y 3 , pri čemu su x i y rješenja sistema jednačina x + y = 5 i x y = 6 (lista ima dva elementa, jerovaj sistem ima dva para rješenja):In[45] := x /. Solve[x 2 + 5x + 6 = = 0, x]Out[45] = {–3, –2}In[46] :=12 /. Solve[x2+ 5x + 6 = = 0, x]xOut[46] = {91 ,41 }In[47] := x 2 + y 3 /. Solve[{x + y = = 5, x y = = 6}, {x, y}]Out[47] = {31, 17}U nekim slučajevima nas ne zanima kompletno rješenje sistema jednačina, nego samo želimo izsistema jednačina eliminirati jednu ili više promjenljivih, odnosno dobiti novi sistem ili jednačinu ukojima se ne javljaju neke promjenljive. Za tu svrhu koristimo funkciju Eliminate, sa dva argumenta.Prvi argument je sistem, zadan u vidu liste jednačina ili konjukcije jednačina, dok je <strong>dr</strong>ugi argumentpromjenljiva ili lista promjenljivih koje želimo eliminirati. Na primjer, eliminirajmo promjenljivu x izsistema jednačina x 5 + y 5 = 1, x + y = 2:In[48] := Eliminate[{x 5 + y 5 = = 1, x + y = = 2}, x]Out[48] = –80 y + 80 y 2 – 40 y 3 + 10 y 4 = = –31Vidimo da smo kao rezultat dobili jednačinu u kojoj ne figurura x. Eliminate se može koristiti i zaeliminaciju promjenljivih iz sistema koji se inače ne mogu riješiti do kraja nikakvim tačnim postupcima.– 40 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Na kraju treba istaći da postoje “tvrdokorne” jednačine koje se, mada imaju rješenja, ne moguegzaktno riješiti nikakvim algebarskim postupcima, već samo približnim numeričkim metodama (npr.lociranjem intervala koji sa<strong>dr</strong>ži traženo rješenje putem isprobavanja, a zatim postupnim sužavanjem togintervala do postizanja zadovoljavajuće tačnosti). Primjer takve jednačine je cos x = 2 – x, za koju secrtanjem grafika funkcija y = cos x i y = 2 – x lako vidi da se presjecaju u jednoj tački (koja predstavljarješenje). Ovakve jednačine ne može da riješi ni Solve ni Reduce. Solve konstatira da se jednačinavjerovatno ne može riješiti algebarskim postupcima, dok Reduce prosto konstatira da pomoću metodakoje su raspoloživi ovoj funkciji ne zna riješiti ovakve jednačine:In[49] := Solve[x + Cos[x] = = 2, x]Solve::tdep : The equations appear to involve the variables to be solved in an essentially non-algebraic way.Out[49] = Solve[x + Cos[x] = = 2, x]In[50] := Reduce[x + Cos[x] = = 2, x]Reduce::nsmet : This system cannot be solved with the methods available to Reduce.Out[50] = Reduce[x + Cos[x] = = 2, x]Ovakve jednačine se ipak mogu riješiti pomoću funkcije FindRoot koja ima sličnu sintaksu kao iReduce, samo se sa promjenljivom po kojoj se rješava jednačina u listi navodi i početna pretpostavka zarješenje u okolini koje se traži rješenje. Jasno je da se u ovom slučaju može očekivati samoaproksimativno rješenje (funkcija FindRoot za nalaženje rješenja koristi pozati numerički Newtonovmetod tangente):In[51] := FindRoot[x + Cos[x] = = 2, {x, 1}]Out[51] = {x 2.98827}Funkciju FindRoot treba koristiti samo ukoliko ništa <strong>dr</strong>ugo ne pomogne, zbog nekoliko razloga.Prvo, ova funkcija može nalaziti samo aproksimativna rješenja, i zbog toga je neupotrebljiva zajednačine koje ovise od parametara (s obzirom da se rješenje traži čisto numerički). Drugo, ovoj funkcijise mora zadati početna aproksimacija rješenja, pri čemu se ne garantira nalaženje rješenja ukoliko je ovapočetna aproksimacija isuviše daleko od pravog rješenja (mada se u primjeru gornje jednačine ispravnorješenje dobija za praktično bilo kakvu početnu aproksimaciju). Treće, funkcija FindRoot uvijek nalazinajviše jedno rješenje, čak i u slučaju kada jednačina ima više rješenja. Obično biva pronađeno rješenjekoje je najbliže početnoj aproksimaciji. Slijedi da u slučaju jednačina sa više rješenja, pronađeno rješenjemože ovisiti od početne aproksimacije:In[52] := FindRoot[Tan[x] = = x + 1, {x, 0}]Out[52] = {x 1.13227}In[53] := FindRoot[Tan[x] = = x + 1, {x, 10}]Out[53] = {x 10.9118}Stoga se FindRoot najčešće koristi tako da se jednačina prvo prikaže grafički (o tome ćemo govoritikasnije), nakon čega se sa grafika grubo očita moguća lokacija rješenja, i nakon toga iskoristi FindRootza nalaženje preciznijih rješenja u okolici grubo očitanih vrijednosti.8. Manipulacije sa listama, vektorima i matricamaU Poglavlju 3. već su prikazane neke operacije koje djeluju nad listama. Pored njih, postoji mnoštvofunkcija koje kao svoje argumente primaju liste, i koje kao rezultat daju nove liste. Tako, funkcija Joinnadovezuje međusobno liste koje joj se proslijede kao argumenti u jednu veću listu, za<strong>dr</strong>žavajući istiporedak elemenata kakav je bio u pojedinačnim listama. Slično djeluje i funkcija Union, ali ona iznovoformirane liste uklanja elemente koji se ponavljaju (ona zapravo posmatra liste kao skupove, iformira njihovu uniju), i sortira njene elemente u rastući ili u abecedni poredak. Funkcija Union se možeprimijeniti i nad samo jednom listom, pri čemu se vrši odstranjivanje elemenata koji se ponavljaju isortiranje (ovim se lista zapravo pretvara u skup). Funkcija Intersection daje listu elemenata koji su– 41 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Interesantan je i sljedeći primjer, koji koristi Table da generira listu koeficijenata u binomnomrazvoju oblika (x + y) 7 . U njemu je iskorištena ranije spomenuta funkcija Binomial, za računanjebinomnih koeficijenata:In[23] := Table[Binomial[7, i], {i, 0, 7}]Out[23] = {1, 7, 21, 35, 35, 21, 7, 1}Za razna eksperimentiranja, kao i za statističke simulacije, zgodno je imati mogućnost kreiranja lističiji su elementi, na izvjestan način, slučajni brojevi. To se može izvesti također pomoću funkcije Table,samo nam je potreban izraz koji kao rezultat daje slučajan broj. Za tu svrhu služi funkcija Random sadva argumenta. Prvi argument je tip slučajnog broja, a po<strong>dr</strong>žani tipovi su Integer (cijeli broj), Real(realni broj) i Complex (kompleksni broj). Drugi argument je lista od dva elementa koji definiraju opsegu kojem se generirani slučajni broj mora nalaziti. Slijede dva primjera (s obzirom da su rezultati slučajni,ovo je samo jedan mogući scenario, Vaši rezultati će se gotovo sigurno razlikovati, ali navedeni opsegmora biti ispoštovan):In[24] := Random[Integer, {1, 100}]Out[24] = 39In[25] := Random[Real, {1, 100}]Out[25] = 85.1689Sad nije teško zaključiti kako bismo mogli generirati, recimo, listu od 100 slučajnih brojeva uopsegu od 1 do 6. Ovo može biti korisno, na primjer, za simulaciju ishoda 100 bacanja igraće kockice:In[26] := Table[Random[Integer, {1, 6}, {100}]Out[26] = {4, 3, 6, 1, 5, 5, 4, 2, 1, 2, 1, 3, 1, 5, 5, 1, 2, 2, 6, 4, 1, 2, 5, 2, 1, 4, 1, 4, 5, 5, 5, 3, 6, 3, 2, 5, 4, 1,4, 6, 6, 3, 6, 5, 1, 4, 1, 2, 1, 2, 3, 3, 5, 6, 4, 2, 6, 3, 2, 6, 4, 4, 4, 1, 4, 2, 2, 6, 6, 6, 5, 4, 3, 3, 4, 2,5, 3, 5, 6, 2, 5, 5, 3, 6, 4, 6, 6, 2, 2, 4, 1, 5, 4, 1, 4, 2, 5, 5, 6}Razumije se, i ovdje su rezultati slučajni, pa je prikazani rezultat samo jedan od mogućih ishoda.Značaj listi u paketu Mathematica je u tome što se pomoću njih reprezentiraju važni matematskiobjekti, kao što su vektori i matrice. Tako, Mathematica sve vektore posmatra kao liste. Da bismoformirali neki vektor zadan koordinatama, prosto njegove koordinate stavimo u listu. Operatori “+”, “–”i “*” slobodno se smiju koristiti za sabiranje i oduzimanje vektora, kao i za množenje vektora saskalarom, jer su te operacije definirane na isti način kao što Mathematica tretira te operacije nad listama.Međutim, za množenje vektora ne smije se koristiti operator “*”, s obzirom da se množenje listi izvodielement po element, a tako se vektori ne množe. Poznato je da se vektori mogu množiti na dva načina:skalarno i vektorsko množenje. Skalarno množenje dva vektora izvodi se pomoću operatora “.” (tačka), avektorsko pomoću operatora “” (krstić), koji se sa tastature može dobiti pomoću kombinacije|Esc| cross |Esc|.In[27] := {3, 4, 2}*{2, 8, 5}Out[27] = {6, 32, 10}In[28] := {3, 4, 2} {2, 8, 5}Out[28] = {6, 32, 10}In[29] := {3, 4, 2} . {2, 8, 5}Out[29] = 48In[30] := {3, 4, 2} {2, 8, 5}Out[30] = {4, –11, 6}(Ovo nije produkt vektora)(Ni ovo nije)(Skalarni produkt)(Vektorski produkt)Alternativno, umjesto operatora “.” odnosno “”, mogu se koristiti funkcije Dot i Cross sa dvaargumenta:– 44 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[31] := Dot[{3, 4, 2}, {2, 8, 5}]Out[31] = 48In[32] := Cross[{3, 4, 2}, {2, 8, 5}]Out[32] = {4, –11, 6}Već smo rekli da u paketu Mathematica liste mogu sa<strong>dr</strong>žavati <strong>dr</strong>uge liste. Ova osobina se koristi zapotrebe rada sa matricama. Naime, Mathematica tretira matrice kao liste čiji su elementi liste kojerespektivno predstavljaju redove matrice. Pri tome, broj elemenata u svakoj listi članici treba biti isti,inače Mathematica neće smatrati da se radi o matrici. Recimo, lista {{1, 2}, {1, 3, 5}, {4}} nije matrica,dok lista {{1, 3, 4, 2}, {5, 3, 2, 2}, {{0, 7, 3, 9}} jeste. Neka, na primjer, želimo definirati matricu3a 13484257U paketu Mathematica to možemo učiniti ovako:In[33] := a = {{3, 4, 2}, {1, 8, 5}, {3, 4, 7}};Međutim, ukoliko ne kažemo <strong>dr</strong>ugačije, Mathematica će ovakvu listu listi prikazivati upravo u onomobliku što ona jeste – lista listi:In[34] := aOut[34] = {{3, 4, 2}, {1, 8, 5}, {3, 4, 7}}Da bi Mathematica listu listi prikazala u obliku matrice, potrebno je zadati funkciju MatrixForm:In[35] := a // MatrixFormOut[35] // MatrixForm =34 2 18 534 7Prilikom kreiranja matrica, možemo dobiti na preglednosti ukoliko svaki od redova matricedefiniramo u posebnom redu, kao u sljedećem primjeru:In[36] := b = {{2, 1, 5},{4, 4, 3},{1, 0, 2}}Out[36] = {{2, 1, 5}, {4, 4, 3}, {1, 0, 2}}Funkcija MatrixForm može se primijeniti i na obične liste prostih elemenata, odnosno vektore. Utom slučaju, elementi liste (vektora) prikazuju se u formi vektor-kolone (odnosno matrice sa samojednom kolonom), kao što je vidljivo iz sljedećeg primjera:In[37] := c = {2, 8, 5};In[38] := c // MatrixFormOut[38] // MatrixForm = 2 85Česta greška prilikom definiranja matrica je zaboravljanje zareza koji razdvaja pojedine redovematrice. Ukoliko to učinimo, Mathematica će shvatiti da želimo obaviti množenje listi koje bi trebaleformirati redove matrice:– 45 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[39] := {{2, 1, 5} {4, 4, 3} {1, 0, 2}}Out[39] = {{8, 0, 30}}S obzirom na način kako se izvode operacije sabiranja, oduzimanja i množenja sa listama, lakozaključujemo da operacije sabiranja matrica, oduzimanja matrica i množenja skalara sa matricommožemo izvoditi koristeći uobičajenu sintaksu za sabiranje, oduzimanje i množenje. Pri tome, naravno,rezultat u formi matrice dobijamo samo ukoliko to eksplicitno naglasimo primjenom funkcijeMatrixForm:In[40] := a+bOut[40] = {{5, 5, 7}, {5, 12, 8}, {4, 4, 9}}In[41] := % // MatrixFormOut[41] // MatrixForm =55 7 512 844 9In[42] := 2a – b // MatrixFormOut[42] // MatrixForm = 4 7 12 12 7 5 8 12S <strong>dr</strong>uge strane, množenje matrica se ne smije obavljati koristeći uobičajenu sintaksu za množenje, sobzirom da će se na taj način obaviti množenje element po element (u skladu sa načinom kako množenjedjeluje na liste), a matrice se tako ne množe:In[43] := a b // MatrixFormOut[43] // MatrixForm =64 10 432 1530 14Stoga, za matrično množenje koristimo operator “.”, odnosno isti operator kao za skalarno množenjevektora:In[44] := a . b // MatrixFormOut[44] // MatrixForm =2419 31 3933 392919 41Vidimo da operator “.” može imati dvije različite uloge: skalarno množenje dva vektora, i matričnomnoženje dvije matrice. Ovaj operator ima i treću ulogu – množenje matrice sa vektorom. Pri tome sevektor tretira kao vektor kolona, odnosno matrica sa samo jednom kolonom:In[45] := a . c // MatrixFormOut[45] // MatrixForm = 48 91 73Na ovom mjestu treba ukazati na jednu grešku (bag) u paketu Mathematica. Naime, nije mogućeiskoristiti funkciju MatrixForm prilikom dodjeljivanja matrice nekoj promjenljivoj s ciljem da se upromjenljivu smjesti matrica koja će se uvijek prikazivati u matričnoj formi. Ukoliko uradimo takonešto, prividno će sve izgledati kako treba, ali će sa tako dodijeljenom matricom Mathematica odbijati– 46 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”da obavlja bilo kakve dalje operacije (jedino će se ona sama prikazivati pravilno). Ovo može djelovativeoma frustrirajuće, s obzirom da se ova greška teško uočava. Ukoliko ipak želimo prikazati rezultatdodjele u matričnoj formi, a da pri tome sama dodjela ispravno funkcionira, čitavu dodjelu moramopisati unutar zagrade (na taj način, funkcija MatrixForm će se primijeniti samo na rezultat dodjele, a nena ono što se dodjeljuje):In[46] := (mat = {{1, 3, 6}, {1, 0, 4}, {2, 3, 0}}) // MatrixFormOut[46] // MatrixForm =13 6 10 423 0Za nalaženje inverzne matrice koristi se funkcija Inverse:In[47] := Inverse[a] // MatrixFormOut[47] // MatrixForm =1 92522515532001251310015Vidimo da Mathematica zna izračunati inverznu matricu u tačnoj formi, pod uvjetom da su svielementi matrice tačni brojevi. U slučaju potrebe, nije nikakav problem dobiti rezultate u decimalnomobliku:In[48] := a // Inverse // N // MatrixFormOut[48] // MatrixForm = 0.36 0.2 0.08 0.150.2 0.0.04 0.130.2Naravno, inverzna matrica pomnožena sa samom matricom mora dati jediničnu matricu:In[49] := Inverse[a] . a // MatrixFormOut[49] // MatrixForm =10 0 0 1 000 1Funkcija Transpose nalazi transponiranu matricu date matrice. Ova funkcija sama za sebe nijeosobito korisna, ali se lijepo može iskoristiti unutar složenijih matrica. Na primjer, nađimo prvotransponiranu matricu matrice a iz dosadašnjih primjera, a nakon toga produkt a T a, pri čemu a Toznačava transponiranu matricu matrice a:In[50] := Transpose[a] // MatrixFormOut[50] // MatrixForm =31 3 48 425 7In[51] := a . Transpose[a] // MatrixFormOut[51] // MatrixForm =2945 39 4590 703970 74Za stepenovanje matrice u matričnom smislu nije moguće koristiti klasičnu sintaksu zastepenovanje, jer će se uz primjenu klasične sintakse obaviti stepenovanje element po element (sobzirom da su matrice interno predstavljene kao liste), što nije u skladu sa definicijom stepena matrice:– 47 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[52] := a 5 // MatrixFormOut[52] // MatrixForm =24310241 32768243102432 312516807Stoga, da bismo obavili stepenovanje matrice u matričnom smislu, moramo koristiti funkcijuMatrixPower sa dva argumenta: matricom koja se stepenuje, i eksponentom:In[53] := MatrixPower[a, 5] // MatrixFormOut[53] // MatrixForm =409551109007161319308466295178420102714179137165359Eksponent u funkciji MatrixForm nije ograničen isključivo na cijele brojeve. Na primjer, zaeksponent –1 dobijamo inverznu matricu, za eksponent 1/2 dobijamo kva<strong>dr</strong>atni korijen matrice (odnosnomatricu koja matrično pomnožena sama sa sobom daje polaznu matricu), itd.Činjenica da se sintaksa za izvjesne matrične operacije u paketu Mathematica razlikuje oduobičajene, čest je uzrok grešaka pri radu sa matricama. Pretpostavimo, na primjer, da želimo izračunativrijednost sljedećeg matričnog izraza:103 332 25441223 103Mnogi bi naivno pokušali ovaj izraz izračunati na sljedeći način:31In[54] := {{1, 3}, {0, 2}} + ( 3 {{3, 5}, {2, 4}} {{4, 2}, {1, 3}} – {{1, 3}, {0, 2}} 3 ) –1 // MatrixFormOut[54] // MatrixForm =25 91 24 301 19 5 9 Ovaj rezultat je, međutim, netačan, s obzirom da su sve operacije obavljene element po element.Ispravan način da se izračuna ovaj izraz je sljedeći:In[55] := {{1, 3}, {0, 2}} + Inverse[3 {{3, 5}, {2, 4}} . {{4, 2}, {1, 3}}– MatrixPower[{{1, 3}, {0, 2}}, 3]] // MatrixFormOut[55] // MatrixForm =7817168278293168Funkcije Det i MatrixRank računaju, respektivno, determinantu i rang matrice:In[56] := Det[a]Out[56] = 100In[57] := {{1, 2}, {3, 4}} // DetOut[57] = –2In[58] := MatrixRank[a]Out[58] = 3Za nalaženje sopstvenih vrijednosti i sopstvenih vektora neke matrice koriste se funkcijeEigenvalues i Eigenvectors. Eigenvalues vraća listu sopstvenih vrijednosti matrice, dok Eigenvectorsvraća listu sopstvenih vektora matrice koji odgovaraju sopstvenim vrijednostima nađenim saEigenvalues. S obzirom da je svaki vektor također lista, Eigenvectors kao rezultat daje listu listi:– 48 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[59] := Eigenvalues[{{1, 2}, {3, 4}}]1 1Out[59] = { 5 33, 5 33}2 2In[60] := Eigenvectors[{{1, 2}, {3, 4}}]4 14 1Out[60] = {{ 533, 1}, { 533, 1}}3 63 6Treba napomenuti da su tačne sopstvene vrijednosti i sopstveni vektori za matrice iole većihdimenzija često vrlo glomazni izrazi. Mathematica radi uštede prostora takve izraze obično predstavlja uvidu već razmatranih Root objekata, čak i u slučajevima kada bi se oni mogli izraziti preko korijena. Tovidimo u sljedećem primjeru, gdje pokušavamo naći sopstvene vrijednosti jedne 3 3 matrice:In[61] := mat = {{1, 2, 1}, {2, 3, 1}, {5, 4, 2}};Eigenvalues[mat]Out[61] = {Root[3 – 2 #1– 6 #1 2 + #1 3 &, 3], Root[3 – 2 #1– 6 #1 2 + #1 3 &, 1], Root[3 – 2 #1– 6 #1 2 + #1 3 &, 2]}Uz pomoć funkcije ToRadicals moguće je Root objekte pretvoriti u izraze sa korijenima, poduvjetom da je to uopće moguće. Međutim, dobijeni izrazi su tipično veoma glomazni:In[62] := % // ToRadicals1/ 3 1/ 3 3 322131 i 3 153i 9519 1/27 1i 3 2 / 32 33153i 9519 1/ 311153i 95192141i 3 153i 9519Out[62] = { 2 ,27 1i 32 ,2 / 333153i 95191/2 / 32 33153i 95191/2 }2Mnogo je korisnije tražiti numeričku aproksimaciju ovakvih rješenja. U navedenom primjeru, imaginarnidio očito potiče od računskih grešaka, pa ćemo rješenje dodatno “prečistiti” funkcijom Chop:In[63] := % // NOut[63] = {6.24338 + 5.55112 10 –17 , –0.825476 + 2.22045 10 –16 , 0.5821 – 4.44089 10 –16 }In[64] := % // ChopOut[64] = {6.24338, –0.825476, 0.5821}Međutim, ukoliko odmah znamo da želimo aproksimativne numeričke vrijednosti sopstvenihvrijednosti ili sopstvenih vektora matrice, mnogo je bolje obrnuti redoslijed funkcija Eigenvalues(odnosno Eigenvectors) i N, odnosno prvo primijeniti funkciju N, pa tek onda funkciju Eigenvalues iliEigenvectors. Pored toga što taj redoslijed daje tačnija rješenja, rješenje se i brže nalazi. To vidimo izsljedećeg primjera (u kojem nam funkcija Chop uopće neće trebati):In[65] := mat // N // EigenvaluesOut[65] = {6.24338, –0.825476, 0.5821}Funkcije IdentityMatrix i DiagonalMatrix korisne su za formiranje matrica specijalne strukture.Tako, funkcija IdentityMatrix[n] daje jediničnu matricu formata n n, dok DiagonalMatrix[d] pričemu je d lista daje dijagonalnu matricu formata n n pri čemu je n dužina liste d, a dijagonalni elementirezultujuće matrice predstavljaju elemente liste d. Ove funkcije lijepo se mogu iskoristiti u složenijimizrazima. Na primjer, podsjetimo se da se karakteristični polinom neke matrice A definira kaodeterminanta od izraza A – x I, gdje je I jedinična matrica istog formata kao i matrica A. Iskoristimosada funkcije Det i IdentityMatrix da pomoću ove formule nađemo karakteristični polinom ranijedefinirane matrice mat:In[66] := Det[mat – x IdentityMatrix[3]]Out[66] = –3 + 2 x + 6 x 2 – x 3– 49 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Sve do verzije 5.0, ovo je ujedno bio i jedini način da u programskom paketu Mathematica nađemokarakteristični polinom neke matrice. U verziji Mathematica 5.0 uvedena je nova funkcijaCharacteristicPolynomial koja direktno računa karakteristični polinom matrice:In[67] := CharacteristicPolynomial[mat, x]Out[67] = –3 + 2 x + 6 x 2 – x 3Po definiciji, nule karakterističnog polinoma su upravo sopstvene vrijednosti matrice. Provjerimo ovo:In[68] := % = = 0 // NSolveOut[68] = {x 6.24338, x 0.5821, x –0.825476}Vidimo da smo dobili praktično isto rješenje kao i direktnom primjenom funkcije Eigenvalues.Matrični račun nam može pomoći i za rješavanje sistema linearnih jednačina. Pretpostavimo daželimo riješiti sistem jednačina x + 2 z = 5, x + y + z = 6 i 2 y – z = 9. Svakako, jedan od načina da toučinimo je pomoću funkcije Solve:In[69] := Solve[{x + 2 z = = 5, x + y + z = = 6, 2 y – z = = 9}, {x, y, z}]Out[69] = {{x 3, y 4, z –1}}Možemo, međutim, postupiti i <strong>dr</strong>ugačije. Neka je A matrica koeficijenata sistema, b vektor slobodnihčlanova, a x vektor koji sa<strong>dr</strong>ži nepoznate sistema. Iz linearne algebre je poznato da se tada sistemlinearnih jednačina može napisati u obliku A x = b, odakle slijedi x = A –1 b. Dakle, rješenje sistemalinearnih jednačina može se naći preko matrične inverzije i matričnog množenja:In[70] := a = {{1, 0, 2},{1, 1, 1},{0, 2, –1}};b = {5, 6, 9};Inverse[a] . bOut[70] = {3, 4, –1}S <strong>dr</strong>uge strane, poznato je da je problem nalaženja inverzne matrice teži od problema rješavanjasistema linearnih jednačina. To zapravo znači da mi lakši problem svodimo na teži. Zbog toga jeuvedena funkcima LinearSolve, koja direktno rješava sistem linearnih jednačina na osnovu poznatematrice koeficijenata i vektora slobodnih članova sistema, bez potrebe za računanjem inverzne matrice(umjesto toga, koristi se Gausov metod eliminacije):In[71] := LinearSolve[a, b]Out[71] = {3, 4, –1}Za slučaj velikih sistema linearnih jednačina, funkcija LinearSolve najbrže dovodi do rješenja, znatnobrže nego recimo Solve ili Reduce. Naravno, funkciju LinearSolve možemo koristiti i bez definiranjapomoćnih promjenljivih koje opisuju koeficijente i slobodne članove sistema:In[72] := LinearSolve[{{1, 0, –2},{1, 1, 1},{0, 2, –1}},{5, 6, 9}]Out[72] = {3, 4, –1}U slučaju da sistem linearnih jednačina nema rješenje, funkcija LinearSolve daje kao rezultatpraznu listu, dok u slučaju neo<strong>dr</strong>eđenih sistema linearnih jednačina (koji imaju beskonačno mnogorješenja), funkcija LinearSolve daje kao rezultat samo jedno od mnoštva mogućih rješenja. Sva rješenja(tj. rješenja u obliku koji zavisi od jedne ili više proizvoljnih konstanti) možemo naći jedino pomoćufunkcije Reduce.– 50 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Još jedna funkcija koja ima veliku primjenu u linearnoj algebri je funkcija NullSpace. Ona je utijesnoj vezi sa homogenim sistemima linearnih jednačina. Naime, poznato je da takvi sistemi uvijekimaju trivijalno rješenje u kojima su sve promjenljive jednake nuli, ali pod o<strong>dr</strong>eđenim uvjetima moguimati i netrivijalna rješenja. NullSpace može poslužiti za nalaženje takvih rješenja. Razmotrimo, naprimjer, sljedeći homogeni sistem:x 1 + 2 x 2 + 4 x 3 + 3 x 4 = 03 x 1 + x 2 + 2 x 3 + x 4 = 02 x 1 + 4 x 2 + 8 x 3 + 6 x 4 = 0Sva rješenja ovog sistema mogu se prikazati u obliku x 1 = k 1 , x 2 = –8 k 1 – 2 k 2 , x 3 = k 2 i x 4 = 5 k 1 , gdje su k 1i k 2 proizvoljne konstante (ovakvo rješenje se nekad iskazuje i u obliku x 2 = –8 x 1 – 2 x 3 , x 4 = 5 x 1 , x 1 i x 3proizvoljni, što se svodi na isto). Pogledajmo šta će se dogoditi ukoliko primijenimo funkciju NullSpacena matricu ovog sistema:In[73] := NullSpace[{{1, 2, 4, 3}, {2, 4, 8, 6}, {3, 1, 2, 1}}]Out[73] = {{1, –8, 0, 5}, {0, –2, 1, 0}}Nije lako odmah prepoznati šta predstavlja dobijeni rezultat, i kako ga ispravno interpretirati.Međutim, stvari postaju mnogo jasnije ako uočimo da se rješenje ovog sistema u matričnoj notaciji moženapisati na sljedeći način: x x x x1234 1 0 = k 1 8 0 + k 2 2 1 5 0 Sad stvari postaju jasnije: vektor rješenja izražava se kao proizvoljna linearna kombinacija vektora kojevraća funkcija NullSpace kao rezultat. Za bolje poznavaoce algebre, recimo da NullSpace u stvari vraćabazne vektore nul-prostora vektorskog prostora generiranog matricom koja joj je ponuđena kaoargument, odakle i potiče njeno ime.S obzirom da su matrice predstavljene kao liste, sve funkcije koje djeluju nad listama mogu seprimijeniti i na matrice.Posebno, izdvajanje i-tog elementa iz matrice izdvojiće zapravo njen i-ti red (sobzirom da su matrice definirane kao liste njihovih redova). Na primjer, sljedeća transakcija izdvaja<strong>dr</strong>ugi red iz ranije definirane matrice a:In[74] := a[[2]]Out[74] = {1, 8, 5}Kako je dobijeni element ponovo lista, na njega možemo ponovo primijeniti izdvajanje da bismoizdvojili neki specifični element matrice. Na primjer, element koji se nalazi u <strong>dr</strong>ugom redu i trećojkoloni možemo izdvojiti na sljedeći način:In[75] := a[[2]][[3]]Out[75] = 5Pošto je ovakva sintaksa pomalo nezgrapna, Mathematica dozvoljava da se izdvajanje pojedinačnihelemenata iz matrice vrši prostim zadavanjem željenog broja reda i kolone razdvojenih zarezom, unutardvojnih uglastih zagrada:In[76] := a[[2, 3]]Out[76] = 5Funkcija Length, primijenjena na matricu, daje broj redova matrice, s obzirom da je to zaista brojelemenata liste kojom se matrica opisuje. Ukoliko želimo saznati broj kolona matrice, možemoprimijeniti funkciju Length na jedan red matrice (svejedno koji, s obzirom da svi imaju isti broj redova),s obzirom da je broj elemenata jednog reda matrice ujedno i broj njenih kolona:– 51 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[77] := Length[a]Out[77] = 3In[78] := Length[a[[1]]]Out[78] = 3Alternativno, možemo koristiti i funkciju Dimensions koja vraća kao rezultat listu oblika {m, n},gdje su m i n dimenzije matrice (broj redova odnosno broj kolona):In[79] := Dimensions[a]Out[79] = {3, 3}Funkcija Table se može iskoristiti i za kreiranje matrica čiji elementi podliježu izvjesnimzakonitostima. To možemo učiniti na više načina. Jedan od načina je da iskoristimo jednu Tablefunkciju unutar <strong>dr</strong>uge, pri čemu unutrašnja Table funkcija generira jedan red matrice, dok spoljašnjaTable funkcija ponavlja generiranje redova sa ciljem da se generira cijela matrica. Na primjer, sljedećatransakcija kreira tablicu množenja za brojeve od 1 do 5, odnosno matricu čiji se koeficijenti a ij moguopisati zakonom a ij = i j, i = 1..5, j = 1..5:In[80] := Table[Table[i j, {j, 5}], {i, 5}] // MatrixFormOut[80] // MatrixForm =12 3 424 6 836 9 1248 12 16510 15 205 10152025Međutim, mnogo lakši način je da upotrijebimo Table funkciju sa dva iteratora, pri čemu se prvi iteratorodnosi na redove, a <strong>dr</strong>ugi na kolone:In[81] := Table[i j, {i, 5}, {j, 5}] // MatrixFormOut[81] // MatrixForm =12 3 424 6 836 9 1248 12 16510 15 205 10152025Na sličan način možemo formirati i, recimo, matricu formata 3 4, čiji su elementi slučajni brojeviu opsegu od 1 do 10:In[82] := Table[Random[Integer, {1, 10}], {3}, {4}] // MatrixFormOut[82] // MatrixForm =35 2 6 51 1 327 6 9Naravno, prikazani rezultat je samo jedan od mogućih, s obzirom da su sve vrijednosti slučajne.Opisana forma funkcije Table može se koristiti za bilo koje strukture koje imaju formu liste listi, akoje ne moraju nužno biti matrice. Ovo je ilustrirano u sljedećem primjeru koji koristi funkciju Table ifunkciju Binomial da formira prvih 8 redova Paskalovog trougla:In[83] := Table[Random[Integer, {1, 10}], {3}, {4}] // MatrixFormOut[83] = {{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1}, {1, 5, 10, 10, 5, 1},{1, 6, 15, 20, 15, 6, 1},{1, 7, 21, 35, 35, 21, 7, 1}}– 52 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”9. Definiranje vlastitih funkcijaMathematica poznaje veliki broj ugrađenih funkcija. Međutim, često se javlja potreba zadefiniranjem vlastitih funkcija. U paketu Mathematica razlikuje se postupak definiranja funkcija uzavisnosti da li je domen funkcije konačan ili beskonačan skup. Za slučaj kada je domen funkcijekonačan, funkcija se definira prostim pobrojavanjem. Na primjer, neka želimo definirati funkciju f čiji jedomen skup X = {1, 5, a, kupus}, a kodomen skup Y = {12, xyz, lopata, sarma}, i koja vrši preslikavanjeu skladu sa pravilima f(1) = lopata, f(5) = 12, f(a) = xyz i f(kupus) = 12. Ovu funkciju možemo definiratipomoću sljedećeg skupa dodjela:In[1] := f [1] =lopata;f [5] = 12;f [a] = xyz;f [kupus] =lopata;Možemo isprobati da vidimo kako uvedena definicija djeluje:In[2] := f[1]Out[2] = lopataIn[3] := f[kupus]Out[3] = 12In[4] := 3 f[kupus] + 1Out[4] = 37In[5] := f[6–5]Out[5] = lopataIn[6] := f[6–4]Out[6] = f [2]Ovi primjeri ujedno pokazuju da se novodefinirana funkcija može koristiti kao i svaka <strong>dr</strong>ugafunkcija. Posljednja dva primjera također pokazuju da se argumenti korisnički definiranih funkcijaizračunavaju na isti način kao i kod ugrađenih funkcija. Rezultat posljednje funkcije je ostao neizračunat,u formi f [2], s obzirom da vrijednost 2 ne pripada domenu funkcije f.Funkcije koje definira korisnik mogu imati bilo kakvo ime koje je dozvoljeno za promjenljive, itakođer mogu sa<strong>dr</strong>žavati velika i mala slova. Ipak, uobičajeno je da se imena korisnički definiranihfunkcija pišu isključivo malim slovima, da bi se razlikovala od imena funkcija ugrađenih u paketMathematica.Bitno je napomenuti da, za razliku od definiranja promjenljivih, nova dodjela istoj funkciji neponištava prethodne dodjele, već samo nadopunjuje već postojeću definiciju. Stoga, ukoliko želimoizvršiti novu definiciju neke funkcije, potrebno je pomoću funkcije Clear izbrisati prethodnu definiciju.Najbolje je svaku ulaznu ćeliju koja definira neku funkciju uvijek započeti naredbom Clear. Na taj načinćemo biti sigurni da je eventualno postojeća prethodna definicija u potpunosti izbrisana, i izbjeći vrlonezgodne probleme koji bi mogli nastati usljed miješanja starih i novih definicija.Funkcije definirane pobrojavanjem treba koristiti samo u slučajevima kada je pobrojavanje jedininačin za definiranje funkcije. Na primjer, ukoliko želimo definirati funkciju nad skupom gradova Bosnei Hercegovine koja daje kao rezultat broj stanovnika nekog grada, jasno je da takvu funkciju možemodefinirati samo pobrojavanjem. Međutim, pobrojavanje je nemoguće ukoliko je domen funkcijebeskonačan skup. U tom slučaju, koristimo definiranje funkcija pomoću formula. Na primjer, nekaželimo definirati funkciju g sa u koja je opisana formulom g(x) = x 2 + 3 x + 1. Pokušaj da ovufunkciju definiramo slično kao pri definiranju pobrojavanjem, dovodi do neuspjeha, kao što slijedi izprikazanog primjera:– 53 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[7] := Clear[g];[x] = x 2 + 3 x + 1In[8] := g[x]Out[8] = 1 + 3 x + x 2In[9] := g[y]Out[9] = g[y]In[10] := g[3]Out[10] = g[3]Iz ovog primjera vidimo šta je zapravo problem. Ova definicija je shvaćena kao da se nekikonkretan element nazvan x koji se nalazi u domenu funkcije preslikava u izraz x 2 + 3x + 1. Stoga,definicija “zna” šta je f(x), ali “ne zna” šta je f(y) (jer smatra da je y neki <strong>dr</strong>ugi element, za koji nijerečeno da je u domenu), a pogotovo ne šta je f(3). S <strong>dr</strong>uge strane, kada kažemo da je g(x) = x 2 + 3 x + 1,mi obično ne mislimo tako, nego mislimo da je x samo formalno ime za argument funkcije koji bivazamijenjen nekom <strong>dr</strong>ugom konkretnom vrijednošću prilikom upotrebe funkcije!Da bismo riješili ovaj problem, moramo se upoznati sa pojmovima formalnog parametra i šablona.Razmotrimo jedan konkretan problem koji će nas dovesti do ovih pojmova. Pretpostavimo da imamoizraz poput x 2 + 2 y 2 + (x + y) 2 u kojem želimo da smijenimo sve kva<strong>dr</strong>ate kubovima. Kako definiratipravilo za smjenu? Navoditi posebno tri smjene x 2 x 3 , y 2 y 3 i (x + y) 2 (x + y) 3 očito nije elegantno,niti je primjenljivo za slučaj još složenijih izraza. Smjena poput 2 3 također nije dobra, jer bi smijenilasvaku pojavu broja 2 brojem 3 (a ne samo u eksponentu), što također nije ono što nam treba. Pravorješenje je prikazano u primjeru koji slijedi:In[11] := x 2 + 2 y 2 + (x + y) 2 /. t_ 2 t 3Out[11] = x 3 + 2 y 3 + (x + y) 3U ovom primjeru, konstrukcija t_ 2 predstavlja tzv. šablon, koji u konkretnom primjeru možemotumačiti kao “bilo šta na kva<strong>dr</strong>at”, pri čemu se to “bilo šta” prilikom vršenja smjene privremeno imenujeimenom t. Kada se god uoči bilo šta dignuto na kva<strong>dr</strong>at, vrši se njegovo imenovanje privremenimimenom, nakon čega se obavlja njegova transformacija u skladu sa zadanim pravilom. Stoga se, ukonkretnom primjeru, t naziva formalni parametar šablona t_ 2 . Dakle, znak “_” iza imena govori da imepredstavlja formalni parametar, koji će biti smijenjen nekim stvarnim izrazom u odgovarajućemkontekstu. Pri tome je bitno naglasiti da je ime formalnog parametra posve nebitno (ono služi samo da sena njega može pozivati u definiciji pravila) i da se čak može poklapati sa imenom nekih od simbola kojizaista postoje u izrazu koji se transformira. Drugim riječima, sljedeća smjena se također obavlja na istinačin kao i prethodna:In[12] := x 2 + 2 y 2 + (x + y) 2 /. x_ 2 x 3Out[12] = x 3 + 2 y 3 + (x + y) 3Šabloni i formalni parametri su vrlo moćno sredstvo paketa Mathematica. Na primjer, šabloni ismjene koje ih koriste mogu zavisiti od više formalnih parametara. Recimo, moguće je upotrijebitismjenu poput u_ + v_ u – v, u kojoj se javlja šablon u_ + v_ koji zavisi od dva formalna parametra.Sljedeći primjer pokazuje način upotrebe ovakvog šablona:In[13] := x y 2 + 2x 2 y 3 /. u_ + v_ u – vOut[13] = x y 2 – 2x 2 y 3Na žalost, prostor nam ne dozvoljava da se detaljno bavimo šablonima, pogotovo zbog činjenice danjihovo potpuno shvatanje traži detaljniji opis načina interne reprezentacije izraza u paketuMathematica. Stoga ćemo samo objasniti ono zbog čega smo šablone i uveli ovdje: kako napravitifunkciju definiranu formulom. Rješenje je jednostavno: samo treba kao argument funkcije upotrijebitišablon, čime argument u njenoj definiciji postaje formalni parametar. Pored toga, trenutnu dodjelu trebazamijeniti zakašnjelom dodjelom:– 54 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[19] := Clear[g];g[x_] := x 2 + 3x + 1Ovakva definicija sada radi u skladu sa očekivanjima, kao što slijedi iz primjera:In[20] := g[x]Out[20] = 1 + 3x + x 2In[21] := g[y]Out[21] = 1 + 3y + y 2In[22] := g[3]Out[22] = 19Nije teško shvatiti kako ova definicija radi: formalni parametar prilikom poziva funkcije seprivremeno identificira sa konkretnim argumentom koji je upotrijebljen prilikom poziva funkcije.Zakašnjela dodjela je neophodna zbog toga što se to uvrštavanje treba da obavi tek kada se funkcijaupotrijebi, a ne u trenutku kada se ona definira.Prilikom definiranja funkcija preko šablona i formalnih parametara, za domen funkcije sepo<strong>dr</strong>azumijeva da obuhvata skup svih objekata koje Mathematica poznaje, što uključuje ne samo realne,nego i kompleksne brojeve, liste, matrice, i još mnoge <strong>dr</strong>uge objekte. U nekim slučajevima ovakavdomen je preširok, pa je prilikom definiranja funkcija preko šablona i formalnih parametara mogućepomoću operatora “/;” suziti domen funkcije na skup onih elemenata koji zadovoljavaju uvjet navedeniza ovog operatora. Slijedi jedan primjer:In[23] := Clear[g];g[x_] := x 2 + 3x + 1 /; x > 1In[24] := g[3]Out[24] = 19In[25] := g[0]Out[25] = g[0]Vrijednost g[0] ostala je neizračunata, jer je u definiciji domen funkcije ograničen isključivo na brojevekoji su veći od 1.Moguće je miješati definicije sa formalnim parametrima i konkretnim parametrima. Prilikomizvršavanja funkcije, prvo se provjerava postoji li definicija sa upotrijebljenim konkretnim parametrom,pa tek ukoliko ne, tada se primjenjuju definicije sa formalnim parametrima:In[26] := Clear[f];f [0] = 5;f [x_] := x 2In[27] := f [3]Out[27] = 9In[28] := f[7]Out[28] = 49In[29] := f[0]Out[29] = 5Funkcije mogu imati više parametara, pri čemu je moguće slobodno miješati konkretne i formalneparametre, kao u sljedećem primjeru:– 55 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[30] := Clear[h];h[1, x_, y_] := x + y;h[2, x_, y_] := x – y;In[31] := h[1, 7, 3]Out[31] = 10In[32] := h[2, 7, 3]Out[32] = 4In[33] := h[3, 7, 3]Out[33] = h[3, 7, 3]Vrijednost h[3, 7, 3] ostala je neizračunata, s obzirom da ne postoji definicija iz koje se može zaključitikako se računa vrijednost ove funkcije kada prvi argument nije niti 1 niti 2.Funkcija može imati više definicija na različitim domenima. Na primjer, poznata matematičkafunkcija signum definirana je kao sgn x = 1 ako je x > 0, sgn x = –1 ako je x < 0, i sgn x = 0 ako je x = 0.Definirajmo i testirajmo ovu funkciju u paketu Mathematica:In[34] := sgn[x_] := 1 /; x > 0sgn[x_] := –1 /; x < 0sgn[0] =1;In[35] := sgn[5]Out[35] = 1In[36] := sgn[–5]Out[36] = –1In[37] := sgn[0]Out[37] = 0Primijetimo da je vrijednost funkcije signum za x = 0 lakše definirati koristeći konkretnu vrijednostparametra nego preko restrikcije domena uz uvjet x = 0, te smo tako i učinili. U slučaju da se domenidati definicijama preklapaju, za one vrijednosti argumenata koje upadaju u više domena kao relevantnase uzima prva definicija po redu koja zadovoljava ograničenje dato argumentom.Funkcija se može definirati tako da se poziva na samu sebe. Takve funkcije nazivaju se rekurzivnefunkcije. Na primjer, matematička operacija faktorijel data izrazom n! = 1 2 ... n može se definirati irekurzivno, na sljedeći način: 1, za n 1n! = n ( n 1),zan 1Na primjer, izračunavanje 4! po ovoj definiciji teče ovako:4! = 4 3! = 4 (3 2!) = 4 [3 (2 1!)] = 4 [3 (2 1)] = 4 (3 2 ) = (4 6) = 24Napišimo sada rekurzivnu funkciju fakt koja računa faktorijel svog argumenta, i testirajmo je:In[38] := Clear[fakt]fakt[1] =1;fakt[n_] := n fakt[n–1];In[39] := fakt[5]Out[39] = 120– 56 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Izgleda kao da sve radi dobro. Problemi, međutim, nastaju upotrijebimo li ovu funkciju sa necjelobronimargumentom (sličan problem nastaje i ukoliko argument nije konkretan broj, nego izraz koji sa<strong>dr</strong>žisimbole):In[40] := fakt[1.5]$RecursionLimit::reclim : Recursion depth of 256 exceeded.Out[40] = –1.3756016026411 10 498 Hold[fakt[–252.5–1]]U čemu je problem, lako možemo vidjeti ukoliko pokušamo ručno izračunati faktorijel od 3.5prema navedenoj rekurzivnoj definiciji:1.5! = 1.5 0.5! = 1.5 [0.5 (–0.5!)] = 1.5 {0.5 [–0.5 (–1.5)!]} = ...Ovaj proces se očito može nastaviti bez kraja. Ukoliko se rekurzivni pozivi ne razriješe u 256 pokušaja,paket Mathematica smatra da sa definicijom nešto nije u redu i prekida izračunavanje (granica 256 se popotrebi može promijeniti). Prikazani besmisleni rezultat zapravo prikazuje stanje izračunavanja utrenutku kada je proces prekinut. Problem se lako rješava ukoliko domen definicije funkcije ograničimosamo na prirodne brojeve (faktorijel zaista i jeste definiran samo za prirodne brojeve):In[41] := Clear[fakt];fakt[n_] := n fakt[n–1] /; n Integers && n > 1fakt[1] =1;In[42] := fakt[4]Out[42] = 24In[43] := fakt[1.5]Out[43] = fakt[1.5]Sad je, kao što vidimo, sve u redu.Za kreiranje funkcija koje su predstavljene sa više definicionih izraza, mogu se korisno upotrijebitifunkcije If i Which. Funkcija If ima dva, tri ili četiri parametra. Prvi parametar je uvjet. Drugi parametarpredstavlja rezultat ukoliko je uvjet ispunjen. Treći parametar (ako ga ima) predstavlja rezultat ukolikouvjet nije ispunjen (ako trećeg parametra nema, u tom slučaju se ne daje nikakav rezultat). Četvrtiparametar (ako ga ima) predstavlja rezultat ukoliko se tačnost uvjeta ne može utvrditi. U sljedećemprimjeru definiramo i testiramo funkciju f za koju vrijedi f(x) = x 2 ako je x > 0, a f(x) = x 3 u suprotnom:In[44] := Clear[f];f[x_] := If[x > 0, x 2 , x 3 ]In[45] := f[4]Out[45] = 16In[46] := f[–4]Out[46] = –64Funkcija Which mora imati paran broj argumenata, od kojih prvi, treći, peti, itd. predstavljajuuvjete. Uvjeti se testiraju slijeva nadesno. Rezultat je izraz koji slijedi neposredno iza prvog uvjeta zakoji se ispostavi da je tačan. Na primjer, sljedeća definicija predstavlja alternativni način da se definirasignum funkcija:In[47] := Clear[sgn];sgn[x_] := Which[x > 0, 1, x < 0, –1, x = = 0, 0]In[48] := sgn[5]Out[48] = 1– 57 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[49] := sgn[–5]Out[49] = –1In[50] := sgn[0]Out[50] = 0Vidimo da smo dobili isti efekat kao pomoću višestrukih definicija uz restrikciju domena. Savjetuje seuvijek koristiti If i Which pri definiciji složenijih funkcija, ukoliko je to moguće.10. Grafički prikaz funkcijaPaket Mathematica omogućava vrlo efektnu grafičku prezentaciju raznih objekata. Ovdje ćemo seograničiti na crtanje funkcija. Za tu svrhu koristi se funkcija Plot. Njen prvi argument predstavlja izrazkoji definira funkciju koju crtamo, dok <strong>dr</strong>ugi argument predstavlja listu od tri elementa, koji redompredstavljaju nezavisnu promjenljivu, kao i opseg u kojem treba da se kreće nezavisna promjenljiva:In[1] := Plot[x 2 + Sin[3 x], {x, –3, 3}]8642-3 -2 -1 1 2 3Out[1] = – Graphics –Ukoliko želimo nacrtati grafik više funkcija u istom koordinatnom sistemu, sve funkcije kojecrtamo jednostavno objedinimo u listu:In[2] := Plot[{Sin[x], Cos[x]}, {x, –5, 5}]10.5-4 -2 2 4-0.5Out[2] = – Graphics –-1Evo kako se možemo uvjeriti da jednačina cos x = 2 – x zaista ima jedno rješenje u okolini tačkex = 3, što smo koristili kod opisa funkcije FindRoot:In[3] := Plot[{Cos[x], 2 – x}, {x, –4, 4}]4321-4 -2 2 4-1Out[3] = – Graphics –-2– 58 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Veličinu grafika možemo po potrebi mijenjati uz pomoć miša. Vidimo da Mathematica sama o<strong>dr</strong>ediopseg po ordinatnoj osi, tako da glavnina grafikona bude prikazana. Ukoliko sami želimo zadati opsegpo ordinatnoj osi, možemo to uraditi postavljanjem opcije PlotRange na način koji je jasan iz sljedećegprimjera:In[4] := Plot[x 2 + Sin[3 x], {x, –3, 3}, PlotRange {–5, 5}]-3 -2 -1 1 2 3-1Out[4] = – Graphics –54321-2-3Vrijednosti podioka po apscisnoj i ordinatnoj osi ne moraju nužno biti jednake, što zavisi od samoggrafika. Dodavanjem opcije AspectRatio Automatic postižemo da će te vrijednosti biti jednake:In[5] := Plot[x 2 + Sin[3 x], {x, –2, 2}, AspectRatio Automatic]4321-2 -1 1 2Out[5] = – Graphics –Umjesto Automatic, može se pisati i broj koji o<strong>dr</strong>eđuje odnos između dužine podioka na osama.Opcije PlotRange i AspectRatio mogu se i kombinirati:In[6] := Plot[x 2 + Sin[3 x], {x, –2, 2}, AspectRatio Automatic, PlotRange {–1, 3}]32.521.510.5-2 -1 1 2-0.5Out[6] = – Graphics –-1Funkcije koje se crtaju mogu biti bilo kakve numerički izračunljive funkcije (tj. koje za brojčaniargument daju brojčani rezultat), što uključuje i izraze koji sa<strong>dr</strong>že funkcije If i Which, kao i korisničkidefinirane funkcije. Također, funkcija Plot pored opcija PlotRange i AspectRatio prihvata i na desetine– 59 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”<strong>dr</strong>ugih opcija, koje ovdje ne možemo opisivati, pomoću kojih se grafik može estetski oblikovati iprilagoditi svim potrebama.Mathematica može i crtati grafike funkcija dvije promjenljive, pri čemu tada grafik predstavljapovrš u prostoru. To se postiže pomoću funkcije Plot3D, koja prima brojne opcije, koje ovdje nemožemo opisivati. Ilustriraćemo samo na jednostavnom primjeru crtanje funkcije z = sin x y, pri čemu sex i y kreću u intervalu od –4 do 4:In[7] := Plot3D[Sin[x y], {x, –4, 4}, {y, –4, 4}]10.50-0.5-1-2012-101Out[7] = – SurfaceGraphics –-12-2Mathematica zna crtati i grafike parametarski zadanih funkcija. To su krivulje koje opisuje tačka(x, y) u koordinatnom sistemu ukoliko se x i y mijenjaju po zakonu x = (t) i y = (t) gdje su i nekezadane funkcije, a t uzima vrijednosti iz nekog skupa. Ovakvi grafici imaju veliku primjenu uračunarskoj grafici, jer se pomoću jednostavnih funkcija mogu opisivati vrlo komplikovane krivulje. Zacrtanje parametarski zadanih funkcija možemo koristiti funkciju ParametricPlot. Sljedeći primjer crtagrafik funkcije x = cos 5t i y = sin 5t za t (0, 2):In[8] := ParametricPlot[{Cos[5 t], Sin[7 t]}, {t, 0, 2}]10.5-1 -0.5 0.5 1-0.5Out[8] = – Graphics –-1Opcije PlotRange i AspectRatio mogu se koristiti i u kombinaciji sa ParametricPlot:In[9] := ParametricPlot[{Cos[5 t], Sin[7 t]}, {t, 0, 2}, PlotRange {{–1.2, 1.2}, {–1.2, 1.2}},AspectRatio Automatic]1.510.5-1.5 -1 -0.5 0.5 1 1.5-0.5-1-1.5Out[9] = – Graphics –– 60 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Iz ovog primjera vidimo da se u opciji PlotRange mogu zadati i dvije liste, od kojih prva o<strong>dr</strong>eđujeopseg po x osi, a <strong>dr</strong>uga opseg po y osi. Inače, prikazane krivulje spadaju u tzv. Lisažuove krivulje, kojesu općenito zadane izrazima x = cos a t, y = sin (b t + c), gdje su a, b i c neke konstante. Variranjem a, b ic mog se dobiti veoma raznolike krivulje.Mathematica može vršiti i grafičku prezentaciju podataka koji su dati u vidu listi parova, pri čemuse za svaki element liste (par) smatra da predstavlja koordinate jedne tačke u ravni. Na primjer, prvoćemo, uz malo pomoći trigonometrije, generirati koordinate 20 tačaka koje su ravnomjerno raspoređenena jediničnom krugu:In[10] := Table[{Sin[k Pi/10], Cos[k Pi/10]}, {k, 1, 20}]Out[10] = {{0.309017, 0.951057}, {0.587785, 0.809017}, {0.809017, 0.587785},{0.951057, 0.309017}, {1., 0.}, {0.951057, –0.309017}, {0.809017, –0.587785},{0.587785, –0.809017}, {0.309017, –0.951057}, {0., –1.}, {-0.309017, –0.951057},{–0.587785, –0.809017}, {–0.809017, –0.587785}, {–0.951057, –0.309017}, {–1., 0.},{–0.951057, 0.309017}, {–0.809017, 0.587785}, {–0.587785, 0.809017},{–0.309017, 0.951057}, {0., 1.}}Zatim ćemo te tačke grafički prikazati uz pomoć funkcije ListPlot:In[11] := ListPlot[%, AspectRatio Automatic]10.5-1 -0.5 0.5 1-0.5-1Out[11] = – Graphics –U sljedećem primjeru koristimo ListPlot da grafički prikažemo distribuciju prvih 30 prostihbrojeva:In[12] := ListPlot[Table[{i, Prime[i]}, {i, 1, 30}]]10080604020Out[12] = – Graphics –5 10 15 20 25 30Funkcija ListPlot prihvata iste opcije kao i Plot.11. Neke primjene u matematičkoj analiziMathematica poznaje brojne operacije koje se koriste u matematičkoj analizi. Počećemo sagraničnim vrijednostima. Intuitivno se kaže da funkcija f(x) ima graničnu vrijednost ili limes jednak Akad x teži ka x 0 ukoliko vrijednosti funkcije postaju sve bliže vrijednosti A kada x postaje sve bliži x 0 ,bez obzira da li je funkcija definirana u tački x 0 ili nije. Granične vrijednosti nalazimo pomoću funkcijeLimit, gdje prvi argument predstavlja f(x), a <strong>dr</strong>ugi je oblika x x 0 . Slijede primjeri nekih poznatihgraničnih vrijednosti:– 61 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”In[1] := Limit[Sin[x] / x, x 0]Out[1] = 1In[2] := Limit[1 / n!, n ]Out[2] = 1In[3] := Limit[(1+1/x) x , x ]Out[3] =In[4] := % // NOut[4] = 2.71828Simbol “” možemo dobiti putem tastature koristeći kombinaciju tipki |Esc| inf |Esc|. Umjestosimbola “” možemo koristiti i naziv Infinity, sa istim značenjem.U nekim slučajevima, granična vrijednost može zavisiti od toga da li se traženoj vrijednostipribližavamo slijeva ili zdesna. Na primjer, vrijednost izraza arc tg (1/x) kad x teži ka 0 teži ka /2ukoliko se nuli približavamo zdesna, a ka –/2 ukoliko se približavamo slijeva. Mathematica u takvimslučajevima po<strong>dr</strong>azumijeva približavanje zdesna:In[5] := Limit[ArcTan[1/x], x 0]Out[5] =2Ukoliko želimo približavanje slijeva, potrebno je dodati opciju Direction 1:In[6] := Limit[ArcTan[1/x], x 0, Direction 1]Out[6] = 2Mathematica u izvjesnoj mjeri poznaje i račun sa beskonačnim veličinama. Također, kao rezultatračunanja se mogu pojaviti i simboli odnosno – ukoliko se zna da je rezultat beskonačan ali tačnoo<strong>dr</strong>eđenog znaka. Simbol ComplexInfinity označava beskonačnost nedefiniranog znaka,Indeterminate predstavlja potpuno neo<strong>dr</strong>eđenu veličinu. U slučaju kada je rezultat tipaComplexInfinity ili Indeterminate, pojavljuje se i poruka upozorenja. Slijedi nekoliko primjera:In[7] := Log[0]Out[7] = – In[8] := 1/ Out[8] = 0In[9] := 2–5*Out[9] = – In[10] := 1/0Power::infy : Infinite expressionOut[10] = ComplexInfinityIn[11] := 2–5*InfinityOut[11] = – In[12] := ArcTan[]Out[12] =2In[13] := – encountered.::indet : Indeterminate expression – + encountered.Out[13] = Indeterminate10– 62 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Mathematica u velikom broju slučajeva zna sumirati redove, bilo konačne, bilo beskonačne. Za tusvrhu koristi se funkcija Sum, pri čemu je prvi argument opći član reda, a <strong>dr</strong>ugi argument iterator (kaokod funkcije Table) koji o<strong>dr</strong>eđuje granice sumiranja. Slijede dva poznata primjera. Prvi primjer ilustrirapoznatu konačnu sumu 1 2 + 2 2 + 3 2 + ... + n 2 = n (n + 1) (2n + 1) / 6, a <strong>dr</strong>ugi primjer ilustrira beskonačnusumu 1/2 + 1/4 + 1/8 + 1/16 + ... = 1 koja je stvarala glavobolje grčkim filozofima, koji su iz neprihvatanjatakvih suma izvodili paradokse poput čuvenog Zenonovog paradoksa o Ahilu i kornjači:In[14] := Sum[i 2 , {i, 1, n}]1n (1 n)(1 2n6Out[14] = )In[15] := Sum[1/2 i , {i, 1, }]Out[15] = 1Suma beskonačnih redova, naravno, ne mora biti konačna. Takvi redovi su divergentni.Mathematica zna uočiti takve redove i prijaviti upozorenje:In[16] := Sum[2 i , {i, 1, }]Out[16] = i1Sum::idiv : Sum does not converge.i2S <strong>dr</strong>uge strane, beskonačni redovi čiji opći član ovisi od nekog parametra, mogu za neke vrijednostiparametra biti konvergentni (tj. imati konačnu sumu), a za neke <strong>dr</strong>uge vrijednosti biti divergentni.Mathematica daje sumu uz pretpostavku da su parametri takvi da red konvergira, ali bez ispitivanja zakoje vrijednosti parametara to vrijedi. Slijedi primjer u kojem je dat poznati beskonačni geometrijski red,koji konvergira za | a | < 1, a inače divergira. Mathematica ispravno nalazi sumu ovog reda pod timuvjetom, ali ne govori nam ništa da a mora biti takav. Ovo se može shvatiti kao nedostatak funkcijeSum:In[17] := Sum[a i , {i, 1, }]aOut[17] = 1aČesto se dešava da se suma nekog reda ne može izraziti preko elementarnih funkcija. Mathematicapoznaje veliki broj matematičkih funkcija koje ne spadaju u klasu elementarnih funkcija. Ukoliko serezultat može izraziti preko neke od njih, Mathematica će to i učiniti. Tako se, na primjer, sumasljedećeg reda izražava preko tzv. Rimanove zeta funkcije (x):In[18] := Sum[1/i 3 , {i, 1, }]Out[18] = Zeta[3]Šta je Rimanova zeta funkcija, to na ovom mjestu nije bitno. Bitno je da, u slučaju potrebe,Mathematica može aproksimativno izračunati njenu vrijednost, kao i vrijednosti svih <strong>dr</strong>ugihneelementarnih funkcija koje poznaje:In[19] := % // NOut[19] = 1.20206Ukoliko nas zanima samo numerička aproksimacija rješenja, do rezultata se mnogo brže dolazikorištenjem funkcije NSum umjesto Sum. Ovo je moguće samo za redove čiji opći član ne sa<strong>dr</strong>žinikakve parametre osim promjenljive po kojoj se vrši sumiranje:In[20] := NSum[1/i 3 , {i, 1, }]Out[20] =1.20206– 63 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”S <strong>dr</strong>uge strane, kaskadno korištenje funkcija Sum i N u izvjesnim “nezgodnim” slučajevima može datitačnije rezultate, s obzirom da funkcija NSum koristi izvjesne aproksimativne numeričke metode koji,mada rade veoma brzo, mogu zakazati u izvjesnim (na sreću, veoma rijetkim) slučajevima.Ukoliko se rezultat sumiranja ne može iskazati ni preko kakvih poznatih funkcija, Mathematica redostavlja neizračunat. Međutim, numerička aproksimacija rezultata se može tražiti čak i za takve redove(pod uvjetom da opći član ne ovisi od dodatnih parametara):In[21] := Sum[1/(i!+i 2 ), {i, 1, }]Out[21] = 12i1i i!In[22] := % // NOut[22] = 0.766777Nalaženje izvoda funkcija ne predstavlja nikakav problem za paket Mathematica. Intuitivno rečeno,prvi izvod neke funkcije f(x) je <strong>dr</strong>uga funkcija f ’(x) koja opisuje brzinu njenog rasta. Tako, ako xpredstavlja vrijeme, a f(x) opisuje zakon promjene puta nekog tijela u vremenu, tada f ’(x) opisuje zakonpromjene brzine tog tijela. Precizno se izvodi definiraju preko graničnih vrijednosti. Drugi izvod f ’’(x)predstavlja prvi izvod prvog izvoda, a fizikalno predstavlja zakon opisivanja promjene ubrzanja. Sličnose definira treći izvod kao prvi izvod <strong>dr</strong>ugog izvoda (ili <strong>dr</strong>ugi izvod prvog izvoda), itd.Za nalaženje izvoda u paketu Mathematica postoji više načina. Prvi način zasniva se na činjenici daukoliko smo definirali neku vlastitu funkciju, recimo f, Mathematica automatski definira i njene izvode,koji se zovu f ', f '', f ''', itd. Ovdje je “ ' ” znak apostrof (oprez: na nekim tastaturama ima više različitihapostrofa; pravi je onaj koji nije nakošen niti nalijevo niti nadesno). Slijedi primjer:In[23] := f [x_] := ArcTan[x 2 ] 2 Cos[x]In[24] := f '[x]x ArcTan[x24 ]2 2Out[24] = ArcTan[x ] Sin[x ]41xIn[25] := f ''[x]222 2 8x 16x ArcTan[x ] 4ArcTan[x ] Out[25] = ArcTan[x ] Sin[x] Cos[x] 4 24 24 (1 x ) (1 x ) 1x 8 x ArcTan[x1x42]Sin[x]2Drugi način za nalaženje izvoda ne traži prethodno definiranje funkcije. Funkcija D nalazi izvodsvog prvog argumenta, smatrajući da je nezavisna promjenljiva ona koja je zadana kao <strong>dr</strong>ugi argument(ovo je bitno ukoliko funkcija zavisi od više promjenljivih). Ukoliko želimo izvode višeg reda, zajednosa nezavisnom promjenljivom željeni red stavimo u listu. Slijedi isti primjer, samo bez prethodnogdefiniranja pomoćne funkcije:In[26] := D[ArcTan[x 2 ] 2 Cos[x], x]2 2x ArcTan[x ] ArcTan[x41x4 2 2Out[26] = ] Sin[x ]In[27] := D[ArcTan[x 2 ] 2 Cos[x], {x, 2}]22222 2 8x 16x ArcTan[x ] 4ArcTan[x ] Out[27] = ArcTan[x ] Sin[x] Cos[x] 4 24 24 (1 x ) (1 x ) 1x 8 x ArcTan[x1x42]Sin[x]22– 64 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Interesantno je da se mogu nalaziti i izvodi izraza koji sa<strong>dr</strong>že nedefinirane funkcije. Rezultat se tadaizražava u općenitom obliku:In[28] := D[u[v[x]] u[x], x]Out[28] = u[v[x]] u'[x] + u[x] u'[v[x]] v'[x]In[29] := D[u[x] v[x], {x, 2}]Out[29] = 2 u'[x] v'[x] + v[x] u''[x] + u[x] v'[x]Vrlo je važno napomenuti da Mathematica ne pojednostavljuje automatski izraze koji nastaju nakondiferenciranja, već samo rutinski primjenjuje pravila diferenciranja na polazni izraz. Stoga je veomakorisno pokušati dodatno pojednostaviti rezultat diferenciranja pomoću funkcija Simplify odnosnoFullSimplify. U mnogo slučajeva ovo će dovesti do znatnog pojednostavljenja rezultata:In[30] := D[–2 ArcTan[x] + Log[x – 1] – Log[x + 1], x]Out[30] =1 1 2 1 x 1x 1xIn[31] := % // SimplifyOut[31] =41 x42Za nalaženje razvoja funkcije u Tejlorov polinom koristi se funkcija Series. Prvi argumentpredstavlja izraz koji se razvija, dok je <strong>dr</strong>ugi argument lista koja sa<strong>dr</strong>ži ime nezavisne promjenljive,tačku oko koje se vrši razvoj, i traženi stepen polinoma:In[32] := Series[Sin[x], {x, 0, 9}]3 5 79x x x xOut[32] = x O[x]6 120 5040 362880In[33] := Series[Log[x], {x, 1, 5}]1 2 1 3 1 4 1 5Out[33] = ( x 1) (x 1) (x 1) (x 1) (x 1) O[x 1]2 3 4 510Izrazi poput O[x] 10 u rezultatu govore da je greška koja nastaje usljed aproksimacije funkcije dobijenimpolinomom istog reda veličine kao x 10 .Mathematica zna da nalazi i neo<strong>dr</strong>eđene i o<strong>dr</strong>eđene integrale. Neo<strong>dr</strong>eđeni integral predstavljaoperaciju obrnutu od nalaženja izvoda, a postiže se pomoću funkcije Integrate. Prvi argumentpredstavlja izraz koji se integrira, a <strong>dr</strong>ugi argument predstavlja nezavisnu promjenljivu:In[34] := Integrate[x 2 Sin[x], x]Out[34] = –(–2+x 2 ) Cos[x] + 2 x Sin[x]Ovaj rezultat bi se, korištenjem standardne matematičke notacije prikazao kao2x sinx dx = –(–2+x 2 ) cos x + 2 x sin xSlijedi jedan nešto složeniji primjer, u kojem izraz koji se integrira zavisi od parametra:In[35] := Integrate[x41 a4, x] 222Out[35] = 2 ArcTan1 2 ArcTan1 Loga 2 a x x 412 aLog a22 a x x2 2 xa2 xa6– 65 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”Slično kao kod diferenciranja, Mathematica neće automatski pokušavati da pojednostavi dobijenirezultat integracije. Stoga je primjena funkcija Simplify odnosno FullSimplify na rezultat integracijeobično vrlo dobra ideja.Rezultati integracije mogu biti izuzetno rogobatni u slučajevima kada se integracija svodi naintegraciju racionalnih izraza, čiji se nazivnik ne da lako faktorizirati. Mathematica radi uštede prostorarezultate takvih integracija prikazuje u vidu tzv. RootSum objekata, koji predstavljaju kompaktni načinzapisa nekih inače vrlo rogobatnih iracionalnih izraza (isto kao što je simbol uveden u matematiku radikompaktnijeg načina zapisivanja suma):1In[36] := Integrate[, x]3 2x 3 x 3 x 312RootSum 33#13#1 #13Log[x #1]3Out[36] = &,& 12#1 #1Ukoliko baš insistiramo, razvijeni oblik ovakvih rješenja možemo dobiti pomoću ranije spominjanefunkcije ToRadicals. Međutim, korisnije je pomoću funkcije N izvršiti numeričku aproksimacijuiracionalnih veličina koje se javljaju u dobijenom izrazu:In[37] := % // ToRadicals1/ 31 Log[ 1 2 x]Out[37] = 1/ 31/ 33 12(1 2 ) (1 2 )2Log 11221i32 / 32 x1i3 1i31 1 2 / 322 / 322Log 1121i32 / 32 x1i3 1i31 1 In[38] := % // NOut[38] = 0.333333 (0.629961 Log [–2.25992 + x] – (0.31498 – 0.545562 ) Log [(–0.370039 – 1.09112 ) + x] –(0.31498 + 0.545562 ) Log [(–0.370039 + 1.09112 ) + x]U dobijenom rezultatu i dalje možemo primijetiti nešto veoma ružno: on je izražen prekokompleksnih brojeva (što je još gore, kompleksni brojevi se javljaju pod znakom logaritma). Ovajrezultat se sigurno može izraziti bez upotrebe kompleksnih brojeva (i to pomoću kombinacije funkcijalogaritam i arkus tangens), s obzirom da je funkcija koja se integrira čisto realna, ali nažalost,Mathematica takvu transformaciju ne zna da izvrši. U ovom primjeru ne pomaže niti Simplify, nitiFullSimplify, niti ikakva <strong>dr</strong>uga specifična transformacija. Mathematica jednostavno ne vidi ništa “tolikoružno” u rezultatku koji koristi kompleksne brojeve, mada njihova upotreba ovdje nije nužna!U mnogim slučajevima, rezultat integracije ne može se izraziti preko elementarnih funkcija.Mathematica će ponekad izraziti rezultat u vidu nekih neelementarnih funkcija koje poznaje (kao, npr.pomoću funkcije erf u primjeru koji slijedi). Ukoliko ni to ne uspije, Mathematica ostavlja problemneizračunat:In[39] := Integrate[Exp[–x 2 ], x]1Out[39] = Erf[x]21In[40] := Integrate[ , x]x Sin[x]1Out[40] = d xx Sin[x]Pored neo<strong>dr</strong>eđenih, Mathematica može računati i o<strong>dr</strong>eđene integrale. Za razliku od neo<strong>dr</strong>eđenogintegrala koji kao rezultat daje funkciju, o<strong>dr</strong>eđeni integral kao rezultat daje broj. Geometrijski, o<strong>dr</strong>eđeniintegral od f(x) u granicama od a do b daje površinu lika omeđenog funkcijom y = f(x) i pravcima y = 0,x = a i x = b. O<strong>dr</strong>eđeni integral također računamo pomoću funkcije Integrate, pri čemu graniceintegracije a i b stavljamo u listu sa nezavisnom promjenljivom. Slijedi primjer koji računa o<strong>dr</strong>eđeniintegral funkcije (x + 1) / (x 2 + 1) u granicama od 1 do 2:2 / 322 / 322– 66 –


Dr. Željko Jurić : Interaktivna računanja u programskom paketu Mathematica /skraćena verzija/Priručnik za laboratorijske vježbe na predmetu “Računarski sistemi”x 1In[41] := Integrate[ , {x, 1, 2}]x2 11 5Out[41] = ArcTan[2] Log42 2In[42] := % // NOut[42] = 0.7798961x Interesantno je da Mathematica može naći numeričku aproksimaciju čak i onih o<strong>dr</strong>eđenih integralakoji se ne mogu tačno izračunati, kao što je vidljivo iz sljedećeg primjera:1In[43] := Integrate[ , {x, 1, 2}]x Sin[x]21Out[43] =d xx Sin[x]In[44] := % // NOut[44] = 0.4140851Ovo je moguće samo ukoliko niti funkcija koja se integrira niti granice integracije ne zavise od nekihparametara različitih od promjenljive po kojoj se integrira. Ukoliko odmah znamo da želimo numeričkuaproksimaciju, umjesto funkcije Integrate možemo koristiti funkciju NIntegrate, uz iste primjedbe kojevrijede i za odnos između funkcija Sum i NSum.Nesvojstveni integrali također nisu problem za paket Mathematica, bez obzira da li se radi ointegralu koji je nesvojstven zbog beskonačne oblasti integracije, ili integralu koji je nesvojstven zbogtoga što podintegralna funkcija odlazi u beskonačnost:In[45] := Integrate[Exp[–x 2 ], {x, 0, }]Out[45] =21In[46] := Integrate[ , {x, 0, 1}]xOut[46] = 2Nesvojstveni integrali mogu biti i divergentni. Mathematica zna prepoznati ovakve situacije iprijaviti upozorenje:In[47] := Integrate[1/x, {x, 0, 1}]Out[47] = 1 1 d x0 xIntegrate :: idiv : Integral of does not converge on {0, 1}Nesvojstveni integrali koji ovise od parametara mogu konvergirati ili divergirati, ovisno odvrijednosti parametara. Za razliku od beskonačnih redova, Mathematica zna utvrditi za koje vrijednostiparametara integral konvergira:In[48] := Integrate[x – n , {x, 0, 1}]1If Re[n] 1,, Integrate[x1n nOut[48] = ,{x,0,1}, Assumptions Re[n] 1]Bez obzira na rogobatnost prikazanog rješenja, na osnovu značenja funkcije If može se prepoznatiosnovna ideja: integral funkcije x –n u granicama od 0 do 1 jednak je 1/(1–n), ali samo pod uvjetom davrijedi Re{n}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!