De bisectiemethode is een eenvoudig maar toch erg betrouwbaar numeriek algoritme om de oplossing te vinden van de vergelijking \(f(x) = 0\). De achterliggende idee van de bisectiemethode is dat we herhaaldelijk het interval halveren waarin met zekerheid een oplossing van de vergelijking te vinden is. Als we deze procedure maar vaak genoeg blijven herhalen, bekomen we een erg klein interval waarin de gezochte oplossing ligt.
Om zeker te zijn dat er een oplossing bestaat in een interval \([a, b]\), eisen we dat \(f(a) \cdot f(b) < 0\). \(f(a)\) en \(f(b)\) hebben dan een verschillend teken. We eisen daarnaast dat \(f(x)\) continu is in \([a, b]\). Als aan deze beide voorwaarden voldaan is, weten we zeker dat er minstens één oplossing van \(f(x) = 0\) ligt in \([a, b]\).
Het algoritme verloopt als volgt:

Schrijf een functie midden(a, b) die het midden van interval \([a, b]\) teruggeeft.
Schrijf een functie bisectie_iteratief(f, a, b, e) die de vergelijking \(f(x) = 0\) numeriek oplost door de bisectiemethode op een iteratieve manier toe te passen in het interval \([a,b]\) met toleratie \(e\). In je implementatie kan je gewoon verwijzen naar f(a), f(b), etc. Probeer Voorbeeld 2 te begrijpen: we zoeken een nulwaarde van \(f(x) = 2x^2 - x - 3\) door de bisectiemethode toe te passen op het interval \([0, 2]\) met een tolerantie van \(10^{-12}\). De gevonden numerieke oplossing is exact gelijk aan de oplossing die je algebraïsch zou vinden. Je hoeft niet noodzakelijk te begrijpen waar lambda x: 2*x**2 - x - 3 vandaan komt: dit is een manier om te noteren dat \(f(x) = 2x^2 - x - 3\).
Schrijf een functie bisectie_recursief(f, a, b, e) die de vergelijking \(f(x) = 0\) numeriek oplost door de bisectiemethode op een recursieve manier toe te passen in het interval \([a,b]\) met toleratie \(e\). In je implementatie kan je gewoon verwijzen naar f(a), f(b), etc. Probeer Voorbeeld 3 te begrijpen: we zoeken een nulwaarde van \(f(x) = x^2 - 2\) door de bisectiemethode toe te passen op het interval \([0, 2]\) met een tolerantie van \(10^{-12}\). De gevonden oplossing is tot op 12 decimalen gelijk aan \(\sqrt{2} \approx 1.4142135623730951\). Je hoeft niet noodzakelijk te begrijpen waar lambda x: x**2 - 2 vandaan komt: dit is een manier om te noteren dat \(f(x) = x^2 - 2\).
Test je code in Dodona. Let daarbij op dat je geen hoofdprogramma ingeeft. Merk op dat er uitsluitend veeltermfuncties gebruikt worden in de evaluatie. De bisectiemethode is uiteraard algemeen toepasbaar op alle mogelijke functies.
Invoer:
> midden(15.4, 18.8)
Uitvoer:
17.1
Invoer:
> bisectie_iteratief(lambda x: 2*x**2 - x - 3, 0, 2, 1e-12)
Uitvoer:
1.5
Invoer:
> bisectie_recursief(lambda x: x**2 - 2, 0, 2, 1e-12)
Uitvoer:
1.4142135623733338