\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage[left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry}
\usepackage[croatian]{babel}
\usepackage{graphicx}
\usepackage{eurofont}
\usepackage{fancybox}
\usepackage{setspace}
\setstretch{1.2}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{center}
\shadowbox{Pribli\v{z}no tra\v{z}enje nulto\v{c}ki}\\[3pt]
-- kratke informacije --
\end{center}
Op\'cenito je nemogu\'ce prona\'ci egzaktno nulto\v{c}ke neke neprekidne funkcije.
Stoga se u praksi koriste razne iterativne metode koje numeri\v{c}ki pronalaze nulto\v{c}ke,
tj. pronalaze nulto\v{c}ke s to\v{c}no\v{s}\'cu na odre\dj eni broj decimala.
Postoji mnogo metoda koje numeri\v{c}ki pronalaze nulto\v{c}ke nelinearnih funkcija na zadanu
to\v{c}nost. Te metode se razlikuju po brzini pronala\v{z}enja nulto\v{c}ke, ali isto tako
i po garanciji da li \'ce uspjeti prona\'ci nulto\v{c}ku. Uobi\v{c}ajeni slu\v{c}aj je da br\v{z}e
metode nemaju sigurnu garanciju da \'ce uspjeti prona\'ci nulto\v{c}ku, dok sporije metode
imaju tu garanciju da \'ce sigurno prona\'ci nulto\v{c}ku.\\[10pt]
Ovdje ne\'cemo ulaziti u strogu matemati\v{c}ku teoriju svih tih metoda, nego je ideja da samo
ukratko objasnimo naredbu \texttt{find\_root} u \texttt{maximi} pomo\'cu koje u velikoj ve\'cini 
slu\v{c}ajeva mo\v{z}emo pribli\v{z}no prona\'ci nulto\v{c}ku funkcije unutar nekog segmenta.
Ova metoda zahtijeva da se zada segment $[a,b]$ za kojeg smo sigurni da unutar njega neprekidna funkcija 
ima bar jednu nulto\v{c}ku. Tu sigurnost osiguravamo zahtjevom $f(a)\cdot f(b)<0$, tj. segment mora biti
zadan tako da u njegovim rubnim to\v{c}kama funkcija poprima vrijednosti razli\v{c}ite po predznaku.\\[10pt]
Na primjer, na donjoj slici vidimo da funkcija $f(x)=x\sin{x}+1$ ima tri nulto\v{c}ke na segmentu $[0,10]$.\par
\begin{figure}[!h]
\centering
\includegraphics{xsinx.png}
\vspace*{-5pt}
\caption{Funkcija $f(x)=x\sin{x}+1$}  
\end{figure}
\noindent Stoga, ako u \texttt{maximi} napi\v{s}emo\\
\verb|                   find_root(x*sin(x)+1,x,0,10);|\\
\texttt{maxima} \'ce izbaciti rezultat\\ 
\verb|                   3.436828912326677|.\\
\texttt{Maxima} je dala samo jednu od nulto\v{c}ki na segmentu $[0,10]$. \v{Z}elimo li dobiti odre\dj enu
nulto\v{c}ku, treba navesti neki segment oko te nulto\v{c}ke koji sadr\v{z}i samo tu nulto\v{c}ku. Na primjer,
sa slike uo\v{c}avamo da funkcija $f$ ima jednu nulto\v{c}ku na segmentu $[9,10]$. \v{Z}elimo li dobiti tu 
nulto\v{c}ku, trebamo napisati\\
\verb|                   find_root(x*sin(x)+1,x,9,10);|\\
U tom slu\v{c}aju \texttt{maxima} daje rezultat\\
\verb|                   9.529904336449029|.\\
Isto tako, \v{z}elimo li dobiti pribli\v{z}nu nulto\v{c}ku koja je blizu broja $6$, napi\v{s}emo\\
\verb|                   find_root(x*sin(x)+1,x,6,7);|\\
pa dobivamo rezultat\\
\verb|                   6.119024225042324|.\\
Naravno, mogli smo napisati i neki drugi segment oko te nulto\v{c}ke, npr.\\
\verb|                   find_root(x*sin(x)+1,x,5.5,6.5);|\\
i ponovo bismo dobili\\
\verb|                   6.119024225042324|.\\
Ukoliko \v{z}elimo raditi u ve\'coj preciznosti, mo\v{z}emo koristiti naredbu \texttt{bf\_find\_root} i varijablu
\texttt{fpprec} za broj decimala. Na primjer, ako \v{z}elimo prona\'ci nulto\v{c}ku funkcije $f$ na segmentu $[6,7]$
s precizno\v{s}\'cu na $50$ znamenki, tada napi\v{s}emo\\
\verb|                   bf_find_root(x*sin(x)+1,x,6,7), fpprec:50;|\\
pa \texttt{maxima} vra\'ca vrijednost\\
\verb|                   6.1190242250423236286846582759149564174857737088648b0|\\
Pritom \texttt{b0} ozna\v{c}ava $10^{0}$. Na primjer, \texttt{2.3b-14} ozna\v{c}ava broj $2.3\cdot10^{-14}$.\\[10pt]
Na segmentu $[3,7]$ funkcija $f$ ima dvije nulto\v{c}ke. Me\dj utim, u ovom slu\v{c}aju nije dobro re\'ci
naredbi \texttt{find\_root} da tra\v{z}i nulto\v{c}ku na segmentu $[3,7]$. Za\v{s}to? Naime, $f(3)$ i $f(7)$
su istog predznaka pa nije zadovoljen uvjet $f(3)\cdot f(7)<0$ koji nam osigurava sigurno postojanje nulto\v{c}ke
na segmentu.\\
Dakle, ako u \texttt{maximi} napi\v{s}emo\\
\verb|                   find_root(x*sin(x)+1,x,3,7);|\\
\texttt{maxima} javlja poruku
\begin{verbatim}
find_root: function has same sign at endpoints: mequal(f(3.0),1.423360024179602), 
mequal(f(7.0),5.598906191031523)
 -- an error. To debug this try: debugmode(true);
