1 Punkte von GN⁺ 2024-03-01 | 1 Kommentare | Auf WhatsApp teilen
  • Wenn man Formelmanipulation und Berechnungen direkt in Python-Code behandeln möchte, unterstützt SymPy sowohl die interaktive Nutzung als auch die Einbettung in Anwendungen
  • Es ist freie Software unter der BSD-Lizenz, und sowohl die Implementierungssprache als auch die benutzerseitige Sprache sind Python
  • Es hat nur eine einzige Abhängigkeit, nämlich mpmath, eine reine Python-Bibliothek für Gleitkommaoperationen mit beliebiger Präzision, wodurch Installation und Nutzung wenig Aufwand erfordern
  • Verschiedene wissenschaftliche, mathematische und Entwicklungswerkzeuge wie Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder und PyTorch TorchInductor verwenden SymPy
  • Der Einsatzbereich reicht von Tensoralgebra, Chemie, allgemeiner Relativitätstheorie, Schaltungsanalyse, Optimierung, Dynamik und Codegenerierung bis hin zur Unterstützung dynamischer Shapes und Strides

Python-basierte Bibliothek für symbolische Mathematik

  • SymPy ist eine Bibliothek für symbolische Mathematik in Python
  • Sie wird unter der BSD-Lizenz bereitgestellt und kann frei verwendet werden
  • Sie ist vollständig in Python geschrieben, und auch die in SymPy verwendete Sprache ist Python
  • Es gibt nur eine Abhängigkeit: mpmath
    • mpmath ist eine reine Python-Bibliothek für Gleitkommaoperationen mit beliebiger Präzision
  • Sie kann als interaktives Werkzeug verwendet und in andere Anwendungen eingebettet oder durch benutzerdefinierte Funktionen erweitert werden
  • Eine Funktionsübersicht findet sich unter SymPy's features

Projekte, die SymPy einsetzen

  • Die veröffentlichte Liste ist eine unvollständige Liste von Projekten, die SymPy verwenden; Ergänzungen können über die Mailingliste angefragt werden
  • Wissenschaftliches und mathematisches Rechnen

    • Cadabra: Verwendet SymPy für Skalaralgebra in Systemen für Tensoralgebra und Quantenfeldtheorie
    • ChemPy: Ein in Python geschriebenes Paket für Chemie
    • EinsteinPy: Ein Python-Paket für symbolische und numerische allgemeine Relativitätstheorie
    • OctSymPy: Ein symbolisches Paket für Octave, das SymPy verwendet
    • PyDy: Behandelt Mehrkörpersystem-Dynamik in Python
    • QMCPACK: Ein Quantum-Monte-Carlo-Projekt auf C++-Basis, das SymPy zur Erzeugung von Referenzwerten für Unit-Tests und für Teile der Codegenerierung verwendet
    • SageMath: Ein Open-Source-Mathematiksystem, das SymPy enthält
  • Entwicklungswerkzeuge und Codegenerierung

    • devito: Eine symbolische DSL und ein JIT-Compiler für High-Performance-Stencil-Berechnungen
    • Optlang: Ein Python-Paket zum Lösen mathematischer Optimierungsprobleme
    • PyTorch TorchInductor: Verwendet SymPy zur Unterstützung dynamischer Shapes und Strides
    • Spyder: Eine Entwicklungsumgebung für Scientific Python, in der sich die vollständige SymPy-Unterstützung in der IPython Console aktivieren lässt
    • symjit: Ein leichtgewichtiger JIT-Compiler für SymPy-Ausdrücke
    • yt: Ein Python-Paket für Analyse und Visualisierung volumetrischer Daten; unyt, das Einheitensystem von yt, verwendet SymPy

