#!/usr/bin/env python3 def bisekcja(f,a,b,err,maxiter=2098,v=False): ''' ---------------------------------------------------------------------- ARGUMENTY: f - funkcja, której miejsca zerowego szukamy a,b - krańce przedziału poszukiwania (float) err - dopuszczalny błąd wyniku: x0 = x +/- delta, delta<=err (float) maxiter - maksymalna liczba iteracji (int) v - czy wypisywać poszczególne kroki (bool) WYNIK - krotka zawierająca: x - miejsce zerowe (float) delta - faktyczny błąd wyniku (x0 = x +/- delta) (float) fx - f(x) i - liczba iteracji, w jakiej osiągnięto wynik kod - informacja o poprawności wykonania: 0: sukces 1: procedura nie osiągnęła zamierzonej dokładności err w toku maxiter iteracji 2: funkcja miała ten sam znak na krańcach przedziału poszukiwania -- procedura może zbiec do któregoś z wielu miejsc zerowych bądź jednego z krańców przedziału poszukiwania a,b maxiter=2098, bo we float maksymalne log2(abs(a-b))<1024, a minimalne log2(err)=-1074 (liczby subnormalne); jednocześnie liczba kroków do uzyskania err z abs(a-b) w bisekcji to log2(abs(a-b)/err) ---------------------------------------------------------------------- ''' kod=0 fa=f(a);fb=f(b) if (fa<0 and fb<0) or (fa>0 and fb>0): kod=2 #Ten sam znak na krańcach! if fb<0: #Ustawienie f(x)<0 w a a,b = b,a fa,fb = fb,fa delta=abs(a-b) for i in range(1,maxiter+1): delta=delta/2 x=(a+b)/2 #Połowa przedziału -- bisekcja fx=f(x) if delta<=err: break #Osiągnięto zamierzoną dokładność if fx<0: #Założyliśmy, że f(a)<0; UWAGA - nie musi być prawda gdy kod=2! fa=fx; a=x else: fb=fx; b=x if v: print("iter: {:4}, x0={: 24.16e} +/- {:<24.16e}, f(x0)={: 24.16e}".format(i,x,delta,fx)) else: kod=1 #Nie osiągnięto zbieżności w maxiter kroków return x,delta,fx,i,kod def wielomian(x): return 1.4*x**2 + 2*x -1 #x0=-1.82085238463069054 #x0= 0.39228095605926197 def ff(x): return x+2**x -2 a,b=map(float,input("Podaj krańce przedziału poszukiwania(spacja oddziela): ").split()) err=float(input("Podaj żądaną dokładność: ")) v=bool(input("Wypisać szczegóły?(t/N):").lower().strip()=="t") print(bisekcja(ff,a,b,err,v=v))