\end{verbatim}
da funkcija $f$ u rubovima intervala ima vrijednosti s istim predznacima.\\[10pt]
Mo\v{z}emo najprije u \texttt{maximi} def\mbox{}inirati funkciju $f$ pa tek onda koristiti naredbu 
\texttt{find\_root}.
Drugim rije\v{c}ima, umjesto da npr. napi\v{s}emo\\
\verb|                   find_root(x*sin(x)+1,x,9,10);|\\
mo\v{z}emo napisati
\begin{verbatim}
                   f(x):=x*sin(x)+1;
                   find_root(f,9,10); 
\end{verbatim}
\v{s}to je korisno ukoliko funkciju $f$ puno puta koristimo.\\[10pt]
Pomo\'cu naredbe \texttt{find\_root} mo\v{z}emo pribli\v{z}no prona\'ci to\v{c}ke presjeka 
grafova dviju funkcija $f$ i $g$ tako da na\dj emo pribli\v{z}na rje\v{s}enja jednad\v{z}be $f(x)=g(x)$. 
Pogledajmo primjer funkcija $f(x)=x\sin{x}+1$ i $g(x)=\cos{x}$.
Ukoliko promatramo te funkcije na segmentu $[0,10]$, na donjoj slici vidimo da se njihovi grafovi sijeku
u \v{c}etiri to\v{c}ke. Jedna od tih to\v{c}aka je $(0,1)$ koja se lako o\v{c}ita sa slike jer je o\v{c}ito $x=0$ jedno
rje\v{s}enje jednad\v{z}be $x\sin{x}+1=\cos{x}$. Ostala rje\v{s}enja te jednad\v{z}be na segmentu $[0,10]$
nije mogu\'ce egzaktno odrediti, ali se mogu odrediti pribli\v{z}no pomo\'cu naredbe \texttt{find\_root}.
\begin{figure}[!h]
\centering
\includegraphics{presjek.png} 
\vspace*{-5pt}
\caption{Funkcije $f(x)=x\sin{x}+1$ i $g(x)=\cos{x}$} 
\end{figure}
Gledaju\'ci sliku, vidimo da je jedan od presjeka na segmentu $[3,4]$. Taj presjek pribli\v{z}no mo\v{z}emo
prona\'ci na sljede\'ci na\v{c}in:
\begin{verbatim}
                   f(x):=x*sin(x)+1;
                   g(x):=cos(x);
                   find_root(f(x)=g(x),x,3,4); 
