Razão computacional de funções trigonométricas

8

Eu tenho necessidade de calcular as funções: e onde e e geralmente são muito pequenos ( ). Existem formas gerais de gerar algoritmos altamente precisos para funções "especiais" como essas? g(x)=sinax

f(x)=sin1xx
a[0,1]x[0,π
g(x)=sinaxsinx
a[0,1]x«1x[0,π2]x1
Victor Liu
fonte

Respostas:

9

Faça uma expansão polinomial (a regra de la l'Hopital) para o enumerador e o denominador e você terá uma função racional que, para pequeno , aproximará bem a função.x

Como exemplo:

sinaxsinxax13!(ax)3+x13!x3+=a13!a3x2+113!x2+.

Você pode fazer melhor se tiver uma ideia do intervalo de valores no qual deseja avaliar. Você pode substituir a expansão de Taylor em torno de acima por uma interpolação mais adequada da abordagem de projeção para o intervalo de .xxx0=0x

Wolfgang Bangerth
fonte
4

Minha abordagem é usar software como o SymPy da seguinte maneira:

from sympy import var, sin, S
var("x a")
g = sin(a*x)/sin(x)
gseries = g.series(x, 0, 10).removeO()
s = {x: S(1)/100, a: S(1)/2}
print gseries.subs(s).n(30)
print g.subs(s).n(30)
print "%.17f" % g.subs({x: 1./100, a: 1./2})

que imprime:

0.500006250065104828565736800905
0.500006250065104828565736868886
0.50000625006510480

O primeiro número é uma expansão da série Taylor truncada em 10 termos, o segundo número é a avaliação exata. O SymPy usa aritmética exata, neste exemplo eu usei x = 1/100 e a = 1/2, mas você pode brincar com isso. Finalmente, avalio-o com 30 dígitos decimais, para que se possa comparar facilmente os números. O terceiro número é uma avaliação de precisão dupla usando carros alegóricos do Python.

Nesse caso, parece-me que não há cancelamento. Porém, para outras expressões, a avaliação direta de precisão dupla pode não ser suficientemente precisa e a expansão em série é uma maneira de avaliá-la. A outra é a aproximação racional, que usei MiniMaxApproximationno Mathematica no passado com grande sucesso.

Ondřej Čertík
fonte