Mejor respuesta
Te refieres a una función que evalúa \ frac {\ sin x} {x} para x \ ne 0 y 1 para x = 0?
Obviamente, sería fácil programar algo con una declaración como
function result = mySinc(x)
\% My implementation of the sinc function.
if x == 0
result = 1;
else
result = sin(x)/x;
end
end
Pero eso de hecho podría ser menos que ideal. Claro, evita la singularidad y tiene la estructura matemática correcta, pero, por supuesto, debemos recordar que los valores en x
no son números: son patrones de bits representados por interruptores. en hardware y solo números aproximados . Funcionan bastante bien la mayor parte del tiempo, pero hay circunstancias en las que las cosas simplemente no funcionan bien. Por ejemplo, al evaluar a + log(1+x)
para x
, o al evaluar a-b
cuando a
y b
tienen valores muy similares. puede perder una mucho de precisión si evalúa este último ingenuamente (aunque a veces puede que no tenga otra opción, por desgracia). La división por números pequeños también puede causar problemas, aunque afortunadamente, tanto \ sin x como x son comparables cuando | x | \ ll 1. Quizás no sea un problema, pero cuando se trata de aritmética de coma flotante, rara vez es una buena práctica tener un código como if x == foo
.
¿Qué hacer en este caso? Considere la serie de Taylor de \ frac {\ sin x} {x} centrada en x = 0. No lo escribiré, pero seguramente sabe cómo calcularlo.
Luego reemplace la prueba if x == 0
por if abs(x) < sqrt(eps)
, donde en Matlab eps
devuelve la máquina epsilon (comparable a 10 ^ {- 16} en la mayoría de los sistemas en estos días), y reemplaza la línea result = 1;
por result = ...;
, donde ...
va a ser su cálculo de la serie de Taylor truncada después de un orden apropiado (generalmente alrededor de 2 hacer, pero debe verificar usted mismo la escala del término de orden más alto que elija para x \ sim 10 ^ {- 8} y si el resultado será tan preciso como necesita o no).
El Lo bueno aquí es que lo que pierde en velocidad al ejecutar este código, probablemente gane en precisión, especialmente al evaluar la integral sinusoidal \ operatorname {Si} (x) = \ int\_0 ^ xf (t) dt, donde f (t ) es la extensión continua de la función \ operatorname {sinc} a todos los reales como su dominio.