\end{verbatim}
Na taj na\v{c}in dobivamo pribli\v{z}nu $x$-koordinatu presjeka. \v{Z}elimo li i $y$-koordinatu, tada najprije
pribli\v{z}nu $x$-koordinatu spremimo u varijablu i izra\v{c}unamo vrijednost funkcije $f$ ili $g$ u toj
spremljenoj vrijednosti. Na taj na\v{c}in dobivamo pribli\v{z}nu $y$-koordinatu presje\v{c}ne to\v{c}ke.
\begin{verbatim}
                   x1:find_root(f(x)=g(x),x,3,4);
                   y1:f(x1); 
\end{verbatim}
Na taj na\v{c}in dobivamo da se grafovi funkcija $f$ i $g$ na segmentu $[3,4]$ sijeku u to\v{c}ki s koordinatama
$(3.673194406304252,\,-0.86199622464574)$.  Na analogni na\v{c}in mo\v{z}emo odrediti sve preostale presjeke
grafova funkcija $f$ i $g$ na segmentu $[0,10]$.\\[10pt]
Objasnimo jo\v{s} ukratko u kojem slu\v{c}aju naredba \texttt{find\_root} ne\'ce uspjeti prona\'ci nulto\v{c}ku,
iako nulto\v{c}ka mo\v{z}da postoji. Intuitivno re\v{c}eno, to \'ce se dogoditi kada graf funkcije ``dira''
$x$-os na na\v{c}in kako je to prikazano na slici 3.\hspace*{-1pt} na kojoj je prikazan graf funkcije $f(x)=(x+1)\sin{(x+1)}$. Sve nulto\v{c}ke
ove funkcije mo\v{z}emo \v{c}ak i egzaktno odrediti rje\v{s}avanjem jednad\v{z}be $(x+1)\sin{(x+1)}=0$. Isto tako bismo mogli nulto\v{c}ke
te funkcije odrediti pribli\v{z}no pomo\'cu naredbe \texttt{find\_root}, osim nulto\v{c}ke $x_0=-1$. U toj to\v{c}ki graf funkcije dira $x$-os.
Jo\v{s} nije toliki problem u tom ``diranju'', ve\'c je problem \v{s}to ne postoji segment na kojemu bi $-1$ bila jedina nulto\v{c}ka funkcije $f$ tako
da funkcija $f$ u rubnim to\v{c}kama tog segmenta poprima vrijednosti razli\v{c}ite po predznaku. Svaki segment $[a,b]$ na kojemu je $-1$ jedina nulto\v{c}ka
ne zadovoljava uvjet $f(a)\cdot f(b)<0$. Ukoliko pak neki segment $[a,b]$ koji sadr\v{z}i nulto\v{c}ku $-1$ zadovoljava uvjet $f(a)\cdot f(b)<0$, tada $-1$ nije jedina
nulto\v{c}ka na tom segmentu pa ukoliko i primijenimo naredbu \texttt{find\_root} za taj segment, ona ne\'ce vratiti pribli\v{z}no rje\v{s}enje za nulto\v{c}ku
$-1$, ve\'c \'ce vratiti neku drugu nulto\v{c}ku na tom segmentu.\par
\begin{figure}[!h]
\centering
\includegraphics{dvostruka_nul.png}
\vspace*{-5pt}
\caption{Funkcija $f(x)=(x+1)\sin{(x+1)}$}  
\end{figure}
\noindent U ovom slu\v{c}aju, ako ipak \v{z}elimo prona\'ci nulto\v{c}ku $-1$, mo\v{z}emo u \texttt{maximi} koristiti naredbu \texttt{newton} koja ne
zahtijeva da se na po\v{c}etku navede segment, nego samo po\v{c}etna to\v{c}ka koja je dovoljno blizu nulto\v{c}ke koju \v{z}elimo prona\'ci. 
Dakle, ako napi\v{s}emo
\begin{verbatim}
                   f(x):=(x+1)*sin(x+1);
                   newton(f(x),x,0,10^(-15)); 
\end{verbatim}
tada tra\v{z}imo nulto\v{c}ku funkcije $f$ po\v{c}ev\v{s}i od to\v{c}ke $0$ i tra\v{z}imo tako dugo dok vrijednost funkcije nije manja od $10^{-15}$.
\texttt{Maxima} u ovom slu\v{c}aju vra\'ca vrijednost\\
\verb|                   -0.99999997749231|\\
kao aproksimaciju nulto\v{c}ke $-1$. Pogledajte u \texttt{wxmaxima} datoteci jo\v{s} neke komentare za ovaj primjer.
\end{document}
