PYTHON
METHODES NUMERIQUES
EXEMPLE THEORIQUE

Mise en situation

Les problèmes techniques apportent régulièrement des équations à résoudre. Si certaines s'abordent aisément, d'autres ne trouvent pas, ou difficilement, de solution mathématique exacte. Une solution approchée, à l'aide de l'informatique, s'impose alors.

L'objectif ici est de résoudre une équation non linéaire à une inconnue.

Différents algorithmes, comme ceux de Newton, de Muller ou de Brent, recherchent l'efficacité. Toutefois, obtenir un résultat en 5 ms au lieu de 100 ms, par exemple, ne présente ici guère d'intérêt. La solution mise en œuvre, inutilement optimisée, se tournera vers la simplicité.

Hypothèses et données

L'équation

y = 5.xx23

Valeurs limites de x

x ∈ [ 1 ; 6 ]

Problème

Pour quelle valeur de x celle de y vaut 3?

Etude demandée

Principe de résolution

Programmes à réaliser

On demande d'écrire deux programmes :

Compte rendu

Solution sans Numpy

Programme

import matplotlib.pyplot as plt

def y(x) :
  return 5*x**0.5-x**2/3

liste_x=[]
x=1
while x<=6 :
  liste_x+=[x]
  x+=0.01
"""
for i in range(500) :
  liste_x+=[1+i/100]
"""

liste_y=[]
for x in liste_x:
  liste_y+=[y(x)]

plt.grid()
plt.plot(liste_x, liste_y)
plt.show()

liste_ecarts=[]
for y in liste_y :
  liste_ecarts+=[abs(y-3)]
ecart_min=min(liste_ecarts)
index=liste_ecarts.index(ecart_min)
x_rech=liste_x[index]

print("Pour y = 3 on a x =", round(x_rech,3))

Explications

Ligne(s)Commentaire
5 à 10 Création d'une liste contenant un grand nombre de valeurs pour x
12 et 13 En commentaire une variante pour la liste des valeurs de x
16 à 18 Calcul de y pour chaque valeur de x et création d'une liste de valeurs pour y
20 à 22 Visualisation de y en fonction de x, à l'aide de la bibliothèque Matplotlib, pour obtenir un ordre de grandeur de la valeur recherchée
24 à 26 Création d'une liste de valeurs pour l'écart entre y(x) et 3
27 Valeur la plus petite, nulle ou proche de zéro, pour cet écart
28 Index de la valeur recherchée
29 Valeur de x recherchée
31 Affichage du résultat avec trois chiffres après la virgule

Solution avec Numpy

Programme

import matplotlib.pyplot as plt
import numpy as np

def y(x) :
  return 5*x**0.5-x**2/3

tab_x=np.arange(1,6,0.01)
tab_y=y(tab_x)

plt.grid()
plt.plot(tab_x, tab_y)
plt.show()

ecart=abs(tab_y-3)
liste_ecarts=list(ecart)
liste_x=list(tab_x)
ecart_min=min(liste_ecarts)  # ecart_min=np.min(ecart)
index=liste_ecarts.index(ecart_min)
x_rech=liste_x[index]

print("Pour y = 3 on a x =", fround(x_rech,3))

Explications

Ligne(s)Commentaire
7 Création d'un tableau, selon Numpy, contenant un grand nombre de valeurs pour x
8 Création d'un tableau avec les valeurs de y
10 à 12 Matplotlib fonctionne avec les listes mais aussi avec les tableaux de Numpy
14 Création d'un tableau avec les écarts entre y(x) et 3
15 et 16 Conversion des tableaux en listes pour effectuer les recherches en Python
17 à 21 Même code que précédemment

Conclusion

Courbe obtenue

Résultat

La console affiche :

Pour y = 3 on a x = 4.93