Avaliando seno e cosseno de um múltiplo inteiro de um ângulo

8

Ao avaliar harmónicas cilíndricas, é preciso avaliar funções trigonométricas e sin ( m θ ) , potencialmente para grande número inteiro m e θ [ - π , π ] . Qual é a melhor maneira de fazer isso no código C? Atualmente, eu apenas avalio no ângulo m θ , mas eu suspeitaria que as bibliotecas padrão perdem precisão em argumentos grandes. Eu estava pensando em usar fórmulas de ângulo duplo e similares para reduzir recursivamente a magnitude dos argumentos, mas estou pensando se isso acaba causando mais erros.porque(mθ)pecado(mθ)mθ[-π,π]mθ

Victor Liu
fonte

Respostas:

4

Se você fizer iterativamente, computando e cos ( n θ ) a partir de sin ( ( n - 1 ) θ ) e cos ( ( n - 1 ) θ ) , os erros de ponto flutuante não explodirão por acumulação . Isso ocorre porque a matriz de transição é ortonormal. É uma matriz de rotação simples.pecado(nθ)porque(nθ)pecado((n-1)θ)porque((n-1)θ)


fonte
Hum, esse é um bom argumento. No entanto, mesmo se os erros não explodirem, tenho alguma garantia de que o resultado não se afastou do que deveria ser a resposta "exata"?
Victor Liu
Duvido que os resultados sejam muito diferentes em comparação com a resposta exata. Você pode tentar e θ = π / m para saber o que esperar. m=1000θ=π/m
Sempre que é par, eu usaria a fórmula de ângulo duplo para cortar o expoente ao meio. Isto corresponde a calcular o n ° de alimentação da matriz de rotação com o ó ( log ( n ) ) algoritmo. nnO(registro(n))
Erik P.
Você está certo. A minha resposta foi baseado no pressuposto de que todos os valores intermédios ( ) irá também ser usado. 1,...,m1
7

Já encontrei um problema semelhante antes, mas estava mais preocupado com velocidade do que com precisão (consulte o documento aqui ). Se o seu ângulo for o resultado de um arco ( ) , o que geralmente ocorre em cálculos geométricos, você pode usar os polinômios de Chebyshev, definidos comoϑarccos()

Tk(x)=porque(karccos(x)),ouTk(porque(ϑ))=porque(kϑ)

e pode ser avaliado rapidamente e de forma estável usando a relação de recorrência de três períodos

Tk(x)=2xTk-1(x)-Tk-2(x),T0 0(x)=1,T1(x)=x.

porque(mϑ)m+1porque(ϑ)

Pedro
fonte
2

porquekxpecadokx

A recorrência (efetivamente igual ao exemplo 4 em Bulirsch / Stoer, veja que para uma análise detalhada) ocorre da seguinte maneira:

porque(θ+ε)=porqueθ-(pporqueθ+qpecadoθ)pecado(θ+ε)=pecadoθ-(ppecadoθ-qporqueθ)

onde temos as constantes pré-computadas

p=2pecado2ε2,q=pecadoε

ε

JM
fonte