Soit \(f\) la fonction définie sur \(\mathbb{R}\) par \(f(x)=x^3-3x^2+5\).
Dichotomie14Eleve.alg
sur mon site et compléter l'algorithme de Dichotomie pour cette fonction avec Algobox.Dichotomie14Eleve.alg
pour qu'il détermine un encadrement de \(\beta\) d'amplitude saisie par l'utilisateur avec la méthode par dichotomie. Enregistrer le nouveau programme sous le nom Dichotomie14Eleve2.alg
.from sympy import *
init_printing()
t = symbols('t')
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
#expression de f(x)
expf = t**3 - 3*t**2 + 5
expf
#expression de f'(x)
expfprim = diff(expf, t)
expfprim
f = lambdify(t, expf,"numpy")
fprim = lambdify(t, expfprim,"numpy")
#tracé des courbes de f et f'
xmin, xmax, ymin, ymax = -3, 1, -20, 20
plt.axis([xmin, xmax, ymin, ymax])
x = np.linspace(xmin, xmax, 1001)
y = f(x)
z = fprim(x)
plt.axhline(color='blue')
plt.axvline(color='blue')
plt.grid(True)
plt.plot(x, y, linestyle='-', linewidth=2, color='red', label=r'$y=f(x)')
plt.plot(x, z, linestyle='-', linewidth=1, color='green', label=r"$y=f'(x)")
plt.legend(loc='upper left')
#limite de f en +oo
limit(expf, t, + oo)
#limite de f en -oo
limit(expf, t, -oo)
#f(-2)
expf.evalf(subs={t:-2})
#f(-1)
expf.evalf(subs={t:-1})
D'après un corollaire du théorème des valeurs intermédiaires, l'équation \(f(x)=0\) possède donc une unique solution \(\alpha\) dans l'intervalle \([-2;-1]\)
#fonctions dichotomies en Python
def dicho(f,a,b,e):
"""valeur approchée à e près de la solution de f(x)=0
sur [a,b]. On admet que l'utilisateur saisit des paramètres
où la dichotomie peut s'appliquer. Construit une figure
à chaque étape"""
etape = 0 #nombre d'étapes
if f(a) <= f(b):
#croissant ou du moins passage de - à +
croissant = True
else:
croissant = False
while b-a > e:
etape += 1
#on calcule le milieu du segment [a,b]
m = (a+b)/2
#figure
x = np.linspace(a,b,500)
y = f(x)
plt.xlim(a,b)
if croissant:
plt.ylim(max(f(a),-50),min(f(b),50))
else:
plt.ylim(max(f(b),-50),min(f(a),50))
plt.plot(x,y,color='red')
plt.grid(True)
plt.axhline()
plt.title('a=%.4f et m=%.4f et b=%.4f'%(a,m,b))
plt.show()
#fin de la figure
s = f(m)*f(a)
#si f(m) et f(a) sont de meme signe, f(x)=0 dans ]m,b[
if s > 0:
a = m
#si f(m) et f(a) sont de signes opposés, f(x)=0 dans ]a,m[
else:
b = m
return a, b, etape
def dicho_tab(f,a,b,e):
"""valeur approchée à e près de la solution de f(x)=0
sur [a,b]. On admet que l'utilisateur saisit des paramètres
où la dichotomie peut s'appliquer.
Ne retourne rien mais remplit un tableau avec les valeurs
de a, b et m aux differentes etapes"""
count = 0 #nombre d'étapes
if f(a) <= f(b):
#croissant ou du moins passage de - à +
croissant = True
else:
croissant = False
#en-tete du tableau
print('|{etape:^16}|{binf:^12}|{bsup:^12}|{median:^12}|{signe:^12}|'.format(etape='Etape',
binf='a', bsup='b', median='m',
signe='f(a)*f(m)'))
while b-a > e:
count += 1
#on calcule le milieu du segment [a,b]
m = (a+b)/2
#fin de la figure
s = f(m)*f(a)
#si f(m) et f(a) sont de meme signe, f(x)=0 dans ]m,b[
#remplissage de la ligne du tableau
print('|{etape:^16}|{binf:^12.6f}|{bsup:^12.6f}|{median:^12.6f}|{signe:^+12.6f}|'.format(etape=count,
binf=a, bsup=b,
median=m, signe=s))
if s > 0:
a = m
#si f(m) et f(a) sont de signes opposés, f(x)=0 dans ]a,m[
else:
b = m
print('|{etape:^16}|{binf:^12.6f}|{bsup:^12.6f}|{median:^12}|{signe:^12}|'.format(etape='Sortie de boucle',
binf=a, bsup=b,
median="", signe=""))
Ci-dessous, la correction du tableau de l'Annexe 2
dicho_tab(f, -2, -1, 0.1)
Ci-dessous la même chose mais avec les graphiques
#application de l'algorithme de dichotomie à f(x)=x**2-3*x**2+5
#avec a = -2 , b = -1 et precision = 0.1
dicho(f, -2, -1, 0.1)
1/2**3, 1/2**4
L'intervalle de départ a pour amplitude 1 (\(a_0=-2\) et \(b_0=-1\)) A chaque étape l'amplitude de l'intervalle de recherche est divisée par 2 Au bout de \(n\) étapes, l'amplitude de la zone de recherche est de \(\frac{b_{0}-a_{0}}{2^n}\) soit \(\frac{1}{2^n}\) ici. Avec la calculatrice (voir ci-dessu ou le logarithme népérien) on peut vérifier que le plus petit entier \(n\) tel que \(\frac{1}{2^n} \leqslant 0,1\) est \(n=4\)
Pour voir (et tester) le corrigé de la version Algobox
de Dichotomie14eleve.alg
, cliquer sur ce lien qui renvoie vers mon site internet (tous les algorithmes et ce corrigé sont disponibles sur la page algorithme).
Ci-dessous, le tableau puis les graphiques de l'algorithme de dichotomie pour \(a=-2\), \(b=-1\) et precision=\(0,001\)
dicho_tab(f, -2, -1, 0.001)
#application de l'algorithme de dichotomie à f(x)=x**2-3*x**2+5
#avec a = -2 , b = -1 et precision = 0.001
print(dicho(f, -2, -1, 0.001))
1/2**9, 1/2**10
L'intervalle de départ a pour amplitude 1 (\(a_0=-2\) et \(b_0=-1\)) A chaque étape l'amplitude de l'intervalle de recherche est divisée par 2 Au bout de \(n\) étapes, l'amplitude de la zone de recherche est de \(\frac{b_{0}-a_{0}}{2^n}\) soit \(\frac{1}{2^n}\) ici. Avec la calculatrice (voir ci-dessu ou le logarithme népérien) on peut vérifier que le plus petit entier \(n\) tel que \(\frac{1}{2^n} \leqslant 0,001\) est \(n=10\)
#tracé de la courbe de f et des droites d'équation y=10, et x=3 et x=4
xmin, xmax, ymin, ymax = 0, 10, -20, 20
plt.axis([xmin, xmax, ymin, ymax])
x = np.linspace(xmin, xmax, 1001)
y = f(x)
plt.axhline(color='blue')
plt.axvline(color='blue')
plt.axvline(3, linestyle='dashed', color='navy', label=r'$x=3$')
plt.axvline(4, linestyle='dashed', color='navy', label=r'$x=4$')
plt.axhline(10, linestyle='dashed',color='green',label=r'$y=10$')
plt.grid(True)
plt.plot(x, y, linestyle='-', linewidth=2, color='red', label=r'$y=f(x)$')
plt.legend(loc='lower right')
On peut conjecturer graphiquement que l'équation \(f(x)=10\) possède une unique solution \(\beta\) telle que \(3<\beta<3+1\)
Pour le justifier, il suffit de faire le tableau de variation de \(f\) sur \(\mathbb{R}\).
Sa fonction dérivée est \(f':x \mapsto 3x(x-2)\) donc on a :
Ainsi \(f\) admet deux extrema locaux en \(f(0)=5\) et \(f(2)=1\) et pour tout \(x \geqslant 2\) on a \(f(x)<10\) donc l'équation \(f(x)=10\) n'a pas de solution sur \(]-\infty;2[\).
On se place désormais sur \(]2;+\infty[\) :
D'après un corollaire du théorème des valeurs intermédiaires, l'équation \(f(x)=10\) possède donc une unique solution \(\beta\) dans l'intervalle \(]2;+\infty[\)
Enfin on a \(f(3)<10\) et \(f(4)>10\) donc \(\beta \in ]3;4[\).
Pour voir (et tester) le corrigé de la version Algobox
de Dichotomie14eleve2.alg
, cliquer sur ce lien qui renvoie vers mon site internet (tous les algorithmes et ce corrigé sont disponibles sur la page algorithme).
#expression de g(x)
expg = Rational(1,2)*(t**2 - 6*t - 10/t)
expg
#expression de g'(x)
expgprim = diff(expg, t)
expgprim
#on factorise
expgprim = expgprim.factor()
expgprim
t**2*expgprim
expf
t**2*expgprim == expf
On a \(g'(x)=\frac{f(x)}{x^2}\), donc \(g'(x)\) est du signe de \(f(x)\) sur \(\mathbb{R}-\{0\}\).
Grace au tableau de variation de \(f\) étable précédemment, on peut écrire que :
g = lambdify(t, expg,"numpy")
#tracé de la courbe de g
xmin, xmax, ymin, ymax = -3, 10, -20, 20
plt.axis([xmin, xmax, ymin, ymax])
x = np.linspace(xmin, xmax, 1001)
y = g(x)
plt.axhline(color='blue')
plt.axvline(color='blue')
plt.grid(True)
plt.plot(x, y, linestyle='-', linewidth=2, color='red', label=r'$y=g(x)$')
plt.legend(loc='lower right')
import scipy.optimize
#valeur approchée de g(x)=0 avec la fonction bisect de la bibliothèque scipy.optimize
#qui en fait implémente l'algorithme de dichotomie
#pour la méthode par balayage voir les explications données en classe par le professeur
#en général on utilise le mode tableau de valeurs de sa calculatrice en reprérant les 2 valeurs
#encadrant le changement de signe puis en recommençant la tabulation entre ces 2 valeurs avec un pas
#plus petit (divisé par 10 par exemple)
scipy.optimize.bisect(g, 6, 7)
Pour voir (et tester) le corrigé de l'algorithme de l'exercice 3, cliquer sur ce lien qui renvoie vers mon site internet (tous les algorithmes et ce corrigé sont disponibles sur la page algorithme).
Pour voir (et tester) le corrigé de l'algorithme de l'exercice 4, cliquer sur ce lien qui renvoie vers mon site internet (tous les algorithmes et ce corrigé sont disponibles sur la page algorithme).