Dada uma função real de variáveis reais, existe um software disponível que possa gerar automaticamente código com precisão numérica para calcular a função em todas as entradas em uma máquina equipada com aritmética IEEE 754?
Por exemplo, se a função real a ser avaliada fosse:
O software consideraria o cancelamento catastrófico e, possivelmente, pesquisas na tabela de saída para determinados conjuntos de entradas para evitar uma perda na precisão computacional.
Como alternativa, existe um software que pode gerar uma rotina de pesquisa pura baseada em tabela para calcular uma determinada função com alta precisão?
software
floating-point
accuracy
Daniel Trebbien
fonte
fonte
Respostas:
A melhor solução que eu conheço é programar as expressões simbólicas no Mathematica , Maple ou SymPy ; todos os links vão diretamente para a documentação de geração de código. Todos os programas acima podem gerar código em C ou Fortran.
Nenhum dos programas acima menciona precisão na aritmética IEEE 754; em geral, seria difícil prever todas as fontes de cancelamento catastrófico, como observa @dmckee. É difícil substituir a experiência humana em análise numérica.
Para fornecer um exemplo concreto, considere calcular as funções trigonométricas com alta precisão para entradas arbitrárias em . Existem muitas estratégias para fazê-lo, algumas até dependentes de hardware, como pode ser visto no artigo Trigonometric Tables da Wikipedia . Todos os algoritmos exigem engenhosidade e análise numérica, mesmo algoritmos que dependem de tabelas de pesquisa e séries ou interpolação de Taylor (consulte o artigo da Wikipedia O dilema do criador de tabelas ). Para obter mais detalhes, consulte a pergunta Estouro de pilha relacionada. Como funcionam as funções trigonométricas? .[ 0 , 2 π]
O software que gerou código ou rotinas para calcular funções arbitrárias com alta precisão não precisaria apenas estar ciente dos erros de cancelamento, mas também aproximações em série (Taylor, Padé, Chebyshev, racional etc.) para calcular funções que não são definidas em termos de um número finito de adições, subtrações, multiplicações, divisões e mudanças de bits. (Veja Teoria da Aproximação .)
fonte
Se você quiser ter uma idéia de quão longe estamos de um pacote de software, consulte a nota de trabalho do LAPACK 2001 sobre o cálculo das rotações da Givens de maneira confiável e eficiente . Eu esperaria que a maioria dos não especialistas (e muitos especialistas!) Em análise numérica se surpreendesse com a quantidade de análise que foi aplicada na solução de um problema tão aparentemente simples:
fonte
A geração de código e a pré-compilação de expressões matemáticas estão se tornando mais populares.
Embora pacotes simbólicos como SymPy, Mathematica e Maple possam incluir geração de código, não estou confiante de que algum deles também pense muito sobre números.
Existem alguns outros projetos que podem ser pesquisados, interessados tanto em simbólicos quanto em numéricos.
O Theano é um projeto focado em operações de matriz. Eles identificam e substituem algumas operações conhecidas por serem numericamente mal condicionadas. Não tenho certeza de que isso inclua seu caso específico, mas vale a pena investigar.
Espiral também pode ser interessante para você. Eles também pré-compilam uma árvore de sintaxe abstrata e também procuram problemas numéricos. Eles estão mais preocupados com operações escalares (como o seu exemplo). No entanto, eles também são bastante especializados em um domínio específico.
O crescimento neste campo é encorajador, no entanto. Pode-se estar otimista de que sua pergunta terá uma resposta melhor em alguns anos.
fonte
Em geral, não posso dizer com segurança que o implementador do gerador de código no SymPy nem tentou = P.
Paolo Bientinesi desenvolveu um método para gerar provas de estabilidade de algoritmos de álgebra linear, que são gerados usando a notação FLAME de Robert van de Geijn.
Veja este documento , ou uma versão mais longa da nota de trabalho .
fonte
O Sage permite que você expresse fórmulas no Cython (uma variante do python que gera código C); no entanto, em resposta à sua pergunta mais geral: não. Considere o teorema de Rice .
fonte