

#skrypt nie moze sie zaczynac od slowa function
1==1;
clear all




function [x,y,it,KK]=bisekcja(f,a,b,tol=1e-10)
#implementacja m bisekcji dla rownania f(x)=0
#a,b, konce odcinka
#f wskaznik do funkcji obliczajacej f(x)
#tol - opcja - mozna podac tolerancje dla warunku stopu 
#(domyslnie wartosc 10^{-10}) - stop gdy dlugosc odcinka <tol
#output
#x - przyblizenie zera (srodek ostatniego odcinka)
#y=f(x)
#it - ilosc iteracji metody bisekcji
#KK - macierz 2kolumnowa 
#     pierwsza kolumna lewe konce odcinkow - druga - prawe konce odcinka
#erest - estymacja bledu
#wywolanie 
#proste:  x=bisekcja(@cos,0,2)
#         [x,y,it]=bisekcja(@cos,0,2,1e-4)
maxit=200;
ya=f(a);yb=f(b);it=0;
if(sign(ya)==sign(yb))
 printf("znak f(a) == znak f(b) metoda  bisekcji nie zadziala \n");
 return;
endif
it=0;
x=(a+b)/2;
KK=zeros(maxit,2);
KK(1,:)=[a,b]; 
while((abs(a-b)>tol)&&(it<=maxit))
 y=f(x);
 if(y==0) return; endif
 if(sign(ya)==sign(y))
  a=x;ya=y;
 else
  b=x;yb=y;
 endif
 it++;
 x=(a+b)/2;
 KK(it+1,:)=[a,b];
endwhile
if(it==maxit)
 printf("Uwaga: bisekcja przerwala dzialanie z uwagi na osiagniecie max il  iteracji=%D\n",maxit);
endif
 KK=KK(1:it+1,:);
endfunction


format long e
#testujemy dla f(x)x-cos(x)
disp("testy bisekcji dla x=cos(x)");
f1=@(x) x-cos(x);
a=0;b=1;
[x,y,it,KK]=bisekcja(f1,a,b);
[x,y,it]

#to samo dla wiekszej dokladnosci

[x1,y,it]=bisekcja(f1,a,b,tol=1e-16)
format long e
er=x1-x


#trudniejszy przypadek
disp("testy bisekcji dla (x-r)^3=x^3...-r^3");
r=2+1e-3*(rand-0.5);
f2=@(x) x^3-3*x.*x.*r+3*x*r*r-r*r*r;
a=rand;b=pi*0.5*(1+rand);
[x3,y,it,KK]=bisekcja(f2,a,b);
er3=x3-r
#cos nie tak.... blad < 1e-10...
[mm,in]=max((KK(:,1)>r)+(KK(:,2)<r));
printf("od %d iteracji rozwiazanie poza przedzialem - bledy zaookroglen..\n",in);



disp("testy bisekcji dla (x-r)^5=x^5...");
f3=@(x) x^5-5*x^4*r+10*x^3*r^2-10*x^2*r^3+5*x*r^4-r^5;
[x6,y,it,KK]=bisekcja(f3,a,b);
er6=x6-r
#jeszcze gorzej.... blad teoretycznie  < 1e-10...
[mm,in]=max((KK(:,1)>r)+(KK(:,2)<r));
printf("od %d iteracji rozwiazanie poza przedzialem - bledy zaookroglen..\n",in);

#na labie z fl wyjasni sie dlaczego tak sie stalo...




