- Si quieres manipular y calcular expresiones directamente dentro de código Python, SymPy admite tanto el uso interactivo como su integración dentro de aplicaciones
- Es software libre ofrecido bajo licencia BSD, y tanto el lenguaje de implementación como el lenguaje de cara al usuario son Python
- Su única dependencia es mpmath, una biblioteca Python pura para operaciones de punto flotante de precisión arbitraria, por lo que instalarlo y usarlo implica poca carga
- Varias herramientas científicas, matemáticas y de desarrollo usan SymPy, como Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder y PyTorch TorchInductor
- Su rango de uso se extiende ampliamente: álgebra tensorial, química, relatividad general, análisis de circuitos, optimización, dinámica, generación de código y soporte para shapes y strides dinámicos
Biblioteca de matemáticas simbólicas basada en Python
- SymPy es una biblioteca para trabajar con matemáticas simbólicas en Python
- Se ofrece bajo licencia BSD, por lo que puede usarse libremente
- Está escrita íntegramente en Python, y el lenguaje que se usa en SymPy también es Python
- Su única dependencia es mpmath
- mpmath es una biblioteca Python pura para operaciones de punto flotante de precisión arbitraria
- Puede usarse como herramienta interactiva, e integrarse en otras aplicaciones o extenderse con funciones definidas por el usuario
- La lista de funcionalidades puede consultarse en SymPy's features
Proyectos que adoptaron SymPy
- La lista publicada es una lista incompleta de proyectos que usan SymPy, y se puede solicitar agregar proyectos mediante la lista de correo
-
Áreas de cálculo científico y matemático
- Cadabra: usa SymPy para álgebra escalar en sistemas de álgebra tensorial y teoría cuántica de campos
- ChemPy: es un paquete para química escrito en Python
- EinsteinPy: es un paquete de Python para relatividad general simbólica y numérica
- OctSymPy: es un paquete simbólico para Octave que usa SymPy
- PyDy: trata la dinámica multicuerpo en Python
- QMCPACK: es un proyecto de Quantum Monte Carlo basado en C++ que usa SymPy para generar valores de referencia en pruebas unitarias y para parte de la generación de código
- SageMath: es un sistema matemático open source que incluye SymPy
-
Herramientas de desarrollo y generación de código
- devito: es un DSL simbólico y compilador JIT para cálculos de stencil de alto rendimiento
- Optlang: es un paquete de Python para resolver problemas de optimización matemática
- PyTorch TorchInductor: usa SymPy para soportar shapes y strides dinámicos
- Spyder: es un entorno de desarrollo Scientific Python, y permite activar soporte completo de SymPy en la IPython Console
- symjit: es un compilador JIT liviano para expresiones de SymPy
- yt: es un paquete de Python para análisis y visualización de datos volumétricos, y unyt, el sistema de unidades de yt, usa SymPy
1 comentarios
Opiniones de Hacker News
En robótica se suelen usar vectores grandes resultantes de transformaciones 3D, y muchas veces hay que calcular el jacobiano, que es la derivada respecto de varias variables de estado, así que las expresiones se vuelven desordenadas muy rápido.
Con SymPy se puede construir un vector grande de forma declarativa, calcular el jacobiano y luego exportar el resultado directamente como código C listo para usar en el proyecto.
Por ejemplo, si tienes un conjunto de datos con la posición del robot y la posición de los sensores, para estimar la posición del sensor respecto del centro del robot puedes resolver un sistema sobredeterminado con descenso por gradiente, y la función de residuos y el jacobiano necesarios se pueden calcular con SymPy.
Primero escribía las ecuaciones, dejaba que SymPy se encargara de la matemática tediosa y luego convertía la salida a código C.
Quizá la razón por la que el proyecto SymPy no se ve mucho en código de productos reales es que se usa para esos cálculos intermedios, después solo el resultado entra al código del producto y el código de cálculo simbólico se descarta.
En robótica y visión por computadora hay una biblioteca muy buena que hace este trabajo usando SymPy: symforce: https://github.com/symforce-org/symforce
Quería probar actualizar la posición de cada nodo por turnos con un paso de Newton, dejando fijos los demás nodos.
Permite calcular jacobianos de forma eficiente sin salir de Python, también puede usar GPU si quieres, y su API es compatible con NumPy.
SymPy es realmente excelente, y lo he usado durante años como herramienta educativa.
La razón por la que me parece la mejor opción frente a Mathematica, Maple y similares es que las funciones de la API coinciden exactamente con los verbos que usan los estudiantes al aprender matemáticas: solve, expand, factor, etc.
Un tutorial breve para quien quiera empezar: https://minireference.com/static/tutorials/sympy_tutorial.pd...
También hay una versión en formato de notebook ejecutable: https://colab.research.google.com/github/minireference/sympy... solo lectura: http://nbviewer.ipython.org/github/minireference/sympytut_no...
Si quieres probarlo sin instalar nada, también está SymPy live shell: https://live.sympy.org/ Gracias a WebAssembly, Python y SymPy se ejecutan en el navegador.
Al procesar expresiones ingresadas por usuarios, se vuelve más difícil porque hay que parsear la expresión manualmente para averiguar qué variables se usaron, o pedirle al usuario que proporcione los símbolos a mano.
La matemática simbólica se trata muy poco en serio durante la licenciatura, y cuando uno llega a verla, por lo general está atada a software propietario como Mathematica o MATLAB.
La aprendí como una herramienta que extiende de forma imperfecta la manera de pensar con papel y lápiz, y cuando se tratan temas más avanzados como código fuente, se vuelve inestable a medida que se profundizan las abstracciones.
Por ejemplo, trabajo en áreas de matemáticas/ingeniería que requieren muchos cálculos tensoriales; uso principalmente Maxima, pero los paquetes relacionados son limitados y engorrosos: https://arxiv.org/pdf/cs/0503073.pdf
Para cálculos más complejos ahora uso SymPy, no tanto porque su manipulación simbólica sea mejor en sí misma, sino por las abstracciones que Python ya ofrece.
Tal vez algún día lea Principles de Norvig y adapte Maxima a mis necesidades; también me gustaría conocer mejores referencias sobre el código fuente de Maxima, implementaciones de cálculo tensorial, y tensores simbólicos/álgebra geométrica.
Hasta donde sé, Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage, etc., dependen todos de texto estilo máquina de escribir para escribir e ingresar fórmulas matemáticas.
Solo por esta razón Maple fue el único que me resultó convincente, porque permite ingresar las cosas tal como se escriben a mano, y no entiendo por qué esta función no es más común.
Me pregunto si esto también es una barrera para otras personas.
Para él era una herramienta realmente trabajadora.
Hace mucho tiempo jugué con Derive5, que en ese entonces era el sistema de álgebra computacional más barato, y aprendí a programar con un lenguaje de programación extraño de una sola línea, en el que había que eliminar todos los espacios y cuidar siempre que los paréntesis estuvieran balanceados.
Debería buscar esos archivos viejos y subirlos a GitHub; de hecho, me gustaría volver a implementar esos cálculos en un sistema de álgebra computacional más moderno y trazar con más densidad las curvas de una familia de funciones exponenciales de longitud de signo igual cerca del punto (0,1).
Hay un benchmark entre SymPy y Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
Según los resultados, Mathematica no pudo resolver 1,523 problemas, mientras que SymPy no pudo resolver 48,529
Todavía hay bastante por alcanzar
Además, SageMath, que depende de SymPy, es un producto más comparable, y también es open source
Por ejemplo, quisiera saber si hay algún defecto fundamental en el enfoque de SymPy
SymPy: https://en.wikipedia.org/wiki/SymPy
“How should logarithms be taught?” Uso de Python y 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
Estoy usando SymPy como calculadora junto con https://github.com/idanpa/calcpy
Sentí que SymPy básico era un poco engorroso de usar
SymPy funciona muy bien en Jupyter
Estos son notebooks demo de SymPy que hice
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... resolución de cuadráticas multivariable y salida bonita de expresiones matemáticas
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... cheat sheet de gráficos rápidos con NumPy/pylab, con ejemplos de SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... ejemplo de cómo usar SymPy para diferenciar simbólicamente una función Python existente y encontrar un mínimo en forma cerrada
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... análisis básico de circuitos y cálculo elemental con SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... pruebas con formatos MathJax y SymPy de varias maneras, incluido un análisis del algoritmo del círculo de Minsky de HAKMEM
Hace 10 años, cuando me interesaba la relatividad general, quería hacer un programa sencillo que manejara cálculos simbólicos de las ecuaciones de campo de Einstein
La idea era partir de la métrica y calcular la conexión afín, el tensor de Ricci, etc.; como conocía Python, SymPy parecía una buena opción, pero fue difícil y no logré hacerlo funcionar de verdad
Con Mathematica, que usaba por primera vez en ese momento, lo logré en unas horas, y luego lo amplié y lo usé para muchos cálculos en un artículo sobre agujeros negros que publiqué más adelante
Al revisar ahora, veo que hubo mucho desarrollo de SymPy en esta área y que surgieron buenas bibliotecas encima de él: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
Ahora incluso hay un ejemplo de notebook de Jupyter que trabaja con la métrica de Schwarzschild: https://github.com/sympy/sympy/blob/master/examples/intermed...
Está construido sobre SageMath, pero entiendo que también puede usar SymPy como motor de cálculo
Para un “físico” que hace cálculos numéricos, SymPy se sintió bastante como un salvador.
También es bueno para crear primero prototipos de modelos más avanzados y luego optimizarlos en C++.
No he usado mucho Mathematica, pero todavía da la impresión de tener una capacidad de manipulación simbólica más potente que SymPy, o de requerir menos trabajo manual.
Sería bueno que alguien con más experiencia en Mathematica explique con claridad las diferencias reales.
Maple es bueno en algunas integrales.
La desventaja es que esos lenguajes no son muy adecuados como lenguajes de propósito general y, cuando las manipulaciones algebraicas que hay que hacer no son tan complejas, uno termina queriendo trabajar en un lenguaje “real”.
Python no es lo mejor, pero es lo suficientemente usable, y este es otro caso en el que se aprovecha la ventaja de su enorme ecosistema de propósito general.
SymPy cumple con lo que tiene que hacer.
Normalmente lo uso dentro de la biblioteca de combinatoria de SageMath, pero me pregunto si esa sigue siendo la forma estándar o si SymPy ya avanzó lo suficiente como para usarse por sí solo.
Es porque, al faltarle consistencia interna, parece que la forma de trabajar podría ser irregular.
Me da curiosidad cómo se siente esto en la práctica.