Méthode de la sécante
On considère une fonction $f$ strictement monotone sur un intervalle $[a\,;b]$ et telle qu'il existe un unique $x_0\in[a\,;b]$ solution de l'équation $f(x)=0$.
On cherche une valeur approchée de $x_0$.
On donne une application avec la fonction $f$ définie sur $[0\,;+\infty[$ par $f(x)=x^2-2$ (et la recherche donc d'une approximation de $\sqrt{2}$), puis on donne un algorithme générique pour toute fonction remplissant les conditions énoncées précédemment.
Exemple
Xmin = -1
Xmax = 3
Ymin = -2.2
Ymax = 2.2
function traceS(){
couleur = noir
peinture = blanc
transparence = 1
rectangle([-5,5],20,20)
traceG(4)
traceX()
traceY()
couleur = bleu
graphe(f,0,10)
couleur = rouge
}
function f(x){
return x*x-2
}
function dicho(n){
traceS()
a = 0
b = 2
for(i = 0; i < n-1; i++){
c = a-f(a)*(b-a)/(f(b)-f(a))
if( f(c) < 0 ){
a = c
}
else{
b = c
}
}
segment([a,f(a)],[b,f(b)])
c = a-f(a)*(b-a)/(f(b)-f(a))
if( f(c) < 0 ){
a = c
}
else{
b = c
}
couleur = vert
point([c,0])
segment([c,0],[c,f(c)],[5,2])
segment([0,f(c)],[c,f(c)],[5,2])
couleur = noir
texte(c,[-0.5,1])
}
traceS()
curseur("k",1,1,50,1)
dicho({k})
def f(x):
return x*x-2
def secante(n):
a = 0
b = 10
for i in range(0,n):
c = a-f(a)*(b-a)*1.0/(f(b)-f(a))
if f(c) < 0:
a = c
else:
b = c
return c
print(secante(10))
print(secante(20))
print(secante(30))
print(secante(40))
print(secante(94))
print(secante(95))
Cas générique
def f(x):
return x*x-2
def t(x):
return x**3-2
def secante(f,a,b,n):
for i in range(0,n):
c = a-f(a)*(b-a)*1.0/(f(b)-f(a))
if f(c)*f(a) < 0:
a = c
else:
b = c
return c
print(secante(f,0,10,50))
print(secante(t,0,2,200))