<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 ^ gor
Step2:  Vidimo, da sta $f(0)$ in $f(1)$ različnega predznaka, kar pomeni, da je na intervalu $(0,1)$ ničla.
Step3:  Predstavimo bisekcijo še grafično.
<ASSISTANT_TASK:>
Python Code:
f = lambda x: x-2**(-x)
a,b=(0,1) # začetni interval 
(f(a),f(b))
Explanation: ^ gor: Uvod
Reševanje enačb z bisekcijo
Vsako enačbo $l(x)=d(x)$ lahko prevedemo na iskanje  ničle funkcije
$$f(x)=l(x)-d(x)=0.$$
Ničlo zvezne funkcije lahko zanesljivo poiščemo z bisekcijo. Ideja je preprosta. Če so vrednosti funkcije v krajiščih intervala $[a,b]$ različnega predznaka, potem znotraj intervala $(a,b)$ zagotovo leži ničla ($x\in(a,b)$, za katerega je $f(x)=0$). 
Recimo, da je $f(a)>0$ in $f(b)<0$. Če izračunamo vrednost funkcije v središču intervala $c=\frac{1}{2}(a+b)$, lahko interval, za katerega vemo, da vsebuje ničlo, zmanjšamo na polovico. 
Če je $f(c)=0$, smo ničlo že našli in lahko prenehamo z iskanjem. 
Če je $f(c)<0$, potem je ničla zagotovo na intervalu $(a,c)$, 
če pa je $f(c)>0$, je ničla zagotovo na intervalu $(c,b)$. 
Če opisani postopek ponavljamo dovolj dolgo, lahko Interval, ki vsebuje ničlo, poljubno zmanjšamo, 
Primer
Reši enačbo
$$x=2^{-x}.$$
Rešitev
Enačbo lahko prevedemo na  iskanje ničle funkcije
$$f(x) = x-2^{-x}.$$
Najprej poiščemo interval za katerega smo prepričani, da vsebuje ničlo. Iščemo dve vrednosti $x$, za katere ima $f(x)$ različni predznak.
End of explanation
def bisekcija(f,a,b,n):
    bisekcija(f,a,b,n) z bisekcijo izračuna interval širine (b-a)/2**n na katerem leži ničla funkcije f.
    if n<=0:
        return (a,b)
    fa, fb = (f(a),f(b))
    assert (fa*fb)<=0, "Predznaka v krajiščih intervala [%f,%f] sta enaka" % (a,b) 
    c = (a+b)/2 # središče intervala
    fc = f(c)
    if fc == 0:
        return (c,c)
    elif fc*fa<=0:
        return bisekcija(f,a,c,n-1)
    else:
        return bisekcija(f,c,b,n-1)
a,b = (0,1)
# 10 korakov bisekcije
for i in range(10):
    print(bisekcija(f,a,b,i))
Explanation: Vidimo, da sta $f(0)$ in $f(1)$ različnega predznaka, kar pomeni, da je na intervalu $(0,1)$ ničla.
End of explanation
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
a , b = (0,1)
t = np.linspace(a,b)
plt.plot(t,f(t))
plt.plot([0,1],[0,0],'k')
for i in range(6):
    plt.plot([a,a],[0,f(a)],'r-o') # levo krajišče
    plt.plot([b,b],[0,f(b)],'k-o') # desno krajišče
    plt.annotate("$a_%d$" % i, xy = (a,0),xytext = (a,0.07*(i+1)),fontsize=12)
    plt.annotate("$b_%d$" % i, xy = (b,0),xytext = (b,-0.07*(i+1)),fontsize=12)
    a,b = bisekcija(f,a,b,1)
plt.grid()
import disqus
%reload_ext disqus
%disqus matpy
Explanation: Predstavimo bisekcijo še grafično.
End of explanation
<END_TASK>