Nulpunt Bepalen
1. Numerieke Algoritmen
1.1. Nulpunten
… een beetje meer wiskunde.
Neem er een functie:
def Polynoom(x): return x**2 + 2*x - 1
Hoe kan je de nulpunten op een interval \([x_1, x_2]\) bepalen?
import numpy as NP import matplotlib.pyplot as PLT x = NP.linspace(-3., 1., 401, endpoint = True) y = Polynoom(x) PLT.gca().axhline(0, ls = '-', color = 'k') PLT.plot(x, y, 'k-') PLT.show()
1.2. naïve implementatie
- maak er een functie aan die de interval overloopt
- bij een voortekenwissel geeft de functie de x-waarde terug
Wat zijn er beperkingen bij deze implementatie?
# de nulpunten liggen ergens tussen -3 en +1 interval = NP.linspace(-3.0, 1.0, 401, endpoint = True) teken = NP.sign( Polynoom(interval[0]) ) nulpunten = [] for testpunt in interval[1:]: nieuw_teken = NP.sign(Polynoom(testpunt)) if nieuw_teken != teken: nulpunten.append(testpunt) teken = nieuw_teken print (nulpunten)
1.3. bisectie
Analogie: nummertjes raden
- Ik kies een geheim nummer tussen 0 en 100, jij moet ze raden.
- Je mag “groter/kleiner”-vragen stellen.
Bisectie: kies het middelpunt van de interval, en vraag of de nummer groter is. Pas de interval dan aan op de juiste helft en herhaal. (zie hier)
Voor nulpunten:
- Vind de functiewaarde aan één rand van het interval.
- Vind het globale minimum en maximum van de functie op dit interval, en splits 1-3 deelintervallen op bij min en max.
- Kies één rand van het deelinterval. Bepaal hier het voorteken.
- Vindt het midden van het interval. Is het voorteken hier anders? Zo ja, ga verder met de eerste helft van dit interval. Zo niet, ga verder met de tweede helft.
- Herhaal, tot dat jouw interwal smaller dan je nauwkeurigheid is (bv. \(\epsilon < 10^{-6}\)).
# Bisectie interval = [-3, -2] # we weten dat een nulpunt tussen -3 en -2 ligt. while True: teken_i1 = NP.sign(Polynoom(interval[0])) # vind het teken van de functie bij -3 midpunt = NP.mean(interval) if NP.sign(Polynoom(midpunt)) == teken_i1: interval = [midpunt, interval[1]] else: interval = [interval[0], midpunt] if NP.diff(interval) < 10**-6: nulpunt = NP.mean(interval) break print(nulpunt)
Wat zijn voordelen en beperkingen van deze methode?
1.4. Newton-Raphson
voor gevoorderden: implementeer de methode van Newton-Raphson.
vorige les \(\quad\) volgende les