2-2-JednadzbeS
system:sage


{{{id=240|
var('x y a b c')
///
}}}

<h2>Jednadžbe</h2>

<p>U Sageu kao znak jednakosti u jednadžbama stoji "==",  &nbsp;jer je uobičajeni znak "=" , kako smo gore već vidjeli, rezerviran za pridjeljivanje vrijednosti simbolima odnosno pridjeljivanje imena izrazima. Rje&scaron;avanje jednadžbi se izvodi &nbsp;funkcijom <span style="font-family: &quot;courier new&quot;, &quot;courier&quot;;">solve()</span>:</p>

{{{id=3|
sol = solve(2*x^2 - 1 == 0, x); sol
///
}}}

<p>Valja primijetiti slijedeće:<br />1. Prilikom poziva funkcije <span style="font-family: &quot;courier new&quot;, &quot;courier&quot;;">solve()</span> treba eksplicitno naznačiti po kojoj varijabli se traži rje&scaron;avanje.<br />2. Pronađena su oba rje&scaron;enja kvadratne jednadžbe.<br />3. Rezultat je ispisan u obliku liste <span style="font-family: &quot;courier new&quot;, &quot;courier&quot;;"><strong>[...]</strong></span> jednadžbi. To omogućuje uvr&scaron;tavanje rje&scaron;enja u neki drugi izraz, ili u samu originalnu jednadžbu radi provjere. (Zato smo gore toj listi rje&scaron;enja odmah pridjelili ime <span style="font-family: &quot;courier new&quot;, &quot;courier&quot;;">sol</span>).</p>
<p>Pristup pojedinim elementima liste ostvaruje se sintaksom &nbsp;<span style="font-family: &quot;courier new&quot;, &quot;courier&quot;;">lista[n]<strong>&nbsp;</strong></span><span style="font-family: verdana,geneva;">gdje&nbsp; je n indeks elementa i brojanje počinje s nulom tako da prvi element ima indeks 0. (O listama će biti vi&scaron;e riječi u slijedećem poglavlju.). Uvr&scaron;tavanje tj. supstitucija u izrazu izvodi se metodom subs(), čiji argument može biti i jednadžba:</span></p>

{{{id=228|
(x+y).subs(sol[0])
///
}}}

{{{id=231|
(2*x^2 - 1 == 0).subs(sol[1])
///
}}}

<p>Transformacija izraza pomoću supstitucije je vrlo korisna operacija o kojoj će vi&scaron;e riječi biti kasnije. Zasad&nbsp;pokažimo samo njenu najče&scaron;ću upotrebu: pridjeljivanje vrijednosti simbolima u nekom izrazu:</p>

{{{id=232|
( (a+b-c)^4 ).expand()
///
}}}

{{{id=234|
_.subs(b==c)
///
}}}

{{{id=235|
_.subs(a==2)
///
}}}

<p>Funkcija solve() može rje&scaron;avati i sustave jednadžbi, ako se kao argumenti zadaju liste jednadžbi odnosno liste varijabli:</p>

{{{id=4|
sol2 = solve([x^2 + y^2 == 1,  x - 2*y == 0], [x, y]); sol2
///
}}}

<p>Da bi dobili numeričke vrijednosti ovih rje&scaron;enja ne možemo (kao u npr. Mathematici) jednostavno primijeniti funkciju n() na ovu listu rje&scaron;enja, jer n() nije metoda liste (a ni jednadžbe), već samo primitivnijih objekata, pa je potrebno indeksiranjem ekstrahirati izraze s desne strane gornjih jednadžbi npr.</p>

{{{id=416|
(x.subs(sol2[0][0]).n(), y.subs(sol2[0][1]).n())
///
}}}

<p>(* do Zadatka) Koristeći ne&scaron;to naprednije tehnike možemo ovo izvesti elegantnije tako da iteriramo preko liste rje&scaron;enja i to tako da se <strong><span style="font-family: courier new,courier;">n()</span></strong> primjenjuje samo na desne strane gornjih jednadžbi. To je lak&scaron;e izvesti tako da zatražimo od <strong><span style="font-family: courier new,courier;">solve()</span></strong> rje&scaron;enje, ne u obliku liste jednadžbi, već u obliku liste <em>riječnika</em>. Vidi python tutorial: <a href="http://docs.python.org/tutorial/datastructures.html#dictionaries">dictionary</a></p>

