¿Cómo funcionan las funciones trigonométricas?

Entonces, en matemáticas de la escuela secundaria, y probablemente en la universidad, se nos enseña cómo usar las funciones trigonométricas, qué hacen y qué tipo de problemas resuelven. Pero siempre me han sido presentados como una caja negra. Si necesitas el seno o el coseno de algo, presionas el botón de pecado o cos en tu calculadora y estás listo. Lo cual está bien.

Lo que me pregunto es cómo se implementan típicamente las funciones trigonométricas.

Primero, tienes que hacer algún tipo de reducción de rango. Las funciones Trig son periódicas, por lo que debe reducir los argumentos a un intervalo estándar. Para empezar, puedes reducir los angularjs entre 0 y 360 grados. Pero al usar algunas identidades, te das cuenta de que podrías arreglártelas con menos. Si calcula los senos y los cosenos para angularjs entre 0 y 45 grados, puede iniciar su camino para calcular todas las funciones trigonométricas para todos los angularjs.

Una vez que haya reducido su argumento, la mayoría de los chips utilizan un algoritmo CORDIC para calcular los senos y los cosenos. Puede escuchar a la gente decir que las computadoras usan series de Taylor. Eso suena razonable, pero no es verdad. Los algoritmos de CORDIC son mucho más adecuados para una implementación de hardware eficiente. ( Las bibliotecas de software pueden usar series de Taylor, por ejemplo, en hardware que no admite funciones trigonométricas). Puede haber algún procesamiento adicional, utilizando el algoritmo CORDIC para obtener respuestas bastante buenas pero luego haciendo algo más para mejorar la precisión.

Hay algunos refinamientos a lo anterior. Por ejemplo, para angularjs muy pequeños theta (en radianes), sin (theta) = theta con toda la precisión que tiene, por lo que es más eficiente simplemente devolver theta que usar algún otro algoritmo. En la práctica, hay una gran cantidad de lógica de casos especiales para exprimir todo el rendimiento y la precisión posible. Las fichas con mercados más pequeños pueden no tener tanto esfuerzo de optimización.

editar: Jack Ganssle tiene una discusión decente en su libro sobre sistemas integrados, “The Firmware Handbook” .

FYI: Si tiene limitaciones de precisión y rendimiento, las series de Taylor no se deben usar para aproximar funciones con fines numéricos. (Guárdalos para tus cursos de Cálculo.) Hacen uso de la analiticidad de una función en un solo punto , por ejemplo, el hecho de que todas sus derivadas existen en ese punto. No necesariamente convergen en el intervalo de interés. A menudo hacen un pésimo trabajo al distribuir la precisión de la aproximación de función para ser “perfectos” justo cerca del punto de evaluación; el error generalmente aumenta hacia arriba a medida que te alejas de él. Y si tiene una función con cualquier derivada no continua (por ejemplo, ondas cuadradas, ondas triangulares y sus integrales), una serie de Taylor le dará la respuesta incorrecta.

La mejor solución “fácil”, cuando se usa un polinomio de grado máximo N para aproximar una función dada f (x) sobre un intervalo x0

editar: Wikipedia tiene un artículo semi-decente sobre la teoría de la aproximación . Una de las fonts que citan (Hart, “Computer Approximations”) está agotada (y las copias usadas tienden a ser caras) pero entra en muchos detalles sobre cosas como esta. (Jack Ganssle menciona esto en el número 39 de su boletín The Embedded Muse .)

edición 2: Aquí hay algunas métricas de error tangibles (ver más abajo) para Taylor vs. Chebyshev para sin (x). Algunos puntos importantes a tener en cuenta:

  1. que el error máximo de una aproximación de serie de Taylor sobre un rango dado, es mucho mayor que el error máximo de una aproximación de Chebyshev del mismo grado. (Por aproximadamente el mismo error, puede salirse con un término menos con Chebyshev, lo que significa un rendimiento más rápido)
  2. La reducción de rango es una gran victoria. Esto se debe a que la contribución de polinomios de orden superior se reduce cuando el intervalo de la aproximación es más pequeño.
  3. Si no puede salirse con la reducción del rango, sus coeficientes necesitan almacenarse con más precisión.

