¿Cómo funcionan las funciones trigonométricas?

102

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 los han presentado como una caja negra. Si necesitas el seno o el coseno de algo, presionas el botón sin o cos en tu calculadora y listo. Lo cual está bien.

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

Jurassic_C
fuente
¿Está confundido acerca de qué son las funciones trigonométricas o cómo se implementan?
Kyle Cronin
15
Sé lo que son. Sé lo que hacen. Sé cómo determinar cuál necesito para qué propósito. Puedo contarte todo sobre la relación entre ángulos y distancias. Lo que estaba buscando estaba más en la línea de la respuesta de John D. Cook. Y todos los demás que mencionaron algoritmos reales
Jurassic_C
Esta es una buena pregunta. Por ejemplo, el seno, el coseno y la tangente son funciones trascendentales y son difíciles de resolver ... Por otro lado, se pueden definir usando una expansión simple de la serie de Taylor que le dará la respuesta correcta hasta cualquier grado finito de precisión. necesario.
Alex

Respuestas:

144

Primero, tienes que hacer algún tipo de reducción de rango. Las funciones de activación son periódicas, por lo que debe reducir los argumentos a un intervalo estándar. Para empezar, puede reducir los ángulos entre 0 y 360 grados. Pero al usar algunas identidades, se da cuenta de que podría arreglárselas con menos. Si calcula senos y cosenos para ángulos entre 0 y 45 grados, puede comenzar a calcular todas las funciones trigonométricas para todos los ángulos.

Una vez que ha reducido su argumento, la mayoría de chips utilizan un algoritmo CORDIC para calcular los senos y cosenos. Es posible que escuche a la gente decir que las computadoras usan la serie Taylor. Suena razonable, pero no es cierto. Los algoritmos CORDIC se adaptan mucho mejor a una implementación de hardware eficiente . ( Las bibliotecas de software pueden usar la serie Taylor, por ejemplo, en hardware que no admite funciones de activación). Puede haber algún procesamiento adicional, usando el algoritmo CORDIC para obtener respuestas bastante buenas, pero luego haciendo algo más para mejorar la precisión.

Hay algunas mejoras en lo anterior. Por ejemplo, para ángulos muy pequeños theta (en radianes), sin (theta) = theta con toda la precisión que tenga, por lo que es más eficiente simplemente devolver theta que usar algún otro algoritmo. Entonces, en la práctica, hay mucha lógica de casos especiales para exprimir todo el rendimiento y la precisión posibles. Es posible que los chips con mercados más pequeños no requieran tanto esfuerzo de optimización.

John D. Cook
fuente
4
Gran respuesta, aunque el CORDIC no necesita reducción de rango per se (de hecho, es esencialmente un algoritmo de reducción de rango por derecho propio); funciona bien para ángulos entre -pi / 2 y + pi / 2, por lo que solo tiene que hacer una rotación vectorial de 180 grados para ángulos fuera de ese rango.
Jason S
3
Las implementaciones que usan una aproximación polinomial a menudo pueden usar series de Taylor, pero normalmente deben usar coeficientes que se han determinado con el algoritmo de Remez. lolengine.net/blog/2011/12/21/better-function-approximations
Pascal Cuoq
1
Tenga en cuenta que la tabla de valores utilizada por CORDIC debe calcularse previamente. Por tanto, Taylor todavía podría utilizarse en "tiempo de compilación".
Rhubbarb
2
Parece que esta respuesta contradice la respuesta aceptada de alta calificación a esta pregunta similar: stackoverflow.com/questions/2284860/… . Esta respuesta dice que la función sin () se lleva a cabo principalmente en el hardware de nivel, mientras que el otro dice en C.
Perry
48

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

FYI: Si tiene limitaciones de precisión y rendimiento, la serie de Taylor no debe usarse para aproximar funciones con fines numéricos. (Guárdelos para sus 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 trabajo pésimo al distribuir la precisión de la aproximación de la función para que sea "perfecta" justo cerca del punto de evaluación; el error generalmente aumenta a medida que se aleja 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) en un intervalo x0 <x <x1, es de aproximación de Chebyshev ; consulte Recetas numéricas para una buena discusión. Tenga en cuenta que Tj (x) y Tk (x) en el artículo de Wolfram al que me vinculé usaron el cos y el coseno inverso, estos son polinomios y, en la práctica, usa una fórmula de recurrencia para obtener los coeficientes. Nuevamente, consulte Recetas numéricas.

