On se propose d'étudier l'équation (1) : x^3 +1=3x.
Pour cela, on pose f(x) = x^3-3x+1 sur \mathbb{R}.
Quel est le nombre de solutions de l'équation (1) ?
f est une fonction polynomiale donc elle est dérivable sur \mathbb{R}.
Pour tout réel x, f'(x) = 3x^2-3.
On étudie l'inéquation : f'(x) \geq 0 .
Calcul du déterminant :
\Delta = b^2-4ac=0-4\times 3 \times (-3) = 36
Calcul des racines :
x_1=\dfrac{-b-\sqrt{\Delta}}{2a}=\dfrac{-6}{6}=-1
x_2=\dfrac{-b+\sqrt{\Delta}}{2a}=\dfrac{+6}{6}=1
Signe de f' :
f' est du signe de a à l'extérieur de l'intervalle délimité par ses racines.
Donc f' est positive sur ]-\infty;-1] et sur [1;+\infty[ .
f' négative sur [-1;1].
Ainsi f est croissante sur ]-\infty;-1] et sur [1;+\infty[ et décroissante sur [-1;1].
De plus :
- \lim \limits_{x \to -\infty}f(x) = - \infty
- f(-1)=3
- f(1)=-1
- \lim \limits_{x \to +\infty}f(x)=+\infty
Sur ]-\infty;-1[, f est continue, strictement monotone et 0 \in ]-\infty ; 3[. D'après le théorème des valeurs intermédiaires, l'équation f(x)=0 a une solution sur ]-\infty;-1[.
De manière analogue, on peut prouver que f(x)=0 a une solution sur [-1;1] et une solution sur [1;+\infty[.
f(x)=0 a donc trois solutions sur \mathbb{R}.
On cherche à écrire un algorithme qui détermine une valeur approchée des solutions à l'équation (1) par dichotomie.
Cet algorithme fonctionne comme suit :
- On initialise un intervalle [a;b] contenant uniquement une solution de (1).
- On calcule le milieu de cet intervalle que l'on nomme c.
- On calcule f(a)\times f(c) . Si cette valeur est négative, alors la solution de l'équation appartient à [a;c], donc on pose b=c.
- Sinon la solution appartient à [c;b], donc on pose a=c.
- On réitère ce processus n fois.
L'idée derrière cet algorithme est de réduire l'intervalle autour de la solution.
Parmi les propositions suivantes, laquelle correspond à l'écriture de cet algorithme en Python ?
On va écrire l'algorithme en deux étapes. On commence par écrire une fonction qui permet de calculer f(x).
L'autre fonction concernera l'algorithme en lui-même.
L'algorithme en Python est donc :
def f(x) :
return x**3-3*x+1
def dicho(a,b,n) :
"""IN: un intervalle [a,b] d'itération et un nombre
OUT : un intervalle restreint auquel appartient une solution de l'équation"""
for i in range(n) : #on itère n fois
c=(a+b)/2 #on calcule le milieu de l'intervalle
if f(a)*f(c) <=0 :
b=c #si f(a)*f(c)<=0 alors la solution appartient à [a;c] donc on réduit l'intervalle en enlevant [c;b]
else :
a=c #inversement
return a,b
D'après les fonctions écrites à la question précédente, quelles sont les trois valeurs approchées des solutions de f(x)=0 ?
Il faut déterminer les intervalles auxquels appartiennent les solutions de l'équation. On peut utiliser les intervalles suivants, déterminés grâce à la question 1 :
- [-\text{1 000};-1{,}01]
- [-0{,}999;0{,}999]
- [1{,}01;\text{1 000}]
On peut ensuite lancer les fonctions :
a,b=dicho(-1000,-1,01,1 000)
print((a+b)/2)
a,b=dicho(-0,99,0,99,1 000)
print((a+b)/2)
a,b=dicho(1,01,1 000,1 000)
print((a+b)/2)
On prend comme solution le milieu du dernier intervalle trouvé par l'algorithme.
Les solutions trouvées sont donc :
- x_1 \approx -1{,}88
- x_2 \approx 0{,}35
- x_3 \approx 1{,}53