1 puntos por GN⁺ 2024-03-01 | 1 comentarios | Compartir por WhatsApp
  • 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

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

    • De forma parecida, alguna vez usé SymPy para manejar derivadas engorrosas necesarias en cálculos de mecánica orbital.
      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.
    • Esta biblioteca podría ser interesante: https://github.com/symforce-org/symforce
    • Antes veía que la gente hacía este tipo de cosas con Maple, así que da gusto que ahora exista una opción de código abierto.
      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
    • Justo hoy hice esto mientras construía un simulador de tela.
      Quería probar actualizar la posición de cada nodo por turnos con un paso de Newton, dejando fijos los demás nodos.
    • Me pregunto si han considerado jax.
      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.

    • La mayor desventaja de SymPy es que hay que definir todos los símbolos de antemano.
      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.

    • Me pregunto si existe alguna aplicación, aparte de Maple, que admita entrada tipográfica tal como se ve.
      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.
    • Un amigo cercano solía contar que en Coherence creó notebooks de producción para cálculos ópticos y térmicos con Mathematica Notebook.
      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

    • SymPy es open source y Mathematica no
      Además, SageMath, que depende de SymPy, es un producto más comparable, y también es open source
    • Es interesante, pero el sitio mencionado solo cubre integración
    • Me pregunto por qué hay una diferencia tan grande
      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

    • Parece justo el formato que estaba buscando
      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...

    • Sería bueno revisar Sage Manifolds: https://sagemanifolds.obspm.fr/
      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.

    • Dejando aparte a Stephen Wolfram, Mathematica sigue estando muy por delante de la mayoría de las alternativas como sistema de álgebra computacional.
      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.

    • SageMath se ve genial, pero me resulta un poco abrumador que sea una combinación de varias herramientas existentes, cada una con su propia sintaxis y con funciones que se superponen.
      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.