Verzija 1.0, 2010-09-29, Krešimir Kumerički
Moć paketa za simboličku matematiku, poput Sage-a, leži u sposobnosti manipulacije simboličkim izrazima. Kao prvo, potrebno je na slijedeći način deklarirati varijable koje namjeravamo koristiti u simboličkim izrazima. (Eksplicitno deklariranje simboličkih varijabli je moguće izbjeći pozivanjem funkcije automatic_names(True), ali to nećemo koristiti.)
Pomoću ovih varijabli sad izgrađujemo simboličke izraze:
{{{id=182| (b+a)^3 /// }}}Sage ne provodi skoro nikakve operacije na izrazima dok ga eksplicitno ne instruiramo. Recimo da želimo razviti ("ekspandirati") gornji izraz koristeći binomni teorem. Za to služi funkcija expand()
{{{id=183| expand((a+b)^3) /// }}}Postoji i alternativni način primjene ove funkcije (i većine drugih):
{{{id=189| ((a+b)^3).expand() /// }}}Na prvi pogled drugi način je možda zbunjujući pa je važno objasniti čemu služi. U prvom pristupu expand doživljavamo kao funkciju ili operaciju, dok je izraz (a+b)^3 njen argument odnosno operand. To je način razmišljanja svojstven standardnom proceduralnom ili pak tzv. funkcionalnom programiranju. (O raznim vrstama programiranja bit će više riječi kasnije.) U drugom pristupu izraz (a+b)^3 treba pak doživljavati kao objekt, u smislu tzv. objektno-orijentiranog (OO) programiranja, a expand() je tzv. metoda što je naziv za funkciju koja je pridružena tipu objekta na koji djeluje. To onda omogućuje da metode istog imena rade različite stvari s različitim objektima (tzv. polimorfizam). Kako je python OO jezik, takva sintaksa se obilato koristi u Sage-u i brojne funkcije se ni ne mogu koristiti na prvi način. Jedna od prednosti takvog pristupa je da elegantno možemo saznati popis svih funkcija koje rade nešto smisleno sa zadanim objektom, i to tako da nakon što stavimo točkicu "." poslije objekta stisnemo TAB tipku. Dobit ćemo popis svih metoda tog objekta. Ovo međutim ne funkcionira s netom upisanim izrazom u trenutnoj ćeliji, već samo s ranije definiranim izrazima (objektima) kojima smo pridjelili ime. Pridjeljivanje imena objektima se izvodi znakom jednakosti i korisno je ne samo zbog navedenog razloga već i inače radi lakšeg baratanja izrazima i kasnijeg referiranja na iste.
{{{id=84| i1 = (b+a)^3 /// }}}Da bi saznali što pojedina metoda radi, kliknemo na istu ili je upišemo, dodamo upitnik i stisnemo TAB. Pri upotrebi metode ne smije se zaboraviti na zagrade, koje su često prazne, ali nekad sadrže opcionalne argumente kojima modificiramo ponašanje metode. Ukoliko zaboravimo zagrade Sage ne poziva funkciju već samo ispisuje njeno puno ime poput "<metoda expand pridružena objektu `Expression` koji je pohranjen na toj i toj adresi>".
Tek zagrade daju zahtjev interpreteru da dotičnu metodu i pozove tj. izvrši:
{{{id=85| i1.expand() /// }}}Naravno ovakve jednostavne izraze možemo razviti i na ruke, dok računalo blista kad radi s velikim izrazima (sve dok stanu u memoriju računala)
{{{id=86| i2 = (a +2*b + 3*c)^3 * (x+y)^3 i2.expand() /// }}}Potenciranjem i razvijanjem gornjeg izraza dobivamo izraz od 550 članova ...
{{{id=87| i3 = expand(i2^3) len(i3) /// }}}... kojeg Sage s lakoćom faktorizira:
{{{id=88| factor(i3) /// }}}Često je korisno izraz organizirati kao polinom u nekoj varijabli. Za to služi funkcija collect():
{{{id=155| i4=i2.expand().collect(y) i4 /// }}} {{{id=199| len(i4) /// }}}Za dobiti koeficijent uz neku potenciju neke varijable koristi se funkcija coefficient(). Npr, koeficijent uz $a^9$ jest
{{{id=203| i3.coefficient(a, 9) /// }}}collect() ne pojednostavljuje koeficijente.
(*) To se može postići na jedan od dva slijedeća zaobilazna načina koja međutim uključuju naprednije koncepte pa ih privremeno zanemarite.
{{{id=200| sum(i4.coefficient(y, a).factor()*y^a for a in (0..3)) /// }}} {{{id=206| sum([it.factor()*y^eksp for it,eksp in i4.coefficients(y)]) /// }}}Najsveobuhvatnija funkcija za pojednostavljivanje simboličkih izraza je simplify_full():
{{{id=89| i4 = a/(1-a) + a/(1+a); i4 /// }}} {{{id=90| i4.simplify_full() /// }}}simplify_full() je kompozicija elementarnijih funkcija za pojednostavljivanje izraza. Jedna od tih elementarnijih funkcija je simplify_trig() koja pri pojednostavljivanju rabi samo trigonometrijske identitete.
{{{id=217| (sin(x)^4 + 2*sin(x)^2*cos(x)^2 + cos(x)^4).simplify_trig() /// }}}Nažalost, ove funkcije se ponašaju suviše nonšalantno pri pojednostavljivanju izraza koji uključuju multifunkcije pa izrazi prije i poslije pojednostavljenja nisu doslovno ekvivalentni, kao na slijedećem primjeru, u kojem upoznajemo i važnu metodu subs() koja služi za uvrštavanje vrijednosti varijabli i druge supstitucije u izrazima
{{{id=211| i5 = log(a) + log(b); print i5 i5.subs(a=-1,b=-1) /// }}} {{{id=212| print i5.simplify_full() i5.simplify_full().subs(a=-1,b=-1) /// }}}♦ Zadatak 2-1.1: Uzmite izraz $(a+b)((c+y x) x + t x^2)$ i algebarskim manipulacijama natjerate Sage da ga prikaže u slijedećim oblicima:
♦ Zadatak 2-1.2: Koristeći algebarske manipulacije pokažite da vrijedi
$$\frac{\sin^3 x + \cos^3 x}{\sin x + \cos x } = 1 - \sin x \cos x $$
Pazite na sintaksu: $\sin^3 x$ se unosi kao sin(x)^3!