¿Alguien podría explicar cómo escribir una función sinc sin usarla realmente en MATLAB?


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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *