1 points par GN⁺ 2024-03-01 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2024-03-01
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.

    • De manière similaire, j’ai déjà utilisé SymPy pour gérer les dérivées pénibles nécessaires à des calculs de mécanique orbitale.
      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é.
    • Cette bibliothèque pourrait vous intéresser : https://github.com/symforce-org/symforce
    • Autrefois, j’ai vu des gens faire ce genre de choses avec Maple ; c’est agréable d’avoir maintenant une option open source.
      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
    • J’ai justement fait ça aujourd’hui en construisant un simulateur de tissu.
      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.
    • Je me demande si vous avez envisagé jax.
      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.

    • Le plus gros défaut de SymPy est qu’il faut définir tous les symboles à l’avance.
      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é.

    • Je me demande s’il existe, en dehors de Maple, des applications qui prennent en charge la saisie typographiée telle qu’elle apparaît à l’écran, comme Maple.
      À 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.
    • Un ami proche disait souvent qu’à Coherence, il avait créé des notebooks de production en Mathematica Notebook pour effectuer des calculs optiques et thermiques.
      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

    • SymPy est open source, contrairement à Mathematica
      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
    • C’est intéressant, mais le site mentionné ne traite que de l’intégration
    • Je me demande d’où vient un écart aussi important
      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

    • Ça ressemble exactement à la forme que je cherchais
      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...

    • Ça vaut le coup de regarder Sage Manifolds : https://sagemanifolds.obspm.fr/
      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

    • Même en mettant Stephen Wolfram de côté, Mathematica reste très en avance sur la plupart des alternatives comme système de calcul formel
      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

    • SageMath a l’air chouette, mais le fait que ce soit un assemblage de plusieurs outils existants, chacun avec sa propre syntaxe et des fonctionnalités qui se recoupent, me rebute un peu
      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