No me malinterpreten: la serie Taylor funcionará correctamente para seno / coseno (con una precisión razonable para el rango -pi / 2 a + pi / 2; técnicamente, con suficientes términos, puede alcanzar la precisión deseada para todas las entradas reales, pero trate de calcular cos (100) usando la serie de Taylor y no puede hacerlo a menos que use aritmética de precisión arbitraria). Si estuviera atrapado en una isla desierta con una calculadora no científica, y tuviera que calcular el seno y el coseno, probablemente usaría series de Taylor ya que los coeficientes son fáciles de recordar. Pero las aplicaciones del mundo real para escribir sus propias funciones sin () o cos () son lo suficientemente raras que sería mejor utilizar una implementación eficiente para alcanzar la precisión deseada, lo cual no es la serie de Taylor.

Rango = -pi / 2 a + pi / 2, grado 5 (3 términos)

  • Taylor: error máximo alrededor de 4.5e-3, f (x) = xx 3/6 + x 5/120
  • Chebyshev: error máximo alrededor de 7e-5, f (x) = 0.9996949x-0.1656700x 3 + 0.0075134x 5

Rango = -pi / 2 a + pi / 2, grado 7 (4 términos)

  • Taylor: error máximo alrededor de 1.5e-4, f (x) = xx 3/6 + x 5 /120-x 7/5040
  • Chebyshev: error máximo alrededor de 6e-7, f (x) = 0.99999660x-0.16664824x 3 + 0.00830629x 5 -0.00018363x 7

Rango = -pi / 4 a + pi / 4, grado 3 (2 términos)

  • Taylor: error máximo alrededor de 2.5e-3, f (x) = xx 3/6
  • Chebyshev: error máximo alrededor de 1.5e-4, f (x) = 0.999x-0.1603x 3

Rango = -pi / 4 a + pi / 4, grado 5 (3 términos)

  • Taylor: error máximo alrededor de 3.5e-5, f (x) = xx 3/6 + x 5
  • Chebyshev: error máximo alrededor de 6e-7, f (x) = 0.999995x-0.1666016x 3 + 0.0081215x 5

Rango = -pi / 4 a + pi / 4, grado 7 (4 términos)

  • Taylor: error máximo alrededor de 3e-7, f (x) = xx 3/6 + x 5 /120-x 7/5040
  • Chebyshev: error máximo alrededor de 1.2e-9, f (x) = 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7

Creo que están calculados con Taylor Series o CORDIC . Algunas aplicaciones que hacen un uso intensivo de las funciones trigonométricas (juegos, gráficos) construyen tablas trigonométricas cuando se inician para que puedan buscar valores en lugar de volver a calcularlos una y otra vez.

Vea el artículo de Wikipedia sobre funciones trigonométricas. Un buen lugar para aprender sobre su implementación en código es Recetas numéricas .

No soy muy matemático, pero mi comprensión de dónde provienen el pecado, el coseno y el bronceado es que, en cierto sentido, se observan cuando trabajas con triangularjs en ángulo recto. Si tomas medidas de las longitudes de los lados de un grupo de triangularjs en ángulo recto diferentes y trazas los puntos en un gráfico, puedes sacar pecado, cos y tan de eso. Como señala Harper Shelby, las funciones simplemente se definen como propiedades de triangularjs en ángulo recto.

Se logra una comprensión más sofisticada al comprender cómo estas relaciones se relacionan con la geometría del círculo, lo que conduce a radianes y toda esa bondad. Está todo allí en la entrada de Wikipedia.

Más comúnmente para computadoras, la representación de series de potencias se usa para calcular los senos y cosenos y estos se usan para otras funciones trigonométricas. La ampliación de estas series a aproximadamente 8 términos computa los valores necesarios para una precisión cercana al épsilon de la máquina (el número más pequeño de punto flotante distinto de cero que se puede mantener).

El método CORDIC es más rápido ya que se implementa en hardware, pero se usa principalmente para sistemas integrados y no para computadoras estándar.

Si estás pidiendo una explicación más física del pecado, el coseno y el bronceado, considera cómo se relacionan con los triangularjs en ángulo recto. El valor numérico real de cos (lambda) se puede encontrar formando un triángulo en ángulo recto con uno de los angularjs que es lambda y que divide la longitud del lado de los triangularjs adyacente a lambda por la longitud de la hipotenusa. Similarmente para el pecado usa el lado opuesto dividido por la hipotenusa. Para tangente use el lado opuesto dividido por el lado adyacente. El clásico memonic para recordar esto es SOHCAHTOA (pronunciado socatoa).