[NumAn] PC-Oef5

2274 days ago by Niels.Neirynck

Numerieke Analyse PC-Oefening 5.1: Nulpunten, Newton-Raphson

x = var('x'); f(x) = x - exp(-(1/2)*x) p = plot(f, (-5,5)) show(p) 
       

We gebruiken de ingebouwde methode find_root() om het nulpunt numeriek te bepalen in het interval $[-5,5]$

x_root = f.find_root(-5,5); show(x_root) parent(x_root) #type van het getal 
       
<type 'float'>
<type 'float'>
Verificatie van het nulpunt:
f(x_root) 
       
0.0
0.0
We zullen nu zelf het nulpunt berekenen door Newton-Raphson uit te voeren. We beginnen met de afgeleide van $f$ te bepalen:
f_ = f.diff() show(f_) 
       

                                
                            

                                
We stellen de iteratiefunctie op:
phi = x - f(x)/f_(x) show(phi) 
       

                                
                            

                                
Digits = 10; 
       

We kiezen als startpunt $x_0 = -3$.

x_num = N( -3.0 , digits=Digits); x_old = x_num; #zie de lus verderop. #plotten van de functie: p = plot(f, (-3.5,2)) #plotten van x_num (lijn van de x-as naar (x_num,f(x_num)). l = line([(x_num,0), (x_num,f(x_num))] , rgbcolor=(1,0,0)) #plotten van de raaklijn door (x_num,f(x_num)) raaklijn = plot(f_(x_num)*(x - x_num) + f(x_num), (-3.5,2) , rgbcolor=(0,1,0)); show(raaklijn+p+l) 
       

We voeren een Netwon-Raphson iteratiestap uit,  we plotten de nieuwe raaklijn en het nieuw punt

x_num = phi(x=x_num) l = line([(x_num,0), (x_num,f(x_num))] , rgbcolor=(1,0,0)) raaklijn = plot(f_(x_num)*(x - x_num) + f(x_num), (-3.5,2) , rgbcolor=(0,1,0)); show(raaklijn+p+l) 
       

We voeren nog een Netwon-Raphson iteratiestap uit, we plotten de nieuwe raaklijn en het nieuw punt:

x_num = phi(x=x_num) l = line([(x_num,0), (x_num,f(x_num))] , rgbcolor=(1,0,0)) raaklijn = plot(f_(x_num)*(x - x_num) + f(x_num), (-3.5,2) , rgbcolor=(0,1,0)); show(raaklijn+p+l) 
       

We vervolledigen het Newton-Raphson algoritme door het uitvoeren van de volgende lus. De lus termineert indien de correctie op x_num in een iteratiestap kleiner is dan eps.

eps = 10^(-15); while(abs(x_old-x_num) > eps): x_old = x_num x_num = phi(x=x_num); print("iteratiestap: x_num = {}, f(x_num) = {}".format(x_num,f(x_num))); 
       
iteratiestap: x_num = 0.7017101588, f(x_num) = -0.002375624186
iteratiestap: x_num = 0.7034672215, f(x_num) = -2.716333256e-7
iteratiestap: x_num = 0.7034674225, f(x_num) = 0.0000000000
iteratiestap: x_num = 0.7034674225, f(x_num) = 0.0000000000
iteratiestap: x_num = 0.7017101588, f(x_num) = -0.002375624186
iteratiestap: x_num = 0.7034672215, f(x_num) = -2.716333256e-7
iteratiestap: x_num = 0.7034674225, f(x_num) = 0.0000000000
iteratiestap: x_num = 0.7034674225, f(x_num) = 0.0000000000