Nulpunt Bepalen


Home 4BSW1 4BSW2 4MTLAT/4LAT 4MWW1 4MWW2 4NWE2 5BWE 5EWI/5LWI/5WWI1 5WWI2 About

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.

Date: 2024-03-15 Fri 00:00

Author: Falk Mielke