1 Numeričko traženje nultočki funkcije

(%i1) f(x):=x*sin(x)+1;
(%o1)	f(x):=1+x*sin(x)
(%i2) wxplot2d([x*sin(x)+1], [x,0,10], grid2d, [xtics,0,1,10], [ytics,-6,1,10], [yx_ratio,-1], [axes,solid],
             [legend,false], [style,[lines,2]]), wxplot_size=[500,600];
(%t2)
 (Graphics)
(%o2)

neka nultočka na segmentu [0,10]

(%i3) find_root(f,0,10);
(%o3)	3.436828912326676
(%i4) find_root(x*sin(x)+1,x,0,10);
(%o4)	3.436828912326676

ako želimo nultočku na segmentu [9,10]

(%i5) find_root(f,9,10);
(%o5)	9.529904336449029
(%i6) find_root(x*sin(x)+1,x,9,10);
(%o6)	9.529904336449029

ako želimo nultočku na segmentu [6,7]

(%i7) find_root(f,6,7);
(%o7)	6.119024225042324
(%i8) find_root(x*sin(x)+1,x,6,7);
(%o8)	6.119024225042324

možemo staviti npr. segment [5.5,6.5] za nultočku između brojeva 6 i 7

(%i9) find_root(f,5.5,6.5);
(%o9)	6.119024225042324
(%i10) find_root(x*sin(x)+1,x,5.5,6.5);
(%o10)	6.119024225042324

segment [3,7] nije dobar u ovom slučaju jer ne vrijedi uvjet f(3)*f(7)<0

(%i11) find_root(x*sin(x)+1,x,3,7);
find_root: function has same sign at endpoints: f(3.0)=1.423360024179601, f(7.0)=5.598906191031523 -- an error. To debug this try: debugmode(true);<BR>

Želimo li veću preciznost, koristimo naredbu bf_find_root i varijablu fpprec za broj znamenki

(%i12) bf_find_root(f,6,7), fpprec:50;
(%o12)	6.1190242250423236286846582759149564174857737088648b0

2 Presjek grafova

(%i13) f(x);
(%o13)	x*sin(x)+1
(%i14) g(x):=cos(x);
(%o14)	g(x):=cos(x)
(%i15) wxplot2d([f(x),g(x)], [x,0,10], grid2d, [xtics,0,1,10], [ytics,-6,1,10], [yx_ratio,-1], [axes,solid],
             [legend,false], [style,[lines,2],[lines,2]]), wxplot_size=[500,600];
(%t15)
 (Graphics)
(%o15)

točka presjeka (x1,y1) na segmentu [3,4]

(%i17) x1:find_root(f(x)=g(x),x,3,4);
y1:f(x1);
(x1)	3.673194406304251
(y1)	-0.861996224645738

točka presjeka (x2,y2) na segmentu [6,7]

(%i19) x2:find_root(f(x)=g(x),x,6,7);
y2:f(x2);
(x2)	6.283185307179586
(y2)	0.9999999999999985

točka presjeka (x3,y3) na segmentu [9,10]

(%i21) x3:find_root(f(x)=g(x),x,9,10);
y3:f(x3);
(x3)	9.63168463569187
(y3)	-0.978671068712696

3 Kada naredba find_root neće pronaći nultočku

(%i22) f(x):=(x+1)*sin(x+1);
(%o22)	f(x):=(1+x)*sin(1+x)
(%i23) wxplot2d([f(x),0,[parametric,0,t,[t,-1.5,2]]], [x,-5,3], [y,-1.5,2],
          grid2d, [xtics,-5,1,2], [ytics,-1.5,0.5,2], [yx_ratio,1], [axes,solid],
         [legend,false], [style,[lines,2],[lines,1,2],[lines,1,2]]), wxplot_size=[600,600];
plot2d: some values were clipped.
(%t23)
 (Graphics)
(%o23)

Ne postoji segment [a,b] koji bi sadržavao samo nultočku -1 i za kojeg bi vrijedilo f(a)*f(b)<0.
Stoga naredba find_root neće moći nikako detektirati nultočku -1.

za segment [-2,0] nije zadovoljen uvjet f(-2)*f(0)<0

(%i24) find_root(f,-2,0);
find_root: function has same sign at endpoints: f(-2.0)=0.8414709848078965, f(0.0)=0.8414709848078965 -- an error. To debug this try: debugmode(true);<BR>

segment [-2,3] ne sadrži samo nultočku -1, a find_root naredba daje drugu nultočku unutar segmenta [-2,3]

(%i25) find_root(f,-2,3);
(%o25)	2.141592653589793

 3.1 Naredba newton

Pomoću naredbe newton možemo locirati tu nultočku jer ta naredba ne zahtijeva da specificiramo na početku segment, nego samo jednu točku od koje želimo početi tražiti neku nultočku.

(%i26) load(newton1);
(%o26)	"/usr/share/maxima/5.37.2/share/numeric/newton1.mac"

Nultočku počinjemo tražiti od točke 0 tako dugo dok vrijednost funkcije nije manja od 10^(-15).
Dobivamo aproksimaciju nultočke -1.

(%i27) newton(f(x),x,0,10^(-15));
(%o27)	-0.999999977492308

Nultočku počinjemo tražiti od točke -2 tako dugo dok vrijednost funkcije nije manja od 10^(-15).
Dobivamo aproksimaciju nultočke -1.

(%i28) newton(f(x),x,-2,10^(-15));
(%o28)	-1.000000022507692

Nultočku počinjemo tražiti od točke 2 tako dugo dok vrijednost funkcije nije manja od 10^(-15).
Ne dobivamo aproksimaciju nultočke -1, već neku drugu nultočku jer smo počeli od točke koja
je bliža ovoj drugoj nultočki.

(%i29) newton(f(x),x,2.5,10^(-15));
(%o29)	2.141592653589793

za veću preciznost moramo se prebaciti na aritmetiku velike preciznosti, npr. na 20 znamenki

(%i30) newton(bfloat(f(x)),x,2.5,bfloat(10^(-20))), fpprec:20;
(%o30)	2.1415926535897932385b0
(%i31) newton(bfloat(f(x)),x,0,bfloat(10^(-20))), fpprec:20;
(%o31)	-9.9999999991207932775b-1

Created with wxMaxima.