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)

Code source

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.[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

References   [ + ]

1.Z_2_m,i_m
2.Z_2_m,C_d
2016-10-14T18:21:53+00:00 25 novembre 2015|Catégories : Calcul scientifique|Mots-clés : , |Commentaires fermés sur Calculer avec des unités sous Python

À propos de l'auteur :

Humain du XXe siècle et citoyen vigilant. Étudiant ingénieur mécatronicien. Technicien supérieur en mesures physiques. Collaborateur R&D en modélisation thermodynamique, calcul et contrôle thermique dans une start-up. Photographe. Pianiste. Développeur et libriste. Expériences précédentes dans la fonction publique territoriale (Conseil Régional Rhônes-Alpes), les moteurs électriques industriels (General Electric) et les voitures solaires en fibre de carbone (Esteban). Une journée passée sans créer est une journée perdue.