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
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
Respostas:
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.
Como exemplo:
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 .x
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 MiniMaxApproximation
no Mathematica no passado com grande sucesso.