editar: Wikipedia tiene un artículo semi-decente sobre teoría de aproximación . Una de las fuentes que citan (Hart, "Computer Approximations") está agotada (y las copias usadas tienden a ser caras), pero entra en muchos detalles sobre este tipo de cosas. (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 la serie de Taylor en un rango dado es mucho mayor que el error máximo de una aproximación de Chebyshev del mismo grado. (Para aproximadamente el mismo error, puede salirse con la suya 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 ventaja. Esto se debe a que la contribución de los polinomios de orden superior se reduce cuando el intervalo de aproximación es menor.
  3. Si no puede salirse con la suya con la reducción de rango, sus coeficientes deben almacenarse con más precisión.

No me malinterpretes: la serie Taylor funcionará correctamente para seno / coseno (con una precisión razonable para el rango de -pi / 2 a + pi / 2; técnicamente, con suficientes términos, puede alcanzar cualquier precisión deseada para todas las entradas reales, pero intente 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 la serie de Taylor ya que los coeficientes son fáciles de recordar. Pero las aplicaciones del mundo real para tener que escribir su propio pecado () o cos () son funciones tan poco frecuente que serías mejores resultados con una implementación eficiente para alcanzar una precisión deseada - el que la serie de Taylor es no .

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

  • Taylor: error max 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 max alrededor de 1.5E-4, f (x) = xx 3 /6 + x 5 /120 x 7 / 5.040
  • 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 max alrededor 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 max 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 max alrededor 3e-7, f (x) = xx 3 /6 + x 5 /120 x 7 / 5,04 mil
  • Chebyshev: error máximo alrededor de 1.2e-9, f (x) = 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7
Jason S
fuente
2
Este comentario es incorrecto. Hay un tiempo y un lugar para cada aproximación. Si no conoce el análisis suficiente para determinar la región de convergencia para CUALQUIER aproximación de serie, NO debería utilizarlo. Eso se aplica a las series Taylor, Chebyshev, Padé, etc. Las series de Taylor suelen ser lo suficientemente buenas.
kquinn
4
: encogimiento de hombros: No sé ustedes, pero nunca me ha interesado evaluar una función en un vecindario pequeño alrededor de un solo punto. Incluso un ajuste rápido de mínimos cuadrados en un intervalo es bastante fácil de hacer. Cualquiera que esté usando la serie de Taylor está perdiendo el punto.
Jason S
1
@kquinn: la región de convergencia para las aproximaciones de Chebyshev no es un concepto útil ya que el intervalo sobre el que se calculan es una entrada explícita al proceso.
Jason S
2
Votar a favor porque el respondedor sabía que Hart existe. : smile: Hart es la referencia clásica aquí, incluso si fue difícil de encontrar cuando compré una copia (impresa) hace 25 años. Vale cada centavo. La reducción del rango siempre que sea posible, junto con una aproximación adecuada, ya sea Pade, Chebychev, incluso series de Taylor, según corresponda, es un buen enfoque. Sin embargo, las aproximaciones de Pade o Chebychev suelen ser la mejor opción sobre una serie de Taylor.
3
??? ¿Cómo es eso diferente? La serie de Taylor hasta el grado 17 para calcular sin (x) de -2pi a + 2pi probablemente pueda ser superada por Chebyshev con un polinomio de séptimo o noveno grado. No tendría ningún problema en hacer la afirmación: "Si tiene limitaciones de tiempo al talar árboles, no debe usar una sierra de mano. Use una motosierra". Quizás debería reformular de "no debería" a algo como "No recomendaría usar la serie Taylor". Claro, podría usar la serie Taylor en algunos casos, pero su precisión y rendimiento serán problemáticos. Por rendimiento me refiero al tiempo de ejecución de la CPU.
Jason S
14

Creo que se calculan utilizando Taylor Series o CORDIC . Algunas aplicaciones que hacen un uso intensivo de 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.

Jon Galloway
fuente
6

Consulte el artículo de Wikipedia sobre funciones trigonométricas. Un buen lugar para aprender a implementarlos en el código es Recetas numéricas .

No soy un gran matemático, pero mi comprensión de dónde "vienen" sin, cos y tan es que, en cierto sentido, se observan cuando se trabaja con triángulos en ángulo recto. Si tomas medidas de las longitudes de los lados de un grupo de diferentes triángulos en ángulo recto y trazas los puntos en una gráfica, puedes obtener sin, cos y tan de eso. Como señala Harper Shelby, las funciones se definen simplemente como propiedades de triángulos en ángulo recto.

Se logra una comprensión más sofisticada al comprender cómo estas proporciones se relacionan con la geometría del círculo, lo que conduce a radianes y todas esas bondades. Todo está en la entrada de Wikipedia.

Parappa
fuente
1

Más comúnmente para las computadoras, la representación de series de potencia se usa para calcular senos y cosenos y estos se usan para otras funciones trigonométricas. Al expandir estas series a aproximadamente 8 términos, se calculan los valores necesarios con una precisión cercana a la épsilon de la máquina (el número de punto flotante más pequeño 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 computadoras estándar.

Joshua Howard
fuente
0

Me gustaría extender la respuesta proporcionada por @Jason S. Usando un método de subdivisión de dominio similar al descrito por @Jason S y usando aproximaciones de la serie de Maclaurin, una aceleración promedio (2-3) X sobre el tan (), sin () Se consiguieron las funciones cos (), atan (), asin () y acos () integradas en el compilador gcc con optimización -O3. Las mejores funciones de aproximación de la serie Maclaurin descritas a continuación lograron una precisión de doble precisión.

Para las funciones tan (), sin () y cos (), y para simplificar, un dominio superpuesto de 0 a 2pi + pi / 80 se dividió en 81 intervalos iguales con "puntos de anclaje" en pi / 80, 3pi / 80, ..., 161pi / 80. Luego se evaluaron y almacenaron tan (), sin () y cos () de estos 81 puntos de anclaje. Con la ayuda de las identidades trigonométricas, se desarrolló una única función de serie de Maclaurin para cada función trigonométrica. Cualquier ángulo entre ± infinito puede someterse a las funciones de aproximación trigonométrica porque las funciones primero trasladan el ángulo de entrada al dominio de 0 a 2pi. Esta sobrecarga de traducción se incluye en la sobrecarga de aproximación.

Se desarrollaron métodos similares para las funciones atan (), asin () y acos (), donde un dominio superpuesto de -1.0 a 1.1 se dividió en 21 intervalos iguales con puntos de ancla en -19/20, -17/20, .. ., 19/20, 21/20. Luego, solo se almacenó atan () de estos 21 puntos de anclaje. Nuevamente, con la ayuda de identidades trigonométricas inversas, se desarrolló una única función de serie de Maclaurin para la función atan (). Los resultados de la función atan () se utilizaron para aproximar asin () y acos ().

Dado que todas las funciones de aproximación de trigonométricas inversas se basan en la función de aproximación atan (), se permite cualquier valor de entrada de argumento de doble precisión. Sin embargo, la entrada del argumento a las funciones de aproximación asin () y acos () se trunca al dominio ± 1 porque cualquier valor fuera de él no tiene sentido.

Para probar las funciones de aproximación, se obligó a evaluar mil millones de evaluaciones de funciones aleatorias (es decir, al compilador de optimización -O3 no se le permitió omitir la evaluación de algo porque no se usaría algún resultado calculado). Para eliminar el sesgo de evaluar mil millones números aleatorios y procesando los resultados, se realizó primero el costo de una ejecución sin evaluar ninguna función trigonométrica o trigonométrica inversa. Este sesgo se restó luego de cada prueba para obtener una aproximación más representativa del tiempo real de evaluación de la función.

Tabla 2. Tiempo empleado en segundos ejecutando la función o funciones indicadas mil millones de veces. Las estimaciones se obtienen restando el costo de tiempo de evaluar mil millones de números aleatorios que se muestran en la primera fila de la Tabla 1 de las filas restantes en la Tabla 1.

Tiempo pasado en bronceado (): 18.0515 18.2545

Tiempo de permanencia en TAN3 (): 5,93853 6,02349

Tiempo pasado en TAN4 (): 6.72216 6.99134

Tiempo pasado en sin () y cos (): 19.4052 19.4311

Tiempo pasado en SINCOS3 (): 7.85564 7.92844

Tiempo pasado en SINCOS4 (): 9.36672 9.57946

Tiempo pasado en atan (): 15,7160 15,6599

Tiempo de permanencia en ATAN1 (): 6.47800 6.55230

Tiempo pasado en ATAN2 (): 7.26730 7.24885

Tiempo pasado en ATAN3 (): 8.15299 8.21284

Tiempo pasado en asin () y acos (): 36.8833 36.9496

Tiempo pasado en ASINCOS1 (): 10.1655 9.78479

Tiempo pasado en ASINCOS2 (): 10,6236 10,6000

Tiempo pasado en ASINCOS3 (): 12.8430 12.0707

(En aras de ahorrar espacio, no se muestra la Tabla 1). La Tabla 2 muestra los resultados de dos corridas separadas de mil millones de evaluaciones de cada función aproximada. La primera columna es la primera ejecución y la segunda columna es la segunda ejecución. Los números '1', '2', '3' o '4' en los nombres de las funciones indican el número de términos usados ​​en la función de serie de Maclaurin para evaluar la aproximación trigonométrica particular o trigonométrica inversa. SINCOS # () significa que tanto sin como cos se evaluaron al mismo tiempo. Asimismo, ASINCOS # () significa que tanto asin como acos fueron evaluados al mismo tiempo. Hay pocos gastos generales adicionales al evaluar ambas cantidades al mismo tiempo.

Los resultados muestran que aumentar el número de términos aumenta ligeramente el tiempo de ejecución como cabría esperar. Incluso el número más pequeño de términos dio una precisión de entre 12 y 14 dígitos en todas partes, excepto por la aproximación tan () cerca de donde su valor se acerca a ± infinito. Uno esperaría que incluso la función tan () tuviera problemas allí.

Se obtuvieron resultados similares en una computadora portátil MacBook Pro de gama alta en Unix y en una computadora de escritorio de gama alta en Linux.

Roger Wehage
fuente
-5

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

Jeff
fuente