1 Kommentare

 
GN⁺ 2024-03-01
Meinungen auf Hacker News
  • In der Robotik arbeitet man oft mit großen Vektoren, die aus 3D-Transformationen resultieren, und muss Jacobi-Matrizen berechnen, also Ableitungen nach mehreren Zustandsvariablen; dadurch werden Ausdrücke schnell unübersichtlich.
    Mit SymPy kann man große Vektoren deklarativ erstellen, die Jacobi-Matrix berechnen und das Ergebnis direkt als C-Code exportieren, der sich im Projekt verwenden lässt.
    Wenn man zum Beispiel einen Datensatz mit Roboterpositionen und Sensorpositionen hat und die Sensorposition relativ zum Roboterzentrum schätzen möchte, kann man das überbestimmte System per Gradientenabstieg lösen; die dafür nötige Residuenfunktion und Jacobi-Matrix lassen sich mit SymPy berechnen.

    • Ähnlich habe ich SymPy einmal genutzt, um die unhandlichen Ableitungen zu verarbeiten, die für Berechnungen in der Bahndynamik nötig waren.
      Zuerst die Gleichungen aufschreiben, die lästige Mathematik SymPy überlassen und die Ausgabe anschließend in C-Code umwandeln.
      Dass man das SymPy-Projekt in echtem Produktcode nicht so oft sieht, könnte auch daran liegen, dass es für solche Zwischenberechnungen verwendet wird und am Ende nur die Ergebnisse in den Produktcode gelangen, während der Code für die symbolischen Berechnungen verworfen wird.
    • Diese Bibliothek könnte interessant sein: https://github.com/symforce-org/symforce
    • Früher habe ich gesehen, dass Leute so etwas mit Maple gemacht haben; schön, dass es inzwischen eine Open-Source-Option gibt.
      Für Robotik und Computer Vision gibt es mit symforce eine tolle Bibliothek, die SymPy für solche Aufgaben verwendet: https://github.com/symforce-org/symforce
    • Genau diese Arbeit habe ich heute beim Bau eines Tuchsimulators gemacht.
      Ich wollte die Position jedes Knotens nacheinander mit einem Newton-Schritt aktualisieren, während die anderen Knoten fixiert bleiben.
    • Ich frage mich, ob jax in Betracht gezogen wurde.
      Damit lassen sich Jacobi-Matrizen effizient berechnen, ohne Python zu verlassen; bei Bedarf kann man auch die GPU nutzen, und die API ist mit NumPy kompatibel.
  • SymPy ist wirklich großartig, und ich habe es über viele Jahre als Lehrwerkzeug verwendet.
    Der Grund, warum ich es im Vergleich zu Mathematica, Maple und Ähnlichem für die beste Wahl halte, ist, dass die API-Funktionen genau zu den Verben passen, die Studierende beim Mathematiklernen verwenden: solve, expand, factor usw.
    Ein kurzes Tutorial für den Einstieg: https://minireference.com/static/tutorials/sympy_tutorial.pd...
    Es gibt auch eine ausführbare Notebook-Version: https://colab.research.google.com/github/minireference/sympy... schreibgeschützt: http://nbviewer.ipython.org/github/minireference/sympytut_no...
    Wenn man es ohne Installation ausprobieren möchte, gibt es auch die SymPy Live Shell: https://live.sympy.org/ Dank WebAssembly laufen Python und SymPy im Browser.

    • Der größte Nachteil von SymPy ist, dass man alle Symbole vorab definieren muss.
      Wenn man von Nutzern eingegebene Formeln verarbeitet, wird es dadurch schwieriger: Man muss den Ausdruck selbst parsen, um herauszufinden, welche Variablen verwendet wurden, oder die Nutzer die Symbole manuell angeben lassen.
  • Symbolische Mathematik wird im Grundstudium stark unterbehandelt, und wenn man damit in Berührung kam, war man meist an proprietäre Software wie Mathematica oder MATLAB gebunden.
    Ich habe sie als Werkzeug kennengelernt, das die Denkweise mit Papier und Stift nur unvollständig erweitert; wenn man fortgeschrittenere Inhalte als Quellcode behandelt, wird es mit zunehmender Abstraktionstiefe instabil.
    Ich arbeite zum Beispiel in einem mathematisch/ingenieurwissenschaftlichen Bereich, der viele Tensorberechnungen erfordert, und nutze hauptsächlich Maxima, aber die entsprechenden Pakete sind begrenzt und umständlich: https://arxiv.org/pdf/cs/0503073.pdf
    Für komplexere Berechnungen nutze ich inzwischen SymPy, weniger weil die symbolische Verarbeitung an sich besser wäre, sondern wegen der Abstraktionen, die Python bereits mitbringt.
    Vielleicht lese ich eines Tages Norvigs Principles und passe Maxima an meine Bedürfnisse an; ich wäre auch an besseren Referenzen zum Maxima-Quellcode, zu Implementierungen von Tensorberechnungen oder zu symbolischen Tensoren/geometrischer Algebra interessiert.

    • Ich frage mich, ob es außer Maple eine Anwendung gibt, die WYSIWYG-Schriftsatzeingabe wie Maple unterstützt.
      Soweit ich weiß, setzen Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage usw. beim Schreiben und Eingeben mathematischer Ausdrücke alle auf schreibmaschinenartigen Text.
      Allein aus diesem Grund war Maple das Einzige, das sich für mich wirklich stimmig anfühlte: Man kann Eingaben in derselben Form machen, wie man sie von Hand schreiben würde, und ich verstehe nicht, warum diese Funktion nicht verbreiteter ist.
      Ich frage mich, ob das auch für andere eine Hürde ist.
    • Ein enger Freund erzählte oft, dass er bei Coherence ein Produktions-Notebook für optische und thermische Berechnungen mit Mathematica Notebook erstellt hatte.
      Für ihn war es wirklich ein Arbeitspferd.
      Vor sehr langer Zeit habe ich mit Derive5 herumgespielt; damals war es das billigste Computer-Algebra-System, und ich lernte Programmieren in einer seltsamen einzeiligen Programmiersprache, bei der man alle Leerzeichen entfernen und immer auf ausgewogene Klammern achten musste.
      Ich sollte die alten Dateien heraussuchen und auf GitHub stellen; eigentlich wollte ich diese Operationen in einem moderneren Computer-Algebra-System neu implementieren und die Kurven der Familie gleichlanger exponentieller Funktionen in der Nähe des Punkts (0,1) dichter zeichnen.
  • Es gibt Benchmarks zu SymPy und Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
    Den Ergebnissen zufolge konnte Mathematica 1.523 Aufgaben nicht lösen, SymPy dagegen 48.529
    Es gibt also noch einiges aufzuholen

    • SymPy ist Open Source, Mathematica nicht
      Außerdem ist SageMath, das von SymPy abhängt, eher das naheliegende Vergleichsprodukt, und auch das ist Open Source
    • Interessant ist es zwar, aber die erwähnte Website behandelt nur Integration
    • Ich frage mich, warum der Unterschied so groß ist
      Zum Beispiel würde ich gern wissen, ob es einen grundlegenden Fehler im Ansatz von SymPy gibt
  • SymPy: https://en.wikipedia.org/wiki/SymPy
    „How should logarithms be taught?“ mit Python und 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

  • Ich verwende SymPy zusammen mit https://github.com/idanpa/calcpy wie einen Taschenrechner

    • Es sieht genau nach der Form aus, nach der ich gesucht hatte
      Das Standard-SymPy empfand ich als etwas umständlich in der Benutzung
  • SymPy funktioniert sehr gut in Jupyter
    Das sind selbst erstellte SymPy-Demo-Notebooks
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... Lösen quadratischer Ausdrücke mit mehreren Variablen und schöne Ausgabe mathematischer Formeln
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... Cheat Sheet für schnell gezeichnete NumPy/pylab-Plots, inklusive SymPy-Beispielen
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... Beispiel, bei dem eine vorhandene Python-Funktion mit SymPy symbolisch differenziert wird, um ein geschlossenes Minimum zu finden
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... Grundlegende Schaltungsanalyse und elementare Analysis mit SymPy
    https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... Experimente mit MathJax-Formatierung und SymPy auf verschiedene Arten, einschließlich Analyse von Minskys Kreisalgorithmus aus HAKMEM

  • Als ich mich vor 10 Jahren für die Allgemeine Relativitätstheorie interessierte, wollte ich ein einfaches Programm schreiben, das die symbolischen Berechnungen der Einstein-Feldgleichungen verarbeitet
    Es sollte ausgehend von der Metrik die affine Verbindung, den Ricci-Tensor usw. berechnen, und da ich mit Python vertraut war, schien SymPy eine gute Wahl zu sein; es war aber schwierig, und ich bekam es nicht wirklich zum Laufen
    Mit Mathematica, das ich damals zum ersten Mal benutzte, hatte ich es in ein paar Stunden geschafft, erweiterte es danach und nutzte es später für viele Berechnungen in einem veröffentlichten Paper über schwarze Löcher
    Wie ich jetzt sehe, wurde SymPy in diesem Bereich stark weiterentwickelt, und darauf sind gute Bibliotheken entstanden: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
    Inzwischen gibt es auch ein Jupyter-Notebook-Beispiel zur Schwarzschild-Metrik: https://github.com/sympy/sympy/blob/master/examples/intermed...

    • Ein Blick auf Sage Manifolds lohnt sich: https://sagemanifolds.obspm.fr/
      Es wurde auf SageMath aufgebaut, aber soweit ich weiß, kann man auch SymPy als Rechen-Engine verwenden
  • Für einen „Physiker“, der numerische Berechnungen macht, war SymPy ein ziemlicher Retter
    Auch fortgeschrittenere Modelle lassen sich damit gut erst als Prototyp bauen und später in C++ optimieren
    Ich habe Mathematica nicht sehr viel genutzt, aber es fühlt sich immer noch so an, als sei es bei symbolischer Verarbeitung stärker als SymPy oder erfordere weniger Handarbeit
    Es wäre gut, wenn jemand mit mehr Mathematica-Erfahrung die tatsächlichen Unterschiede klar erklären könnte

    • Stephen Wolfram einmal außen vor gelassen, ist Mathematica als Computeralgebrasystem den meisten Alternativen immer noch weit voraus
      Maple ist bei manchen Integralen gut
      Der Nachteil ist, dass diese Sprachen als Allzwecksprachen nicht besonders geeignet sind, und wenn die algebraischen Umformungen, die man erledigen muss, nicht so komplex sind, möchte man lieber in einer „echten“ Sprache arbeiten
      Python ist nicht das Beste, aber gut genug nutzbar, und es ist ein weiteres Beispiel dafür, wie man vom riesigen Allzweck-Ökosystem profitiert
  • SymPy erledigt, was es soll
    Ich nutze es normalerweise innerhalb der kombinatorischen Bibliotheken von SageMath, frage mich aber, ob das immer noch der Standardweg ist oder ob SymPy inzwischen so weit gekommen ist, dass man es auch eigenständig verwenden kann

    • SageMath sieht großartig aus, aber etwas abschreckend ist, dass es mehrere bestehende Tools kombiniert, die jeweils ihre eigene Syntax haben und deren Funktionen sich überschneiden
      Denn wegen der fehlenden internen Konsistenz könnte die Arbeitsweise ziemlich uneinheitlich sein
      Ich würde gerne wissen, wie sich das in der Praxis tatsächlich anfühlt