SciPy : équations, intégrales et ajustement
Ce que ce chapitre apporte 5 points
- Situer les sous-modules de SciPy, et savoir lequel ouvrir devant un problème donné.
- Trouver le zéro d'une fonction, et comprendre ce que fait la méthode derrière l'appel.
- Calculer une intégrale définie, et lire l'estimation d'erreur qui l'accompagne.
- Ajuster un modèle sur des mesures et en récupérer les paramètres.
- Résoudre une équation différentielle avec odeint, en passant par le vecteur d'état.
NumPy fournit les tableaux, Matplotlib les courbes. Il manque encore les méthodes : trouver le zéro d'une fonction dont aucune formule ne donne la racine, calculer une intégrale qui n'a pas de primitive, ajuster un modèle sur des relevés, prédire l'évolution d'un système régi par des lois de Newton.
C'est le domaine de SciPy, et son principe tient en une phrase : quand le calcul exact n'existe pas ou ne se mène pas, on approche le résultat aussi près qu'on le souhaite, et on mesure de combien on s'est approché.
Ce que cette bibliothèque résout numériquement, le parcours de mathématiques l'étudie à la main : l'étude d'une fonction pour trouver un zéro ou un extremum, et les équations différentielles pour les résoudre quand une formule existe.
Les figures s'affichent dans la page. NumPy, Matplotlib et SciPy sont installés dans l'éditeur du navigateur : l'image apparaît sous le code après exécution. Ces exemples fonctionnent à l'identique sur une machine.
Une bibliothèque, des sous-modules
SciPy ne s'importe presque jamais en entier. On ouvre le tiroir dont on a besoin :
| Sous-module | Ce qu'il résout | Fonction d'entrée |
|---|---|---|
scipy.optimize | zéros, minimums, ajustement de modèle | brentq, minimize, curve_fit |
scipy.integrate | intégrales, équations différentielles | quad, odeint |
scipy.interpolate | valeurs entre des points mesurés | interp1d |
scipy.signal | filtrage, spectre, convolution | butter, filtfilt |
scipy.stats | lois de probabilité, tests | norm, linregress |
Tous partagent une habitude qui vaut d'être notée tout de suite : une fonction numérique renvoie un résultat et, souvent, de quoi le juger. Une estimation d'erreur, un indicateur de convergence, une matrice de covariance. Ignorer cette seconde sortie est la faute la plus courante du calcul scientifique.
Trouver un zéro
Beaucoup d'équations d'ingénieur n'ont aucune solution exprimable. Le débit dans une conduite, le point de fonctionnement d'un transistor, l'angle d'équilibre d'un mécanisme : dans tous ces cas, l'équation se met sous la forme et se résout numériquement.
Le principe le plus répandu est la méthode de Newton : depuis un point, suivre la tangente jusqu'à l'axe des abscisses, et recommencer depuis le point d'arrivée. La tangente est la meilleure droite qui ressemble à la courbe, donc son zéro est une bien meilleure estimation que le point de départ.
| x | f |
|---|---|
| 1,2 | -5,672 |
| 1,29 | -5,4333 |
| 1,38 | -5,1319 |
| 1,47 | -4,7635 |
| 1,56 | -4,3236 |
| 1,65 | -3,8079 |
| 1,74 | -3,212 |
| 1,83 | -2,5315 |
| 1,92 | -1,7621 |
| 2,01 | -0,8994 |
| 2,1 | 0,061 |
| 2,19 | 1,1235 |
| 2,28 | 2,2924 |
| 2,37 | 3,5721 |
| 2,46 | 4,9669 |
| 2,55 | 6,4814 |
| 2,64 | 8,1197 |
| 2,73 | 9,8864 |
| 2,82 | 11,7858 |
| 2,91 | 13,8222 |
| 3 | 16 |
En pratique, on n'écrit pas Newton à la main. brentq fait mieux : il combine plusieurs méthodes et garantit de trouver un zéro, à condition de lui donner un intervalle où la fonction change de signe.
La vérification de la dernière ligne n'est pas une coquetterie : elle est le seul élément qui distingue un zéro d'un nombre quelconque. Un solveur numérique rend toujours une valeur, même quand il a convergé vers autre chose que ce qu'on cherchait.
brentq réclame un intervalle où la fonction change de signe. Pourquoi ?
Calculer une intégrale définie
Beaucoup de fonctions n'ont pas de primitive exprimable : , la plus célèbre, gouverne pourtant toute la statistique. L'aire sous sa courbe se calcule quand même, en la découpant.
| x | f |
|---|---|
| 0 | 1 |
| 0,11 | 0,988 |
| 0,22 | 0,9528 |
| 0,33 | 0,8968 |
| 0,44 | 0,824 |
| 0,55 | 0,739 |
| 0,66 | 0,6469 |
| 0,77 | 0,5527 |
| 0,88 | 0,461 |
| 0,99 | 0,3753 |
| 1,1 | 0,2982 |
| 1,21 | 0,2313 |
| 1,32 | 0,1751 |
| 1,43 | 0,1294 |
| 1,54 | 0,0933 |
| 1,65 | 0,0657 |
| 1,76 | 0,0452 |
| 1,87 | 0,0303 |
| 1,98 | 0,0198 |
| 2,09 | 0,0127 |
| 2,2 | 0,0079 |
somme des rectangles 0,88241 · aire exacte 0,88208 · écart 0,000328
quad mène automatiquement, avec des découpes bien plus habiles que des rectangles égaux.
Le second résultat est la raison d'être de quad. Une erreur estimée de l'ordre de autorise à faire confiance aux dix premières décimales ; une erreur de l'ordre de signale que la fonction a malmené la méthode, et qu'il faut découper l'intervalle ou en changer.
scipy.integrate.quad sert à quoi ?
Ajuster un modèle sur des mesures
Le chapitre sur Matplotlib traçait des relevés et un modèle côte à côte, avec des coefficients choisis à la main. curve_fit les calcule : il cherche les paramètres qui rapprochent le plus le modèle des points, au sens des moindres carrés.
L'argument p0 donne une estimation de départ. Il n'est pas facultatif en pratique : sur un modèle exponentiel, un point de départ absurde fait converger l'algorithme vers un minimum local qui ne ressemble à rien, sans le moindre message d'erreur.
La matrice covariance est la sortie qu'il ne faut pas jeter. La racine de sa diagonale donne l'incertitude sur chaque paramètre, et c'est elle qui permet d'écrire « τ = 0,198 ± 0,004 s » plutôt qu'un nombre nu dont personne ne sait s'il vaut trois décimales ou une.
Prédire une évolution : les équations différentielles
Les lois de Newton, , relient une accélération aux forces. Ce sont des équations différentielles, et dès que des frottements ou une géométrie un peu riche apparaissent, aucune formule ne donne la trajectoire. Il reste à l'avancer pas à pas.
odeint, du module scipy.integrate, fait exactement cela. Son raisonnement ne contient aucune physique : il ne connaît que la pente.
| Ce que le solveur sait | Ce qu'il en fait |
|---|---|
| l'état à l'instant courant | il le donne au modèle |
| la dérivée que le modèle renvoie | il en déduit l'état un instant plus tard |
| l'instant suivant | il recommence |
La fonction modèle ne calcule donc jamais la solution. Elle répond à une seule question, toujours la même : « dans cet état, à cet instant, comment chaque grandeur varie-t-elle ? ». C'est la traduction directe de l'équation, ligne pour ligne.
Syntaxe : solution = odeint(modele, etat_initial, instants)
modele: la fonction qui renvoie les dérivées, dans l'ordre des grandeurs de l'état.etat_initial: la valeur de chaque grandeur à l'instant de départ.instants: le tableau des instants où la réponse est souhaitée, fabriqué parlinspace.
Le vecteur d'état
Un solveur ne sait résoudre que des équations du premier ordre, de la forme . Or la mécanique en produit du second, puisqu'elle porte sur une accélération.
L'astuce consiste à empiler la position et la vitesse dans un seul vecteur, appelé vecteur d'état :
Les deux lignes de n'ont pas le même statut, et c'est ce qui rend l'astuce si simple :
- la dérivée de la position est la vitesse, par définition, donc la première ligne se recopie depuis l'état ;
- la dérivée de la vitesse est l'accélération, que Newton donne : .
Une équation du second ordre est ainsi devenue un système de deux équations du premier. Le même mécanisme couvre ensuite n'importe quel système couplé : il suffit d'allonger le vecteur.
Attention : l'ordre des grandeurs dans le vecteur est une convention choisie par celui qui écrit, et elle doit être respectée aux trois endroits : à la construction de l'état initial, dans le modèle, et à la lecture du résultat. La majorité des simulations fausses viennent d'une inversion entre ces trois endroits, et le solveur ne la signale jamais.
Le pas de temps n'est pas celui qu'on croit
Le tableau instants donne les dates où l'on veut lire la réponse, pas celles où le solveur calcule. odeint choisit son propre pas interne, le raccourcit là où la solution varie vite, et l'allonge ailleurs.
La conséquence est utile : demander mille points de sortie au lieu de cent ne rend pas la simulation plus juste, seulement plus détaillée à l'affichage. Ce qui la rend juste est la tolérance du solveur, réglable par rtol et atol. Et quand une solution diverge brutalement alors que le problème est physique, c'est le signe d'un système raide, où une grandeur évolue mille fois plus vite qu'une autre : il faut alors un solveur prévu pour cela, comme solve_ivp(..., method="Radau").
Résoudre une équation du premier ordre
Prenons l'exemple du boulet de canon ou d'une chute avec frottement.
Supposons l'équation : .
Voici la structure obligatoire d'un script de résolution :
Pour résoudre une équation différentielle du second ordre avec un solveur, que faut-il faire d'abord ?
Passer au second ordre : le pendule
Pour le pendule (et le planeur), on a une position et une vitesse. Le vecteur a donc deux cases.
L'équation du pendule est : .
Un solveur rend une solution qui diverge brutalement alors que le problème est physique. La cause la plus probable ?
Un système complet : le planeur
Pour un planeur, le mouvement se fait en X et en Y. On a donc 4 variables à suivre simultanément :
La fonction Sp devra donc retourner 4 valeurs :
C'est exactement la même logique, mais avec plus de lignes.
Lire le résultat. La solution rendue par odeint est un tableau à deux dimensions : une ligne par instant, une colonne par grandeur du vecteur d'état. Le découpage NumPy en extrait une colonne entière :
S[:, 0]sera toutes les positions x(t)S[:, 1]sera toutes les altitudes y(t)
La trajectoire, c'est-à-dire la forme du vol, se trace alors en portant l'altitude contre la distance : plt.plot(S[:, 0], S[:, 1]). Porter l'altitude contre le temps donnerait une autre figure, tout aussi juste et répondant à une autre question, celle de la vitesse de descente.
Pourquoi vérifier un résultat numérique sur un cas dont la solution exacte est connue ?
Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?
Mettre en pratique
Intégrer une équation différentielle et lire la valeur atteinte au bout du temps voulu.
- Débogage : le solveur refuse l'intervalle4 · Avancé
- Trouver un zéro qu'aucune formule ne donne3 · Confirmé
- Une aire sans primitive3 · Confirmé
- Ajuster une droite sur des mesures4 · Avancé
- La tension d'un condensateur4 · Avancé