2-1-Algebarske_manipulacije-S
system:sage


<p><span style="font-size: xx-small;">Verzija 1.0, 2010-09-29, Kre&scaron;imir Kumerički</span></p>

<h2>Algebarske manipulacije</h2>
<p>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. (<span id="cell_outer_6"><span style="font-size: small;"><span style="font-size: medium;">Eksplicitno deklariranje simboličkih varijabli je moguće izbjeći pozivanjem funkcije automatic_names(True), ali to nećemo koristiti.)<br /></span></span></span></p>

{{{id=180|
var('a b c x y z t')
///
}}}

<p>Pomoću ovih varijabli sad izgrađujemo simboličke izraze:</p>

{{{id=182|
(b+a)^3
///
}}}

<p>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 <span style="font-family: courier new,courier;">expand()</span></p>

{{{id=183|
expand((a+b)^3)
///
}}}

<p>Postoji i alternativni način primjene ove funkcije (i većine drugih):</p>

{{{id=189|
((a+b)^3).expand()
///
}}}

<p>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&scaron;ljanja svojstven standardnom proceduralnom ili pak tzv. funkcionalnom programiranju. (O raznim vrstama programiranja bit će vi&scaron;e riječi kasnije.) U drugom pristupu izraz (a+b)^3 treba pak doživljavati kao <em>objekt</em>, u smislu tzv. objektno-orijentiranog (OO) programiranja, a <span style="font-family: courier new,courier;">expand()<strong> </strong></span>je tzv. <em>metoda</em> &scaron;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. <em>polimorfizam</em>). 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&scaron;to smisleno sa zadanim objektom, i to tako da nakon &scaron;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&scaron;eg baratanja izrazima i kasnijeg referiranja na iste.</p>

{{{id=84|
i1 = (b+a)^3
///
}}}

<p><span id="cell_outer_181">Da bi saznali &scaron;to pojedina metoda radi, kliknemo na istu ili je upi&scaron;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&scaron;anje metode. Ukoliko zaboravimo zagrade Sage ne poziva funkciju već samo ispisuje njeno puno ime poput&nbsp; "&lt;<em>metoda expand pridružena objektu `Expression` koji je pohranjen na toj i toj adresi&gt;</em>". <br /></span></p>

{{{id=194|
i1.expand
///
}}}

<p>Tek zagrade daju zahtjev interpreteru da dotičnu metodu i pozove tj. izvr&scaron;i:</p>

{{{id=85|
i1.expand()
///
}}}

<p>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)</p>

{{{id=86|
i2 = (a +2*b + 3*c)^3 * (x+y)^3
i2.expand()
///
}}}

<p>Potenciranjem i razvijanjem gornjeg izraza dobivamo izraz od 550 članova ...</p>

{{{id=87|
i3 = expand(i2^3)
len(i3)
///
}}}

<p>... kojeg Sage s lakoćom faktorizira:</p>

{{{id=88|
factor(i3)
///
}}}

<p>Često je korisno izraz organizirati kao polinom u nekoj varijabli. Za to služi funkcija <span style="font-family: courier new,courier;">collect()</span>:</p>

{{{id=155|
i4=i2.expand().collect(y)
i4
///
}}}

{{{id=199|
len(i4)
///
}}}

<p>Za dobiti koeficijent uz neku potenciju neke varijable koristi se funkcija <span style="font-family: courier new,courier;">coefficient()</span>. Npr, koeficijent uz $a^9$ jest</p>

{{{id=203|
i3.coefficient(a, 9)
///
}}}

<p><span style="font-family: courier new,courier;">collect()</span> ne pojednostavljuje koeficijente.</p>
<p>(*) 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.</p>

{{{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)])
///
}}}

<p>Najsveobuhvatnija funkcija za pojednostavljivanje simboličkih izraza je <span style="font-family: courier new,courier;">simplify_full()</span>:</p>

{{{id=89|
i4 = a/(1-a) + a/(1+a); i4
///
}}}

{{{id=90|
i4.simplify_full()
///
}}}

<p><span style="font-family: courier new,courier;">simplify_full()</span> je kompozicija elementarnijih funkcija za pojednostavljivanje izraza.&nbsp; Jedna od tih elementarnijih funkcija je&nbsp; <span style="font-family: courier new,courier;">simplify_trig()</span> koja pri pojednostavljivanju rabi samo trigonometrijske identitete.</p>

{{{id=217|
(sin(x)^4 + 2*sin(x)^2*cos(x)^2 + cos(x)^4).simplify_trig()
///
}}}

<p>Nažalost, ove funkcije se pona&scaron;aju suvi&scaron;e non&scaron;alantno pri pojednostavljivanju izraza koji uključuju <a href="http://en.wikipedia.org/wiki/Multivalued_function">multifunkcije</a> 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&scaron;tavanje vrijednosti varijabli i druge supstitucije u izrazima</p>

{{{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)
///
}}}

<p><span id="cell_outer_4">&diams; </span><strong>Zadatak 2-1.1</strong>: Uzmite izraz $(a+b)((c+y x) x + t x^2)$ i algebarskim manipulacijama natjerate Sage da ga prikaže u slijedećim oblicima:</p>
<ol>
<li>$(a + b) (t x + x y + c) x$</li>
<li>$a t x^2 + a x^2 y + b t x^2 + b x^2 y + a c x + b c x$</li>
<li>$(t + y) (a + b) x^2 + (a + b) c x$ (ovo preskočiti!)</li>
</ol> 

<p><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-1.2</strong><strong>: </strong>Koristeći algebarske manipulacije pokažite da vrijedi</p>
<p>$$\frac{\sin^3 x + \cos^3 x}{\sin x&nbsp; + \cos x } = 1 - \sin x&nbsp; \cos x $$</p>
<p>Pazite na sintaksu: $\sin^3 x$ se unosi kao sin(x)^3!</p>
<ul>
</ul>