Calculer avec des unités sous Python

Source

Un des inconvénients de la programmation “mathématique” de grandeurs physiques est la difficulté de suivre les grandeurs utilisées au fil des variables et des calculs et donc d’assurer la cohérence du système d’unité et des multiples et sous-multiples utilisés. Habituellement, ceci passe par un lourd système de commentaires, peu efficace pour détecter les erreurs. Il apparaît donc pertinent de déclarer explicitement les unités des variables utilisées afin d’en assurer la traçabilité.

Cette pratique offre trois autres avantages :

  1. la possibilité de convertir à la volée les grandeurs d’un système d’unité à l’autre (vital en Amérique du Nord où le système métrique cohabite avec le système impérial et provoque un crash de sonde spatial par décennie à cause de soucis d’unités)
  2. la possibilité de débugguer un algorithme par les dimensions des résultats et les erreurs renvoyées en cas de tentatives d’opération illicites sur des grandeurs différentes
  3. la possibilité de programmer avec des grandeur sans se soucier de les convertir à chaque étape dans le bon multiple.

Il existe différents modules Pythons pour venir à bien de cette tâche, présentés dans la vidéo ci-dessus, chacun ayant leurs forces et leurs faiblesses, et une intégration plus ou moins fine avec Numpy, qui est la base du calcul numérique sous Python. J’ai choisi – comme l’auteur de la présentation – quantities pour ce faire, et je vais vous présenter un cas réel commenté : la conception d’un engrenage (dimension et résistance des matériaux)

Exemple et code source

L’exemple ci-dessous est typique de l’ingénierie nord-américaine : on doit dimensionner un train d’engrenages en fonction de puissance à transmettre et de la vitesse de sortie, puis calculer le coefficient de sécurité de l’ensemble (contrainte mécanique dans l’acier). On doit déterminer le rayon des roues, le nombre de dents, et la largeur des dents. Mais si les constantes physiques et les propriétés des matériaux sont en SI, les données du problème sont en impérial (dimensions en pouces) et en SI (puissance en watts). On veut donc gérer la cohérence des résultats en gardant la traçabilité des grandeurs et en évitant les erreurs de conversion.

Sortie

Commentaires

Sur la procédure de calcul, on remarque aux sections Dimension du pignon et Dimension de la roue que les calculs étant les mêmes, le code a été factorisé en passant par une classe. C’est l’une des beautés de la programmation scientifique orientée objet qui est grandement facilitée avec Python, et plus complexe – quoique possible – sous Matlab par exemple.

Sur les unités, on peut vérifier la cohérences des résultats, y compris sur les rapports de transmission sans dimension.

Cependant, on remaque un problème de calcul sur la variable W_T (section Résistance en flexion) dont la dimension est hp/(ft*rpm) en raison du facteur de correction 33000 sans unité précisée. Ainsi W_T est homogène à des livres force mais le passage dans cette unité via le module quantities introduit des constantes de conversion déjà prises en compte dans le 33 000. Le problème se propage à F. Note : La valeur 33000 a été reprise telle quelle d’un corrigé qui ne mentionnait pas sa dimension ni son origine (Car les formules de dimensionnement d’éléments de machines relèvent parfois de la sorcellerie).

À cette exception près (qui mériterait seulement un retour à la documentation), on remarque que le passage d’un système d’unités à l’autre est presque indolore.

References   [ + ]

1.Z_2_m,i_m
2.Z_2_m,C_d
2018-05-26T17:15:33+00:0025 novembre 2015|Catégories : Calcul scientifique|Mots-clés : , |Commentaires fermés sur Calculer avec des unités sous Python

À propos de l'auteur :

J'écris parce que ça m'aide à réfléchir. Je publie pour que ça serve. Spécialiste calcul et modélisation thermodynamique chez Cellier Domesticus. Photographe. Pianiste. Développeur spécialisé en Python pour le calcul et la modélisation. Auteur de bouquins et de blog sur les sciences et la technologie. Expériences précédentes dans la fonction publique territoriale, les moteurs électriques industriels, les voitures solaires en fibre de carbone et le non-sens académique (maths sup, DUT).
non consectetur porta. in quis Donec dolor adipiscing Lorem