SymPy, les mathématiques symboliques en Python
(sympy.org)- Si vous souhaitez manipuler et calculer des formules directement dans du code Python, SymPy prend en charge à la fois l’usage interactif et l’intégration dans des applications
- C’est un logiciel gratuit proposé sous licence BSD, et son langage d’implémentation comme son langage côté utilisateur sont tous deux Python
- Sa seule dépendance est mpmath, une bibliothèque Python pure pour les opérations en virgule flottante à précision arbitraire, ce qui en facilite l’installation et l’utilisation
- De nombreux outils scientifiques, mathématiques et de développement utilisent SymPy, notamment Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder et PyTorch TorchInductor
- Son champ d’application s’étend largement, de l’algèbre tensorielle à la chimie, en passant par la relativité générale, l’analyse de circuits, l’optimisation, la dynamique, la génération de code, ainsi que la prise en charge des shape et stride dynamiques
Bibliothèque de mathématiques symboliques basée sur Python
- SymPy est une bibliothèque destinée aux mathématiques symboliques en Python
- Elle est proposée sous licence BSD et peut être utilisée librement
- Elle est entièrement écrite en Python, et le langage utilisé dans SymPy est également Python
- Elle n’a qu’une seule dépendance : mpmath
- mpmath est une bibliothèque Python pure pour les opérations en virgule flottante à précision arbitraire
- Elle peut être utilisée comme outil interactif et peut aussi être intégrée à d’autres applications ou étendue avec des fonctions personnalisées
- La liste de ses fonctionnalités est disponible sur SymPy's features
Projets ayant adopté SymPy
- La liste publiée est une liste incomplète des projets utilisant SymPy, et l’ajout d’un projet peut être demandé via la mailing list
-
Domaine du calcul scientifique et mathématique
- Cadabra : utilise SymPy pour l’algèbre scalaire dans les systèmes d’algèbre tensorielle et de théorie quantique des champs
- ChemPy : package de chimie écrit en Python
- EinsteinPy : package Python pour la relativité générale symbolique et numérique
- OctSymPy : package symbolique pour Octave utilisant SymPy
- PyDy : traite la dynamique multicorps en Python
- QMCPACK : projet Quantum Monte Carlo en C++ qui utilise SymPy pour générer des valeurs de référence pour les tests unitaires et pour une partie de la génération de code
- SageMath : système mathématique open source qui inclut SymPy
-
Outils de développement et génération de code
- devito : DSL symbolique et compilateur JIT pour les calculs stencil haute performance
- Optlang : package Python pour résoudre des problèmes d’optimisation mathématique
- PyTorch TorchInductor : utilise SymPy pour la prise en charge des shape et stride dynamiques
- Spyder : environnement de développement Scientific Python, dans lequel il est possible d’activer la prise en charge complète de SymPy dans la console IPython
- symjit : compilateur JIT léger pour les expressions SymPy
- yt : package Python pour l’analyse et la visualisation de données volumiques, dont le système d’unités unyt utilise SymPy
1 commentaires
Avis sur Hacker News
En robotique, on utilise souvent de grands vecteurs issus de transformations 3D, et il faut fréquemment calculer des jacobiennes, c’est-à-dire des dérivées par rapport à plusieurs variables d’état, ce qui rend vite les expressions très brouillonnes.
Avec SymPy, on peut construire de grands vecteurs de façon déclarative, calculer les jacobiennes, puis exporter directement le résultat en code C utilisable dans le projet.
Par exemple, si l’on dispose d’un jeu de données de positions du robot et des capteurs, et que l’on veut estimer la position des capteurs par rapport au centre du robot, on peut résoudre ce système surcontraint par descente de gradient ; la fonction de résidu et la jacobienne nécessaires peuvent alors être calculées avec SymPy.
L’idée était d’écrire d’abord les équations, de laisser SymPy se charger des maths fastidieuses, puis de convertir la sortie en code C.
Si le projet SymPy se voit peu dans du code produit réel, c’est peut-être justement parce qu’il sert à ces calculs intermédiaires : seul le résultat finit dans le code produit, tandis que le code de calcul symbolique est jeté.
Dans la robotique et la vision par ordinateur, il existe une excellente bibliothèque qui fait ce travail avec SymPy : symforce https://github.com/symforce-org/symforce
Je voulais essayer de mettre à jour, l’une après l’autre, la position de chaque nœud par une étape de Newton, en gardant les autres nœuds fixes.
Il permet de calculer efficacement les jacobiennes sans quitter Python ; on peut aussi utiliser le GPU si on le souhaite, et son API est compatible avec NumPy.
SymPy est vraiment excellent, et je l’utilise depuis des années comme outil pédagogique.
La raison pour laquelle je le considère comme le meilleur choix par rapport à Mathematica, Maple, etc., c’est que les fonctions de l’API correspondent exactement aux verbes que les étudiants utilisent en apprenant les maths : solve, expand, factor, par exemple.
Un court tutoriel pour démarrer : https://minireference.com/static/tutorials/sympy_tutorial.pd...
Il existe aussi une version sous forme de notebook exécutable : https://colab.research.google.com/github/minireference/sympy... en lecture seule : http://nbviewer.ipython.org/github/minireference/sympytut_no...
Si vous voulez l’essayer sans installation, il y a aussi le shell live de SymPy : https://live.sympy.org/ Grâce à WebAssembly, Python et SymPy s’exécutent dans le navigateur.
Quand on traite une expression saisie par l’utilisateur, cela complique les choses : il faut soit parser soi-même l’expression pour déterminer quelles variables sont utilisées, soit demander à l’utilisateur de fournir manuellement les symboles.
Les mathématiques symboliques sont gravement sous-représentées en licence ; et lorsqu’on y est exposé, c’est généralement via des logiciels propriétaires comme Mathematica ou MATLAB.
Je les ai apprises comme des outils prolongeant imparfaitement la manière de penser au papier-crayon, et quand on traite des sujets plus avancés en code source, cela devient instable à mesure que les abstractions s’approfondissent.
Par exemple, je travaille dans un domaine des maths/de l’ingénierie qui demande beaucoup de calcul tensoriel ; j’utilise surtout Maxima, mais les paquets associés sont limités et pénibles : https://arxiv.org/pdf/cs/0503073.pdf
Pour les calculs plus complexes, j’utilise désormais SymPy, non pas tant parce que son traitement symbolique serait meilleur, mais grâce aux abstractions que Python possède déjà.
Un jour, je lirai peut-être les Principles de Norvig et j’adapterai Maxima à mes besoins ; et s’il existe de meilleures références sur le code source de Maxima, ses implémentations de calcul tensoriel, ou les tenseurs symboliques / l’algèbre géométrique, je serais intéressé.
À ma connaissance, Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage, etc. reposent tous sur du texte tapé au clavier pour écrire et saisir des formules mathématiques.
C’est pour cette seule raison que Maple a été le seul à vraiment me parler : on peut saisir les expressions sous la même forme qu’à la main, et je ne comprends pas pourquoi cette fonctionnalité n’est pas plus répandue.
Je me demande si c’est aussi un obstacle pour d’autres personnes.
Pour lui, c’était vraiment un outil de travail fiable.
Il y a très longtemps, je m’amusais avec Derive5 : c’était alors le système de calcul formel le moins cher, et j’y ai appris à programmer dans une étrange langue de programmation en une seule ligne, où il fallait supprimer tous les espaces et toujours faire attention à l’équilibrage des parenthèses.
Il faudrait que je retrouve ces vieux fichiers et que je les mette sur GitHub ; j’aimerais en fait réimplémenter ces opérations dans un système de calcul formel plus moderne, afin de tracer plus densément la famille de courbes exponentielles de longueur égale près du point (0,1).
Il existe un benchmark comparant SymPy et Mathematica : https://www.12000.org/my_notes/CAS_integration_tests/reports...
D’après les résultats, Mathematica n’a pas résolu 1 523 problèmes, tandis que SymPy en a échoué 48 529
Il reste donc encore pas mal de terrain à rattraper
De plus, SageMath, qui dépend de SymPy, est un produit qui se prête davantage à la comparaison, et il est lui aussi open source
Par exemple, j’aimerais savoir si l’approche de SymPy présente un défaut fondamental
SymPy : https://en.wikipedia.org/wiki/SymPy
“How should logarithms be taught?” avec Python et SymPy : https://news.ycombinator.com/item?id=28518565#28519356
“SymPy - a Python library for symbolic mathematics” (2020) : https://news.ycombinator.com/item?id=23767513
NumPy for Matlab users : https://numpy.org/doc/stable/user/numpy-for-matlab-users.htm...
SymPy vs Matlab : https://github.com/sympy/sympy/wiki/SymPy-vs.-Matlab
J’utilise SymPy comme une calculatrice avec https://github.com/idanpa/calcpy
J’avais trouvé SymPy de base un peu pénible à utiliser
SymPy fonctionne très bien dans Jupyter
Voici des notebooks de démo SymPy que j’ai créés
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... résolution de formes quadratiques à plusieurs variables et joli rendu des formules mathématiques
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... aide-mémoire pour tracer rapidement des graphiques NumPy/pylab, avec des exemples SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... exemple utilisant SymPy pour dériver symboliquement une fonction Python existante et trouver un minimum sous forme fermée
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... analyse de circuits de base et calcul différentiel/intégral élémentaire avec SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... explorations de la mise en forme MathJax et de SymPy de plusieurs façons, avec une analyse de l’algorithme du cercle de Minsky de HAKMEM
Il y a 10 ans, quand je m’intéressais à la relativité générale, je voulais créer un petit programme capable de gérer les calculs symboliques des équations de champ d’Einstein
L’idée était de partir de la métrique et de calculer la connexion affine, le tenseur de Ricci, etc. Comme je connaissais bien Python, SymPy semblait être un bon choix, mais c’était difficile et je n’ai pas réussi à obtenir quelque chose qui fonctionne réellement
Avec Mathematica, que j’utilisais alors pour la première fois, j’y suis arrivé en quelques heures, puis je l’ai étendu et m’en suis servi plus tard pour de nombreux calculs dans un article sur les trous noirs que j’ai publié
En vérifiant maintenant, je vois que SymPy a beaucoup progressé dans ce domaine et que de bonnes bibliothèques ont été créées par-dessus : https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
Il existe désormais aussi un exemple de notebook Jupyter manipulant la métrique de Schwarzschild : https://github.com/sympy/sympy/blob/master/examples/intermed...
C’est construit sur SageMath, mais il me semble qu’on peut aussi utiliser SymPy comme moteur de calcul
Pour un « physicien » qui fait du calcul numérique, SymPy a vraiment eu quelque chose de salvateur
C’est aussi pratique pour prototyper d’abord des modèles plus avancés, puis les optimiser ensuite en C++
Je n’ai pas beaucoup utilisé Mathematica, mais j’ai toujours l’impression qu’il reste plus puissant que SymPy en calcul symbolique, ou qu’il demande moins d’efforts
Ce serait bien que quelqu’un ayant davantage d’expérience avec Mathematica explique clairement les différences concrètes
Maple est bon pour certaines intégrales
L’inconvénient, c’est que ces langages ne sont pas vraiment adaptés comme langages généralistes, et quand les manipulations algébriques à effectuer ne sont pas si complexes, on a envie de travailler dans un « vrai » langage
Python n’est pas le meilleur, mais il est largement utilisable, et c’est un autre exemple des avantages qu’apporte son immense écosystème généraliste
SymPy fait ce qu’il est censé faire
Je l’utilise généralement dans la bibliothèque de combinatoire de SageMath, mais je me demande si c’est encore la voie classique, ou si SymPy a désormais suffisamment évolué pour être utilisé seul
J’ai l’impression que le manque de cohérence interne doit rendre les façons de travailler assez irrégulières
Je serais curieux de savoir comment cela se ressent en pratique