

function [x,it]=sieczne(f,x0,x1=x0*(1+1e-8),xs=0)
#funkcja octave'a z m siecznych i jej (opjca) testami
#xn=xp-f(xp)(xp-xpp)/(fxp)-f(xpp)
#Wejscie - parametry
#f- uchwyt (Wskaznik) do funkcji obliczajacej f(x)
#df- uchwyt (Wskaznik) do funkcji obliczajacej f'(x)
#x0,x1 - startowe przyblizenie zera (jesli x1 niepodane to x1=x0(1+1e-8)
#xs (opcja) - rozwiazanie tylko do testow - jesli podane to funkcja 
#drukuje e_n/(e_n)^p dla p=1,2,3
#output - na wyjsciu z funkcji
#x - przyblizenie zera (ostatnia wartosc xn)
#it ilosc iteracji
#przyklad wywolania
#z testami rzedu zbieznosci
#[x,it]=sieczne(@(x)x*x-4,@(x)2*x,4,5,2) 
#x=sieczne(@(x)x*x-4,@(x)2*x,4,5,2) 
#bez testow zbieznosci
#[x,it]=sieczne(@(x)x*x-4,@(x)2*x,4) 
#x=sieczne(@(x)x*x-4,@(x)2*x,4,5) 
#
Nmax=100;tolr=1e-7;

er=x1-xs;
it=1;
xp=x0;
x=x1;
y=f(x);
yp=f(xp);
while((abs(y)>tolr)&&(it<Nmax))
 idy=(x-xp)/(y-yp); #odwrotnosc roznicy (f(x)-f(xp)/(x-xp))
 xp=x;
 x=x-y*idy;
 yp=y;
 y=f(x);
 it++;
 if(nargin==4)
  erp=er;er=x-xs;
  printf("[%d] %g %g %g %g\n",it,er,er/erp,er/(erp*erp),er/(erp*erp*erp));
 endif
endwhile
if(it>=100)
 printf("Ilosc iteracji=%d przekroczyla max ilosciteracji =%d\n",it,Nmax);
endif 

endfunction
