Inleiding

Net als de bisectiemethode is ook de Regula falsi een algoritme om een nulwaarde van een functie \(f(x)\) te zoeken in een interval \([a, b]\). Opnieuw geldt dat \(f(a)\) en \(f(b)\) steeds een tegengesteld teken moeten hebben (\(f(a) \cdot f(b) < 0\)), en dat \(f(x)\) continu moet zijn 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:

regula falsi

Opgave

  1. Neem een blad papier en noteer het voorschrift van de rechte \(r\) door de punten \(A(a, f(a))\) en \(B(b, f(b))\). Stel dit voorschrift gelijk aan nul, en los op naar \(x\). Deze uitdrukking bepaalt de waarde van \(c\) in elke stap van het algoritme. Schrijf vervolgens een functie bepaal_c(f, a, b) die de waarde van \(c\) berekent en teruggeeft. f is het functievoorschrift waarvan je de nulwaarde wilt bepalen. In je implementatie kan je gewoon verwijzen naar f(a), f(b), etc.

  2. Schrijf een functie regula_falsi_iteratief(f, a, b, e) die de vergelijking \(f(x) = 0\) numeriek oplost door het regula falsi-algoritme op een iteratieve manier toe te passen in het interval \([a,b]\) met toleratie \(e\). Probeer Voorbeeld 2 te begrijpen: we zoeken een nulwaarde van \(f(x) = 2x^2 - x - 3\) door het regula falsi-algoritme toe te passen op het interval \([0, 2]\) met een tolerantie van \(10^{-12}\). De gevonden oplossing is tot op 13 decimalen 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\).

  3. Schrijf een functie regula_falsi_recursief(f, a, b, e) die de vergelijking \(f(x) = 0\) numeriek oplost door het regula falsi-algoritme op een recursieve manier toe te passen in het interval \([a,b]\) met toleratie \(e\). Probeer Voorbeeld 3 te begrijpen: we zoeken een nulwaarde van \(f(x) = x^2 - 2\) door het regula falsi-algoritme 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. Het regula falsi-algoritme is uiteraard algemeen toepasbaar op alle mogelijke functies.

Voorbeeld 1

Invoer:

> midden(15.4, 18.8)

Uitvoer:

17.1

Voorbeeld 2

Invoer:

> regula_falsi_iteratief(lambda x: 2*x**2 - x - 3, 0, 2, 1e-12)

Uitvoer:

1.4999999999999631

Voorbeeld 3

Invoer:

> regula_falsi_recursief(lambda x: x**2 - 2, 0, 2, 1e-12)

Uitvoer:

1.4142135623728214