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é.
y = 5.
x ∈ [ 1 ; 6 ]
Pour quelle valeur de x celle de y vaut 3?
On demande d'écrire deux programmes :
matplotlib.pyplot, rangera les valeurs de x ou y dans des listes.
Numpy.
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))
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 |
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))
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 |
La console affiche :
Pour y = 3 on a x = 4.93