1 pontos por GN⁺ 2024-03-01 | 1 comentários | Compartilhar no WhatsApp
  • 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

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

    • De forma parecida, já usei o SymPy para lidar com derivadas bagunçadas necessárias em cálculos de mecânica orbital
      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
    • Esta biblioteca pode ser interessante: https://github.com/symforce-org/symforce
    • Antigamente eu via pessoas fazendo esse tipo de coisa com Maple, então é bom ver que agora existe uma opção open source
      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
    • Fiz exatamente isso hoje ao criar um simulador de tecido
      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
    • Fico curioso se você já considerou o jax
      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

    • A maior desvantagem do SymPy é que é preciso definir todos os símbolos antecipadamente
      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

    • Fico curioso se existe algum aplicativo, além do Maple, que suporte entrada tipográfica no estilo “o que você vê é o que está sendo composto” como o Maple
      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
    • Um amigo próximo costumava dizer que, na Coherence, criou notebooks de produção em Mathematica Notebook para realizar cálculos ópticos e térmicos
      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

    • O SymPy é open source, e o Mathematica não
      Além disso, o SageMath, que depende do SymPy, é um produto mais próximo como comparação, e ele também é open source
    • É interessante, mas o site mencionado trata apenas de integrais
    • Fico curioso sobre por que há uma diferença tão grande
      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

    • Parece exatamente o formato que eu estava procurando
      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...

    • Vale a pena conferir Sage Manifolds: https://sagemanifolds.obspm.fr/
      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

    • Deixando Stephen Wolfram de lado, o Mathematica ainda está muito à frente da maioria das alternativas como sistema de álgebra computacional
      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

    • O SageMath parece interessante, mas o fato de ser uma combinação de várias ferramentas existentes, cada uma com sua própria sintaxe e funcionalidades sobrepostas, é um pouco intimidador
      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