Dans cette partie, nous allons déterminer par balayage une approximation par défaut de $\sqrt{2}$ avec une erreur inférieure à $10^{-n}$ en utilisant la fonction $x\mapsto x^2-2$.
Importation des librairies graphiques
import matplotlib.pyplot as plt
La fonction representation
trace la représentation graphique d'une fonction $f$.
Elle utilise une subdivision de $[a,b]$ en $N$ intervalles de même longueur.
Elle prend comme paramètres :
def f(x):
return x**2-2
def representation(a,b,N):
pas = (b-a)/N
for i in range(N+1):
x = a+i*pas
plt.plot(x,f(x),'b.')
representation(0,2,100)
plt.plot([0,2],[0,0],'r--')
plt.show()
pas
? Comment est-elle calculée ?x
dans la boucle de la ligne 7 ?x
dans la boucle de la ligne 7 ?Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 2, 5 et 7 par return ...
,pas= ...
et x = ...
, demander aux élèves de compléter les lignes 2, 5 et 7.
Tester la fonction representation
pour l’intervalle $[0,2]$ divisé en 100 parties.
Ici, la fonction plot
est utilisée au fur et à mesure du calcul car la notion de liste ne figure pas au programme de la classe de seconde.
Le programme suivant donne une approximation par défaut de $\sqrt{2}$ avec une erreur inférieure à $10^{-2}$.
a = 0
b = 2
N = 200
pas = (b-a)/N
estimation = a
while f(estimation)<0:
estimation = estimation + pas
print("Estimation de racine de racine de 2:",estimation)
print("Estimation de racine de 2 au carré:",estimation**2)
Expliquer un programme
Expliquer la valeur de N
ligne 3.
Compléter un programme
Le programme précédent étant fourni en remplaçant les lignes 6, 7 et 8 par estimation = ...
, while ...
et estimation = ...
, demander aux élèves de compléter les lignes 6, 7 et 8.
Le schéma de gauche montre le déplacement de la droite de balayage (droite verte). Sur le côté droit, la courbe représente les différentes valeurs prises par la variable de balayage $x$. Partant de la valeur 0, la variable x est, tant que $f(x)\leq0$, incrémentée à chaque étape de la valeur du pas. Dès que $f(x)>0$, la variable de balayage $x$ garde une valeur constante égale à la dernière valeur de $x$ pour laquelle $f(x)\leqslant 0$, qui constitue une valeur approchée par défaut de $\sqrt{2}$ à la précision souhaitée.
%matplotlib inline
import matplotlib.animation
from IPython.display import HTML
def subdivisionIntervalle(a,b,N):
pas = (b-a)/N
return [a+i*pas for i in range(N+1)]
# constantes
nbFrames = 30
nbSubdivision = 30
a = 0
b = 2
pas = (b-a)/nbSubdivision
estimations = [0]
evolutionAbscisse = subdivisionIntervalle(a,b,nbSubdivision)
# points de la courbe pour le tracé
abscisses = subdivisionIntervalle(a,b,100)
ordonnees = [f(x) for x in abscisses]
#Création des figures
fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(15, 6))
ax1.plot(abscisses,ordonnees)
ax1.plot([a,b],[0,0],'r--')
courbeVert, = ax1.plot([],[],'g--',)
courbeConvergence, = ax2.plot([],[],color="green")
#Réglage des axes
ax2.set_xlim(( 0, 2))
ax2.set_ylim((0, 2))
def init():
return (courbeVert,)
def animate(i):
x =evolutionAbscisse[i]
estim = estimations[-1]
if f(x)<=0:
estimations.append(x)
else:
ax2.plot([estim,estim],[a,b],'--',color='orange')
ax2.plot([estim+pas,estim+pas],[a,b],'--',color='orange')
return (courbeVert,)
estimations.append(estim)
courbeVert.set_data([x,x],[-2,2])
courbeConvergence.set_data(evolutionAbscisse[:i+2],estimations)
ax1.set_title("x $\simeq$ {0:.2f}".format(x))
ax2.set_title("{0:.2f} $\leq$ estimation $\leq$ {1:.2f}".format(estim+pas,estim+2*pas))
return (courbeVert,)
plt.close ()
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=nbFrames,init_func=init,interval=300)
# l'un ou l'autre
HTML(ani.to_jshtml())
#HTML(ani.to_html5_video())