{{{id=410|
soln = solve([x^2 + y^2 == 1,  x - 2*y == 0], x, y, solution_dict=True); soln
///
}}}

<p>Sad primjenjujemo moćni postupak obuhvaćanja liste (<a href="http://en.wikipedia.org/wiki/List_comprehension">list comprehension</a>) koji omogućuje kreiranje nove liste na osnovi stare u jednom koraku (vidi kasnije poglavlje o programiranju):</p>

{{{id=412|
[s[y] for s in soln]
///
}}}

<p>odnosno</p>

{{{id=420|
[s[y].n() for s in soln]
///
}}}

<p>Konačno, za ljep&scaron;i ispis možemo koristiti Pythonovo formatiranje stringova (slično kao u C-u)</p>

{{{id=411|
["x = %f  y = %f" % (s[x].n(), s[y].n()) for s in soln]
///
}}}

<p><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-2.1</strong>: Rije&scaron;ite sustav jednadžbi</p>
<p>$$ x^4 + a^4 =1 \;, \quad&nbsp; x^2 + a^2 = 1 \;, $$</p>
<p>Koliko ima rje&scaron;enja?</p>



<p><span style="font-size: small;"><span style="font-size: medium;">Ukoliko sustav jednadžbi ima beskonačno rje&scaron;enja, dobit ćemo rje&scaron;enje koje uključuje slobodni parametar ili vi&scaron;e njih:</span><br /></span></p>

{{{id=257|
solve([x+y == 3, 2*x+2*y == 6],x,y)
///
}}}

{{{id=258|
solve([cos(x)*sin(x) == 1/2, x+y == 0],x,y)
///
}}}

<p>Gore je r&lt;broj&gt; neki realni, a z&lt;broj&gt; neki cijeli broj. Ovo radi samo sa sustavom jednadžbi, a ne i s jednom jednadžbom ...</p>

{{{id=264|
solve(sin(x)==0, x)
///
}}}

<p>... pa ukoliko želimo i ovo rje&scaron;enje zapisano kao skup rje&scaron;enja možemo iskoristiti trik da kreiramo sustav u kojem je druga jednadžba razvezana:</p>

{{{id=259|
sol3=solve([sin(x)==0,y==0], x,y); sol3
///
}}}

{{{id=268|
[a for a,b in sol3]   # (*)
///
}}}

{{{id=266|
show(_)
///
}}}

<p><span style="font-family: courier new,courier;">solve()</span> daje simbolička (analitička) rje&scaron;enja jednadžbi. Međutim, neka rje&scaron;enja npr. jednadžbi vi&scaron;ih stupnjeva nije moguće analitički zapisati. Npr, za slijedeću jednadžbu <span style="font-family: courier new,courier;">solve()</span> nam daje samo jedno trivijalno realno rje&scaron;enje:</p>

{{{id=305|
eq = 9*x^6 + 4*x^4 + 3*x^3 + x - 17 == 0
solve(eq, x)
///
}}}

<p>No znamo da ta jednadžba, &scaron;estog stupnja, mora imati &scaron;est kompleksnih rje&scaron;enja. Ostalih pet se ne da zapisati drugačije nego kao numeričke&nbsp; (floating point) brojeve. Da bismo dobili ta rje&scaron;enja koristimo metodu <span style="font-family: courier new,courier;">roots()</span><strong><span style="font-family: courier new,courier;">, </span></strong>gdje opcijom <span style="font-family: courier new,courier;">ring=CC</span> tražimo rje&scaron;enja u prstenu kompleksnih brojeva:</p>

{{{id=304|
eq.roots(x, multiplicities=False, ring=CC)
///
}}}

{{{id=307|
len(_)
///
}}}

<p>Daljnji je problem da je i <span style="font-family: courier new,courier;">roots()</span> zapravo analitički rje&scaron;avač jednadžbi (koristi egzaktne, a ne numeričke metode), a neke jednadžbe se ne mogu analitički egzaktno rije&scaron;iti, poput onih koje uključuju transcendentalne funkcije.&nbsp;</p>

{{{id=310|
eq2 = 2 * arctan(x) == x^2
eq2.roots(ring=CC)
///
}}}

