1 Numeričko traženje nultočki funkcije
(%i1) | f(x):=x*sin(x)+1; |
(%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]; |
neka nultočka na segmentu [0,10]
(%i3) | find_root(f,0,10); |
(%i4) | find_root(x*sin(x)+1,x,0,10); |
ako želimo nultočku na segmentu [9,10]
(%i5) | find_root(f,9,10); |
(%i6) | find_root(x*sin(x)+1,x,9,10); |
ako želimo nultočku na segmentu [6,7]
(%i7) | find_root(f,6,7); |
(%i8) | find_root(x*sin(x)+1,x,6,7); |
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); |
(%i10) | find_root(x*sin(x)+1,x,5.5,6.5); |
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); |
Ž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; |
2 Presjek grafova
(%i13) | f(x); |
(%i14) | 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]; |
točka presjeka (x1,y1) na segmentu [3,4]
(%i17) |
x1:find_root(f(x)=g(x),x,3,4); y1:f(x1); |
točka presjeka (x2,y2) na segmentu [6,7]
(%i19) |
x2:find_root(f(x)=g(x),x,6,7); y2:f(x2); |
točka presjeka (x3,y3) na segmentu [9,10]
(%i21) |
x3:find_root(f(x)=g(x),x,9,10); y3:f(x3); |
3 Kada naredba find_root neće pronaći nultočku
(%i22) | f(x):=(x+1)*sin(x+1); |
(%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]; |
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); |
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); |
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); |
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)); |
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)); |
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)); |
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; |
(%i31) | newton(bfloat(f(x)),x,0,bfloat(10^(-20))), fpprec:20; |