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 –