<p>U tom slučaju moramo pribjeći pravom numeričkom rje&scaron;avanju tako da definiramo&nbsp; funkciju čije nul-točke su ekvivalentne rje&scaron;enjima jednadžbe i onda ih tražimo pomoću funkcije <span style="font-family: courier new,courier;">find_root()</span>. Problem s <span style="font-family: courier new,courier;">find_root()</span> je da mu se treba dati interval u kojem traži nul-točku i da će pronaći samo jednu. Nakon toga moguće treba tražiti dalje u drugačijem intervalu koji ne uključuje pronađenu nul-točku itd.</p>

{{{id=286|
f(x) = 2 * arctan(x) - x^2  # ekvivalentno eq2
find_root(f(x), 0, 10)
///
}}}

{{{id=291|
find_root(f(x), 0.1, 10)
///
}}}

{{{id=292|
find_root(f(x),1.4, 10)
///
}}}

{{{id=294|
find_root(f(x), -1., 1)
///
}}}

<p>Ovo zadnje rje&scaron;enje je zapravo 0 jer funkcija <span style="font-family: courier new,courier;">f</span><span style="font-family: courier new,courier;">ind_root()</span>&nbsp; radi numeriku s konačnom precizno&scaron;ću, koja po defaultu otprilike odgovara preciznosti <em>double precision</em> floating point varijabli u Fortranu ili C-u, &scaron;to može promijeniti pomoću opcionalnog argumenta xtol:</p>

{{{id=295|
find_root(f(x), -1., 1, xtol=1e-30)
///
}}}

<p>Vidimo da se s povećanjem radne preciznosti rje&scaron;enje jo&scaron; vi&scaron;e približilo nuli. Možemo se uvjeriti da su ova gore dva rje&scaron;enja zaista jedina, tako da skiciramo graf funkcije f(x) i vidimo da siječe apscisu na samo dva mjesta. Koristimo funkciju <span style="font-family: courier new,courier;">plot()</span> o kojoj će kasnije biti vi&scaron;e riječi.</p>

{{{id=312|
plot(f(x), (x, -3, 3), ymin=-4)
///
}}}

<p><span id="cell_outer_10"><span id="cell_outer_5">&diams; <strong>&nbsp;</strong></span></span><strong>Zadatak 2-2.2</strong>: Rije&scaron;ite jednadžbu</p>
<p>$$ \tan x - \frac{x}{10} ==0 \;.&nbsp; $$</p>
<p><span id="cell_outer_10"> </span></p>
<p>&nbsp;</p>
<p><span id="cell_outer_10"><span id="cell_outer_5">&diams; <strong>Zadatak 2-2.3</strong>:&nbsp; (*) Pronađite numeričku vrijednost nekog kompleksnog rje&scaron;enja jednadžbe $\sin x = 2$ i provjerite uvr&scaron;tavanjem.</span></span><span id="cell_outer_10">&nbsp;</span></p>
<p><span id="cell_outer_427"><span id="cell_outer_10"><span id="cell_outer_5">&diams; <strong>Zadatak 2-2.4 </strong></span></span></span>Rije&scaron;ite nejednadžbu $ x^2 +x - 12 &lt; 0$.</p>
<p><span id="cell_outer_430"><span id="cell_outer_429"><span id="cell_outer_427"><span id="cell_outer_10"><span id="cell_outer_5">&diams; <strong>Zadatak 2-2.5 </strong></span></span></span></span>Pronađite pozicije lokalnog minimuma te lokalnog maksimuma gama funkcije $<span><span><span>\Gamma</span>(<span>x</span>)$</span></span> koji su najbliži točki <span><span><span>x</span><span style="position: relative; margin-left: 0.277em;">=</span><span style="position: relative; margin-left: 0.277em;">0</span></span></span>.</span></p>
<p><span id="cell_outer_429"><span id="cell_outer_427"><span id="cell_outer_10"><span id="cell_outer_5">&diams; <strong>Zadatak 2-2.6&nbsp; (*) </strong></span></span></span></span>Pronađite pozicije minimuma i maksimuma Besselove funkcije $J_{1}(x)$ koji su najbliži točki $x=0$.</p>

{{{id=421|

///
}}}