4.1. Simbolički izrazi

Moć paketa za simboličku matematiku, poput Sagea, 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 [1]

sage: var('a b c x y z t')
(a, b, c, x, y, z, t)

Pomoću ovih varijabli sad izgrađujemo simboličke izraze:

sage: i1 = (b+a)^3; i1
(a + b)^3

Sage ne provodi skoro nikakve operacije na izrazima dok to eksplicitno ne zatražimo. Recimo da želimo razviti gornji izraz koristeći binomni teorem. Za to služi funkcija expand()

sage: expand(i1)
a^3 + 3*a^2*b + 3*a*b^2 + b^3

Funkcija expand(), kao i mnoge druge, se može alternativno upotrijebiti i kao metoda simboličkog izraza.

sage: i1.expand()
a^3 + 3*a^2*b + 3*a*b^2 + b^3

U prvom pristupu expand doživljavamo kao funkciju ili operaciju, dok je izraz i1 njen argument odnosno operand. To je način razmišljanja svojstven standardnom proceduralnom ili pak tzv. funkcionalnom programiranju.

U drugom pristupu izraz i1 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 [2].

Da bi saznali što pojedina metoda radi, upišemo je nakon odgovarajućeg objekta i operatora točkice ., 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>".

sage: i1.expand
<built-in method expand of sage.symbolic.expression.Expression object
                                                             at 0x4e88200>

Tek zagrade daju zahtjev interpreteru da dotičnu metodu i pozove tj. izvrši.

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)

sage: i2 = (a +2*b + 3*c)^3 * (x+y)^3
sage: i2.expand()
a^3*x^3 + 6*a^2*b*x^3 + 12*a*b^2*x^3 + 8*b^3*x^3 + 9*a^2*c*x^3 +
36*a*b*c*x^3 + 36*b^2*c*x^3 + 27*a*c^2*x^3 + 54*b*c^2*x^3 + 27*c^3*x^3 +
3*a^3*x^2*y + 18*a^2*b*x^2*y + 36*a*b^2*x^2*y + 24*b^3*x^2*y +
27*a^2*c*x^2*y + 108*a*b*c*x^2*y + 108*b^2*c*x^2*y + 81*a*c^2*x^2*y +
162*b*c^2*x^2*y + 81*c^3*x^2*y + 3*a^3*x*y^2 + 18*a^2*b*x*y^2 +
36*a*b^2*x*y^2 + 24*b^3*x*y^2 + 27*a^2*c*x*y^2 + 108*a*b*c*x*y^2 +
108*b^2*c*x*y^2 + 81*a*c^2*x*y^2 + 162*b*c^2*x*y^2 + 81*c^3*x*y^2 +
a^3*y^3 + 6*a^2*b*y^3 + 12*a*b^2*y^3 + 8*b^3*y^3 + 9*a^2*c*y^3 +
36*a*b*c*y^3 + 36*b^2*c*y^3 + 27*a*c^2*y^3 + 54*b*c^2*y^3 + 27*c^3*y^3

Potenciranjem i razvijanjem gornjeg izraza dobivamo izraz od 550 članova ...

sage: i3 = expand(i2^3)
sage: len(i3)
550

... kojeg Sage s lakoćom faktorizira:

sage: factor(i3)
(a + 2*b + 3*c)^9*(x + y)^9

Često je korisno izraz organizirati kao polinom u nekoj varijabli. Za to služi funkcija collect():

sage: i4=i2.expand().collect(y)
sage: i4
a^3*x^3 + 6*a^2*b*x^3 + 12*a*b^2*x^3 + 8*b^3*x^3 + 9*a^2*c*x^3 +
36*a*b*c*x^3 + 36*b^2*c*x^3 + 27*a*c^2*x^3 + 54*b*c^2*x^3 + 27*c^3*x^3 +
(a^3 + 6*a^2*b + 12*a*b^2 + 8*b^3 + 9*a^2*c + 36*a*b*c + 36*b^2*c +
27*a*c^2 + 54*b*c^2 + 27*c^3)*y^3 + 3*(a^3*x + 6*a^2*b*x + 12*a*b^2*x +
8*b^3*x + 9*a^2*c*x + 36*a*b*c*x + 36*b^2*c*x + 27*a*c^2*x + 54*b*c^2*x
+ 27*c^3*x)*y^2 + 3*(a^3*x^2 + 6*a^2*b*x^2 + 12*a*b^2*x^2 + 8*b^3*x^2 +
9*a^2*c*x^2 + 36*a*b*c*x^2 + 36*b^2*c*x^2 + 27*a*c^2*x^2 + 54*b*c^2*x^2
+ 27*c^3*x^2)*y
sage: len(i4)
13

(Uočite da collect() ne pojednostavljuje koeficijente [3].) Za dobiti koeficijent uz neku potenciju neke varijable koristi se funkcija coefficient(). Npr, koeficijent uz \(a^9\) jest

sage: i3.coefficient(a, 9)
x^9 + 9*x^8*y + 36*x^7*y^2 + 84*x^6*y^3 + 126*x^5*y^4 + 126*x^4*y^5 +
84*x^3*y^6 + 36*x^2*y^7 + 9*x*y^8 + y^9

Najsveobuhvatnija funkcija za pojednostavljivanje simboličkih izraza je simplify_full():

sage: i5 = a/(1-a) + a/(1+a); i5
a/(a + 1) - a/(a - 1)
sage: i5.simplify_full()
-2*a/(a^2 - 1)

Funkcija simplify_full() je kompozicija elementarnijih funkcija za pojednostavljivanje izraza. Jedna od tih elementarnijih funkcija je simplify_trig() koja pri pojednostavljivanju rabi samo trigonometrijske identitete.

sage: (sin(x)^4 + 2*sin(x)^2*cos(x)^2 + cos(x)^4).simplify_trig()
1

Uočite da Sage neće naivno “pojednostaviti” izraze koji uključuju multifunkcije , 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

sage: i6 = log(a) + log(b)
sage: i6.simplify_full()
log(a) + log(b)
sage: i6.subs(a=-1,b=-1)
2*I*pi
sage: i7 = log(a*b)
sage: i7.subs(a=-1,b=-1)
0
.. end of output

Zadatak 1

Uzmite izraz \((a+b)((c+y x) x + t x^2)\) i algebarskim manipulacijama natjerajte Sage da ga prikaže u slijedećim ekvivalentnim oblicima (gdje redosljed faktora odnosno članova nije bitan):

  1. \((a + b) (t x + x y + c) x\)
  2. \(a t x^2 + a x^2 y + b t x^2 + b x^2 y + a c x + b c x\)

Zadatak 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!

Bilješke

[1]Eksplicitno deklariranje simboličkih varijabli je moguće izbjeći pozivanjem funkcije automatic_names(True), ali to nećemo koristiti.
[2]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.
[3]To se može postići na jedan od dva slijedeća zaobilazna načina
sage: sum(i4.coefficient(y, a).factor()*y^a for a in range(4))
(a + 2*b + 3*c)^3*x^3 + 3*(a + 2*b + 3*c)^3*x^2*y +
           3*(a + 2*b + 3*c)^3*x*y^2 + (a + 2*b + 3*c)^3*y^3
sage: sum([it.factor()*y^eksp for it,eksp in i4.coefficients(y)])
(a + 2*b + 3*c)^3*x^3 + 3*(a + 2*b + 3*c)^3*x^2*y +
           3*(a + 2*b + 3*c)^3*x*y^2 + (a + 2*b + 3*c)^3*y^3

Prijašnja tema

4. Matematika

Slijedeća tema

4.2. Jednadžbe