Tengo necesidad de calcular las funciones: y donde y y a menudo es muy pequeño ( ). ¿Hay alguna forma general de generar algoritmos altamente precisos para funciones "especiales" como estas?
Tengo necesidad de calcular las funciones: y donde y y a menudo es muy pequeño ( ). ¿Hay alguna forma general de generar algoritmos altamente precisos para funciones "especiales" como estas?
Respuestas:
Realice una expansión polinómica (a la regla de l'Hopital) tanto para el enumerador como para el denominador y obtendrá una función racional que, para pequeña , se aproximará bien a la función.
Como ejemplo:
Puede hacerlo mejor si tiene una idea del rango de valores en el que desea evaluar. Luego puede reemplazar la expansión de Taylor alrededor de arriba por un enfoque de interpolación de proyección más adecuado para el rango de .
Mi enfoque es utilizar software como SymPy de la siguiente manera:
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
El primer número es una expansión de la serie Taylor truncada en 10 términos, el segundo número es la evaluación exacta. SymPy usa aritmética exacta, en este ejemplo usé x = 1/100 y a = 1/2, pero puedes jugar con eso. Finalmente, lo evalúo con 30 dígitos decimales para que uno pueda comparar fácilmente los números. El tercer número es una evaluación de doble precisión con flotadores de Python.
En este caso, me parece que no hay cancelación. Pero para otras expresiones, la evaluación directa de doble precisión puede no ser lo suficientemente precisa y luego la expansión en serie es una forma de evaluarla. La otra es la aproximación racional, la he usado MiniMaxApproximation
en Mathematica en el pasado con gran éxito.