Estou procurando alguma implementação de código aberto (qualquer um de Python, C, C ++, Fortran é bom) de aproximação racional a uma função. Algo ao longo do artigo [1]. Dou-lhe uma função e ele me devolve dois polinômios, cuja razão é a aproximação no intervalo determinado e o erro está oscilando com a mesma amplitude e é uma aproximação ótima ou próxima a ela.
Aqui está o que eu encontrei:
Parece que a chebfun pode fazer isso, mas não tenho acesso ao Matlab *.
Há um programa simples na seção 5-13 "Aproximação Racional de Chebyshev" em Receitas Numéricas (NR).
O Mathematica EconomizedRationalApproximation e MiniMaxApproximation
Fiquei me perguntando se há algo mais novo (possivelmente melhor testado) do que o código NR.
Minha aplicação é que eu tenho um conjunto de funções especiais, cerca de 10, que são dadas como séries hipergeométricas ou alguma fórmula que possui cancelamentos numéricos, e eu quero ter uma função de avaliação robusta, rápida e precisa, que está sendo chamada em o loop mais interno do cálculo de dois elementos da matriz de partículas nos cálculos de Hartree Fock. Eu coloquei um exemplo simples de uma função que funciona para mim em [2]. Como você pode ver, é usando uma fórmula direta ou uma série em torno de x = 0 que calculei usando o SymPy. Funciona meio que, mas a precisão não é boa, cerca de x = 1 cerca de metade dos dígitos significativos são perdidos (mas para x = 0,1 e x = 1e5 é preciso para quase todos os dígitos significativos). Estou procurando uma melhor aproximação.
[1] Deun, J. e Trefethen, LN (2011). Uma implementação robusta do método Carathéodory-Fejér para aproximação racional. BIT Numerical Mathematics, 51 (4), 1039-1050. doi: 10.1007 / s10543-011-0331-7 ( junho de 2010 e-print )
[2] https://gist.github.com/3831580.
(*) Nem no site da chebfun, que me dá 404, mas Pedro sugeriu que esse deve ser o problema do meu provedor.
fonte
Muitas vezes, realizar as melhores aproximações racionais pontuais pode ser realizado por iterações "manuais" do algoritmo Remez : interpole uma aproximação racional com erros de sinal alternativos (relativos ou absolutos) em uma estimativa inicial dos pontos de interpolação, localize um (ou mais) pontos em que o erro real excede o dos pontos de interpolação e do pivô (trocando um ou mais dos pontos adivinhados por eles, de maneira a preservar erros de sinal alternativos). É uma boa maneira de entender a teoria desde o início. Quando a precisão exigida é modesta, acho que a implementação de uma planilha ajuda-me a percorrer os cálculos e a adaptar os problemas por meio de recortar e colar.
Se abaixarmos a linha reta pela metade da distância no ponto de "erro máximo", teremos três pontos "equi-oscilatórios" de erro absoluto, contando os dois pontos finais e esse ponto crítico no interior. Assim, uma melhor aproximação polinomial linear a uma função convexa suave pode ser encontrada quase por inspeção.
O próprio software Chebfun é de código aberto ( licença no estilo BSD ) desde a v4.0. Não sei por que os links para seus sites podem ter retornado um erro 404 naquele momento, mas agora eles estão na v5.2.1. (Eles também têm um repositório GitHub .) O projeto Chebfun visa mais do que as melhores aproximações racionais, com o conceito central sendo uma sintaxe semelhante ao vetor Matlab para funções (reais univariadas) em um intervalo.
Para completar o círculo, é necessário fazê-lo funcionar no Octave, e não no Matlab. Havia um tópico sobre os mantenedores da Oitava sobre isso, iniciado em 2010. Um artigo de 2012 dos autores / mantenedores da Chebfun sugere que algum esforço foi feito para a compatibilidade da Oitava por parte deles.
Olhar a página de projetos relacionados ao Chebfun sugere que, como o software Chebfun é de código aberto, talvez seja possível fazer essa porta ou fazer uso de um dos pacotes de código aberto listados lá, como o Olivier Verdier
pychebfun
, um Python Chebyshev Functions projeto hospedado no GitHub.fonte