- 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
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.
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.
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
Ich wollte die Position jedes Knotens nacheinander mit einem Newton-Schritt aktualisieren, während die anderen Knoten fixiert bleiben.
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.
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.
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.
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
Außerdem ist SageMath, das von SymPy abhängt, eher das naheliegende Vergleichsprodukt, und auch das ist Open Source
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
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...
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
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
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