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θ

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)θ)


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,...,m−1

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⁡(ϑ)


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ε

ε

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.