6 votos

Simplificación numéricamente estable de la función sinc.

Me gustaría saber si existe una forma alternativa y explícita (no iterativa) del sinc que se comporta de forma numéricamente estable para todos los números reales. La definición que conozco es:

$$\texttt{sinc}(a) = \dfrac{\sin(a)}{a}$$

Sin embargo, aunque esta función está bien definida en todas partes (incluso a 0) Esta función presenta problemas cuando se implementa en el código y se evalúa en 0. Me gustaría saber si hay una forma alternativa que implique funciones simples que eviten la posible división por 0 cuando intentemos implementar esto es código.

Algunos paquetes de programación (como numpy en python) proporcionan un sinc para evitar este problema. Pero me gustaría saber en general si hay una forma mejor de implementarlo en un lenguaje arbitrario sin recurrir a algún if declaración. Por ejemplo, numpy simplemente comprueba si a=0 . Si lo es, entonces sustituye a a con algún valor pequeño $\neq 0$ . Específicamente:

def sinc(x):
    y = pi * where(x == 0, 1.0e-20, x)
    return sin(y)/y

EDITAR

Como señala Sangchul Lee, se podría considerar la forma de la serie, pero esa representación se romperá para grandes $a$ . Así que la forma de la serie es esencialmente empujar el problema en otro lugar (desde un punto de vista numérico). Además, podría considerar la posibilidad de cambiar entre las dos formas dependiendo de si $a$ es pequeño, pero eso es introducir su propia if y me gustaría evitar una solución a trozos.

Nota: No tengo ni idea de qué etiquetas utilizar aquí. Así que, por favor, actualice las etiquetas a lo que considere apropiado.

0 votos

¿Existe la posibilidad de utilizar la siguiente ampliación de serie? $$\operatorname{sinc}(a) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!} a^{2n} $$ Esta fórmula funciona especialmente bien cuando $a$ está cerca de cero.

0 votos

Esto no funcionará bien numéricamente. Esto empuja el problema a otro lugar. Específicamente, mientras que su fórmula funcionará bien alrededor de 0, se romperá para grandes $a$ . Así que no es realmente una forma general que sea numéricamente estable

1 votos

Por lo que sé, muchas funciones especiales se implementan de manera fragmentada para lograr la estabilidad numérica para un amplio rango de parámetros, así que supongo que no es malo adoptar la misma estrategia aquí. Por ejemplo, se puede utilizar la fórmula anterior cuando $a$ está dentro de un determinado umbral y, a continuación, utilizar $\sin(a)/a$ de lo contrario.

3voto

hypernova Puntos 171

Si es imprescindible, puede considerar (con o sin $\pi$ ) $$ \text{sinc}(x)\approx\frac{\sin\left(\pi\left|x\right|+\epsilon\right)}{\pi\left|x\right|+\epsilon}, $$ donde $\epsilon>0$ es un pequeño parámetro, preferiblemente el épsilon de su máquina.

0 votos

Es una muy buena idea. No me gusta el hecho de que sea una aproximación. Pero, no obstante, es una buena idea.

0 votos

@bremen_matt: Claro, entiendo tu punto de vista. Deshacerse de "si" podría hacer que su esquema sea más eficiente, especialmente si necesita llamar a $\text{sinc}$ para los tiempos. La aproximación es otra alternativa, aunque imperfecta. Realmente depende de su demanda. Como mi plataforma MATLAB, $\sin\pi$ no es exactamente $0$ pero algunos $10^{-16}$ en su lugar (de acuerdo con mi máquina epsilon), incluso si $\sin x$ es sin ninguna aproximación. Tal vez podrías relajar un poco tu objetivo, porque de todos modos hay errores de redondeo.

0voto

orlp Puntos 373

Para los pequeños $x$ la siguiente definición se comporta muy bien numéricamente:

$$\mathrm{sinc}(x) = \frac{1}{\Gamma(1+\frac{x}{\pi})\Gamma(1-\frac{x}{\pi})}$$

0 votos

¿Por qué crees que esto se comporta bien numéricamente?

0 votos

@user14717 Porque $\Gamma$ se comporta bien con $1$ : wolframalpha.com/input/?i=plot+Gamma(x)+de+0.5+a+1.5 No hay $0/0$ o $\infty/\infty$ cuestiones numéricas.

0 votos

El $1+x/\pi$ indica que su precisión está limitada por el redondeo de la unidad, que es grande para los números en coma flotante.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X