SymPy: matemática simbólica em Python
(sympy.org)- Se você quiser manipular e calcular expressões matemáticas diretamente no código Python, o SymPy oferece suporte tanto ao uso interativo quanto à incorporação em aplicações
- É um software livre fornecido sob a licença BSD, e tanto a linguagem de implementação quanto a linguagem voltada ao usuário são Python
- Sua única dependência é a mpmath, uma biblioteca pura em Python para operações de ponto flutuante com precisão arbitrária, o que reduz o esforço de instalação e uso
- Várias ferramentas científicas, matemáticas e de desenvolvimento usam o SymPy, incluindo Cadabra, ChemPy, devito, EinsteinPy, SageMath, Spyder e PyTorch TorchInductor
- Seu campo de aplicação é amplo, abrangendo álgebra tensorial, química, relatividade geral, análise de circuitos, otimização, dinâmica, geração de código e suporte a shape e stride dinâmicos
Biblioteca de matemática simbólica baseada em Python
- SymPy é uma biblioteca para lidar com matemática simbólica em Python
- É fornecida sob licença BSD, podendo ser usada livremente
- É inteiramente escrita em Python, e a linguagem usada no SymPy também é Python
- Sua única dependência é a mpmath
- mpmath é uma biblioteca pura em Python para operações de ponto flutuante com precisão arbitrária
- Pode ser usada como ferramenta interativa e também incorporada em outras aplicações ou estendida com funções personalizadas
- A lista de recursos pode ser consultada em SymPy's features
Projetos que adotaram o SymPy
- A lista pública é uma lista incompleta de projetos que usam o SymPy, e é possível solicitar a inclusão de outros projetos por meio da mailing list
-
Área de computação científica e matemática
- Cadabra: usa o SymPy para álgebra escalar em sistemas de álgebra tensorial e teoria quântica de campos
- ChemPy: pacote de química escrito em Python
- EinsteinPy: pacote em Python para relatividade geral simbólica e numérica
- OctSymPy: pacote simbólico para Octave que usa SymPy
- PyDy: trabalha com dinâmica multicorpos em Python
- QMCPACK: projeto de Quantum Monte Carlo baseado em C++ que usa SymPy para gerar valores de referência para testes unitários e parte da geração de código
- SageMath: sistema matemático open source que inclui o SymPy
-
Ferramentas de desenvolvimento e geração de código
- devito: DSL simbólica e compilador JIT para computação stencil de alto desempenho
- Optlang: pacote em Python para resolver problemas de otimização matemática
- PyTorch TorchInductor: usa o SymPy para suporte a shape e stride dinâmicos
- Spyder: ambiente de desenvolvimento Scientific Python, com suporte completo ao SymPy que pode ser ativado no IPython Console
- symjit: compilador JIT leve para expressões do SymPy
- yt: pacote em Python para análise e visualização de dados volumétricos; o unyt, sistema de unidades do yt, usa o SymPy
1 comentários
Comentários do Hacker News
Em robótica, é comum usar vetores grandes resultantes de transformações 3D e precisar calcular jacobianos, que são derivadas em relação a várias variáveis de estado, então as expressões ficam rapidamente bagunçadas
Com o SymPy, dá para criar vetores grandes de forma declarativa, calcular o jacobiano e depois exportar o resultado diretamente como código C que pode ser usado no projeto
Por exemplo, quando há um conjunto de dados com a posição do robô e a posição dos sensores, para estimar a posição dos sensores em relação ao centro do robô, é possível resolver um sistema sobredeterminado com gradiente descendente, e a função de resíduo e o jacobiano necessários para isso podem ser calculados com o SymPy
Primeiro eu escrevia as equações, deixava a matemática chata para o SymPy e depois convertia a saída em código C
O motivo pelo qual o projeto SymPy talvez não apareça muito em código de produto real é que ele é usado nesses cálculos intermediários, e só o resultado entra no código do produto, enquanto o código de cálculo simbólico é descartado
Em robótica e visão computacional, há uma biblioteca ótima que faz esse tipo de trabalho usando SymPy, chamada symforce: https://github.com/symforce-org/symforce
Eu queria testar atualizar a posição de cada nó, um de cada vez, com uma etapa de Newton, mantendo os outros nós fixos
Ele permite calcular jacobianos de forma eficiente sem sair de Python, também pode usar GPU se você quiser, e a API é compatível com NumPy
O SymPy é realmente excelente, e eu o venho usando há anos como ferramenta educacional
O motivo pelo qual o considero a melhor opção em comparação com Mathematica, Maple e outros é que as funções da API correspondem exatamente aos verbos que os alunos usam ao aprender matemática: solve, expand, factor e assim por diante
Um tutorial curto para quem quer começar: https://minireference.com/static/tutorials/sympy_tutorial.pd...
Também há uma versão em notebook executável: https://colab.research.google.com/github/minireference/sympy... Somente leitura: http://nbviewer.ipython.org/github/minireference/sympytut_no...
Se quiser experimentar sem instalar nada, também há o SymPy live shell: https://live.sympy.org/ Graças ao WebAssembly, Python e SymPy rodam no navegador
Ao processar expressões digitadas pelo usuário, isso fica mais difícil, porque é preciso analisar a expressão manualmente para descobrir quais variáveis foram usadas, ou então fazer o usuário fornecer os símbolos manualmente
A matemática simbólica é seriamente pouco abordada na graduação e, quando alguém tem contato com ela, geralmente fica preso a softwares proprietários como Mathematica ou MATLAB
Ela era ensinada como uma ferramenta que expande de forma imperfeita o modo de pensar com papel e caneta, e quando conteúdos mais avançados são tratados em código-fonte, quanto mais profunda a abstração fica, mais instável ela se torna
Por exemplo, trabalho em uma área de matemática/engenharia que exige muitos cálculos tensoriais; uso principalmente Maxima, mas os pacotes relacionados são limitados e trabalhosos: https://arxiv.org/pdf/cs/0503073.pdf
Para cálculos mais complexos, agora uso SymPy, não porque o processamento simbólico em si seja melhor, mas por causa das abstrações que Python já oferece
Talvez um dia eu leia Principles, de Norvig, e adapte o Maxima às minhas necessidades; também gostaria de conhecer boas referências sobre o código-fonte do Maxima, implementações de cálculo tensorial ou tensores simbólicos/álgebra geométrica
Até onde sei, Wolfram/Mathematica, LaTeX, SymPy, Jupyter, Sage e outros dependem todos de texto em estilo máquina de escrever para escrever e inserir expressões matemáticas
Só por esse motivo, o Maple foi o único que realmente me pareceu natural, porque permite inserir as coisas exatamente na forma como são escritas à mão, e não entendo por que esse recurso não é mais comum
Fico curioso se isso também é uma barreira para outras pessoas
Para ele, era uma ferramenta realmente pau para toda obra
Há muito tempo, brinquei com o Derive5; era o sistema de álgebra computacional mais barato na época, e aprendi a programar em uma linguagem de programação estranha, de uma linha só, em que era preciso remover todos os espaços e sempre tomar cuidado com o balanceamento dos parênteses
Devo procurar esses arquivos antigos e colocá-los no GitHub; na verdade, eu queria reimplementar essas operações em um sistema de álgebra computacional mais moderno e desenhar com mais densidade as curvas da família de funções exponenciais de comprimento igual perto do ponto (0,1)
Há um benchmark entre SymPy e Mathematica: https://www.12000.org/my_notes/CAS_integration_tests/reports...
Pelos resultados, o Mathematica não conseguiu resolver 1.523 problemas, enquanto o SymPy não conseguiu resolver 48.529
Ainda há bastante coisa a alcançar
Além disso, o SageMath, que depende do SymPy, é um produto mais próximo como comparação, e ele também é open source
Por exemplo, gostaria de saber se há alguma falha fundamental na abordagem do SymPy
SymPy: https://en.wikipedia.org/wiki/SymPy
“How should logarithms be taught?” usando Python e 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
Estou usando o SymPy como uma calculadora junto com https://github.com/idanpa/calcpy
Achei o SymPy padrão um pouco trabalhoso de usar
O SymPy funciona muito bem no Jupyter
Estes são notebooks de demonstração do SymPy que eu mesmo fiz
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/sympy... resolução de quadráticas multivariadas e exibição bonita de expressões matemáticas
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/tiny-... cheatsheet de plots rápidos com NumPy/pylab, incluindo exemplos de SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/secan... exemplo de diferenciação simbólica com SymPy de uma função Python existente para encontrar um mínimo em forma fechada
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/max-p... análise básica de circuitos e cálculo elementar com SymPy
https://nbviewer.org/url/canonical.org/~kragen/sw/dev3/latex... experimentos com formatação MathJax e SymPy de várias maneiras, incluindo uma análise do algoritmo do círculo de Minsky do HAKMEM
Há 10 anos, quando eu tinha interesse em relatividade geral, queria criar um programa simples para lidar com o cálculo simbólico das equações de campo de Einstein
A ideia era começar pela métrica e calcular a conexão afim, o tensor de Ricci etc.; como eu já estava acostumado com Python, o SymPy parecia uma boa opção, mas foi difícil e não consegui fazê-lo funcionar de fato
Com o Mathematica, que eu usava pela primeira vez na época, consegui fazer isso em poucas horas; depois expandi o código e o usei em muitos cálculos em um artigo sobre buracos negros que publiquei mais tarde
Verificando agora, houve bastante desenvolvimento do SymPy nessa área, e surgiram boas bibliotecas sobre ele: https://docs.einsteinpy.org, https://github.com/spacetimeengineer/spacetimeengine
Hoje já existe até um exemplo de notebook Jupyter que lida com a métrica de Schwarzschild: https://github.com/sympy/sympy/blob/master/examples/intermed...
Ele foi construído sobre o SageMath, mas, pelo que sei, também pode usar o SymPy como motor de cálculo
Para um “físico” que faz cálculos numéricos, o SymPy pareceu bastante um salvador
Também é bom para primeiro prototipar modelos mais avançados e depois otimizá-los em C++
Não usei muito o Mathematica, mas ainda tenho a impressão de que ele tem uma capacidade de manipulação simbólica mais forte que o SymPy, ou exige menos esforço
Seria bom se alguém com mais experiência em Mathematica explicasse claramente as diferenças na prática
O Maple é bom em algumas integrais
A desvantagem é que essas linguagens não são muito adequadas como linguagens de uso geral e, quando as manipulações algébricas a serem feitas não são tão complexas, dá vontade de trabalhar em uma linguagem “de verdade”
Python não é a melhor, mas é boa o suficiente, e este é mais um caso em que se aproveita o enorme ecossistema de uso geral
O SymPy faz o que precisa fazer
Normalmente o uso dentro da biblioteca combinatória do SageMath, mas fico curioso se essa ainda é a abordagem padrão ou se o SymPy já evoluiu o bastante para ser usado sozinho
Isso porque parece que a falta de consistência interna deixaria o modo de trabalho irregular
Fico curioso para saber como isso é sentido na prática