Calculadora de aproximação de Chebyshev
(stuffmatic.com)- Chebyshev approximation calculator é uma ferramenta que gera na web código para aproximação de funções matemáticas
- O usuário pode especificar a função a aproximar, o intervalo e o número de termos usando
f(x),x min,x maxeTerms - A opção
Match x min x maxe a área Coefficients oferecem um fluxo para verificar ou ajustar os limites do intervalo e os valores dos coeficientes - Na área Generated code, o resultado do cálculo é exibido em forma de código; na tela de exemplo, aparecem os coeficientes de
c0ac10 - Há um repositório no GitHub vinculado, permitindo conferir diretamente o código de implementação da ferramenta web
Gerador de código de aproximação de Chebyshev
- Chebyshev approximation calculator gera código para aproximar funções matemáticas de forma eficiente
- As condições de aproximação são inseridas na UI web
f(x): função a aproximarx min: valor mínimo do intervalox max: valor máximo do intervaloTerms: número de termos a usarMatch x min x max: opção relacionada aos limites do intervalo
Verificação de coeficientes e código gerado
- A tela é dividida entre a área Coefficients e a área Generated code
- Os coeficientes exibidos como exemplo podem ser verificados de
c0ac10c0 = 0.16793649417016518c1 = -0.12411164956092625c2 = -0.09756341588422193c3 = 0.1800765790518846c4 = -0.06972963647223016c5 = -0.09250127939333941c6 = 0.18076946080324185c7 = 0.15990613621816677c8 = -0.028659588693985123c9 = -0.09494966104347571c10 = -0.04980429834982578
- A tela também exibe itens de coeficientes de
c11ac39
Repositório de código
- Repositório relacionado no GitHub: stuffmatic/chebyshev-calculator
1 comentários
Opiniões no Hacker News
Muito legal. Por volta de 1974, escrevi uma função para calcular raiz quadrada em assembly do IBM 360 e fui pago por isso
Eu estava no último ano da graduação e me pediram para torná-la o mais eficiente possível. Depois de escalar a entrada para ficar entre 0 e 1, usei uma aproximação de Chebyshev para a estimativa inicial e cheguei à solução aplicando 2 ou 3 iterações desenroladas do método de Newton. Foi meu primeiro dinheiro recebido por escrever código
Muito bem feito. Fiquei fascinado com a eficiência dessas aproximações e passei a entender muito melhor por que as implementações de funções trigonométricas ou outras funções matemáticas em computadores de 8 bits eram feitas daquele jeito
Também há um ótimo documento original de 1969 do BBC Research Department explicando por que esse método é excelente: https://downloads.bbc.co.uk/rd/pubs/reports/1969-10.pdf
Se você só viu aproximações de Taylor, no começo pode parecer um pouco mágico
Já obtive bons resultados com Sollya antes: https://www.sollya.org/
Dito isso, embora os resultados tenham sido bons, o software em si é meio trabalhoso de usar
Ao aproximar
Math.sin(x)/x, ou seja, a função sinc, no intervalo[-3,3]com 7 termos, todos os coeficientesc0...c6viramNaN. É um bug?Como solução temporária, forcei simplesmente para
1.0quandoxestá perto de 0if(Math.abs(x) > 1e-8 ){ Math.sin(x)/x } else { 1.0 }x_j = (xmin) + (xmax - xmin)/2(1 + cos(pi[0..j-1]/(j-1))para obter os coeficientes de Chebyshev; se um deles for exatamente 0, ele acaba calculandoMath.sin(0)/0, resultando emNaNOutra forma de contornar é usar um intervalo ligeiramente assimétrico, como
[-3,+3.0000001]x=0, e parece que o código de aproximação tropeçou ali. O código deixa um pouco a desejarPolinômios de Chebyshev são tão poderosos e versáteis em aproximações que as pessoas acham que são bons demais para ser verdade e acabam não usando
A primeira tentativa deveria ser Chebyshev. Redes neurais deveriam ser o último recurso
Excelente. Recentemente eu quis fazer algo assim, e foi surpreendentemente difícil encontrar código que calculasse a aproximação
Deixei nos favoritos para usar na próxima vez que precisar aproximar uma função rapidamente
Chebyshev parece magia negra. Mesmo depois de ver a derivação em uma disciplina de pós-graduação, ainda sinto isso
Também é obrigatório mencionar o Chebfun, de Nick Trefethen e outros. É uma ferramenta que estende essa ideia em praticamente todas as direções imagináveis
Chebfunspodem ser vistos como o equivalente, para funções, dos números de ponto flutuante para números matemáticos reais. É um software realmente impressionantehttps://www.chebfun.org
Isso permite vários métodos, como encontrar soluções de equações diferenciais algébricas com precisão de máquina ou encontrar mínimos/máximos globais de funções unidimensionais
Pelo que sei, hoje eles usam outros algoritmos, mas a metodologia básica que o Chebfun usava antigamente pode ser vista no capítulo 6 do livro de Trefethen
Spectral Methods in Matlab. A metodologia mais moderna usando funções ultrasféricas aparece no artigo de Olver e Townsend na SIAM Review,A Fast and Well-Conditioned Spectral MethodTenho uma dúvida, embora não saiba se este é o lugar certo para perguntar. Vi um vídeo dizendo que, antigamente, o Nintendo 64 não tinha capacidade para calcular a função seno, então usava uma tabela de consulta de 0 a 2π, com alguns truques inteligentes para reduzir o tamanho da tabela
Teria sido possível treinar uma rede neural e armazenar os pesos, ou criar uma função e armazenar os coeficientes, para calcular seno e cosseno?
Se sobrassem alguns ciclos de CPU, daria para usar uma aproximação híbrida, usando valores de uma tabela de consulta esparsa como estimativa inicial e repetindo algumas vezes algum método de aproximação numérica. Ou então bastaria armazenar alguns dos primeiros coeficientes de uma aproximação polinomial, como no post original
Redes neurais podem ser úteis quando você tem amostras de alguma função mas não sabe como aproximá-la; aqui, não é esse o caso
Redes neurais são uma ótima solução quando você precisa avaliar algo que não é fácil de analisar matematicamente, mas já existem muitas técnicas conhecidas para calcular e aproximar funções trigonométricas
Treinar uma rede neural para calcular seno é como a versão matemática de usar um LLM para inverter uma string. Dá para fazer, mas é uma ideia que só surge quando você não sabe que o problema é essencialmente resolvido por uma abordagem mais direta
Antes de usar técnicas de IA/ML, sempre vale verificar se os matemáticos já têm uma solução. Hoje em dia, é bem possível que muito esforço esteja sendo gasto aplicando IA/ML a problemas para os quais já existe uma solução conhecida, eficiente e até ótima, só que desconhecida pelos desenvolvedores
A principal força das redes neurais aparece quando há muitas entradas, não apenas algumas. Em um caso simples como
sin(x), existem outros métodos, como a ferramenta publicada aquiMuito bacana. Fiquei brincando e quis ver quão rápido eu conseguiria criar uma função que não fosse bem aproximada
Até agora, a melhor foi
Math.cos(x * Math.exp(Math.cos(x * x))). Ela tem muita composição, o que gera oscilações rápidas e inclinações íngremes, tornando difícil aproximá-la facilmente com Chebyshev