TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Picuino en 09 de Octubre de 2012, 16:55:27
-
En ocasiones es necesario calcular la función seno en un microcontrolador, pero muchos microcontroladores pequeños no tienen espacio para las librerías matemáticas necesarias.
En otras ocasiones se necesita calcular con rapidez la función seno y se puede permitir un pequeño error.
Un ejemplo de aplicación sería calcular las coordenadas x, y para dibujar un círculo en un plotter. Otra aplicación práctica podría ser calcular la posición x,y de un brazo giratorio a partir de su ángulo de giro.
La siguiente función devuelve el resultado de sen(x) para x dado en radianes en el intervalo (-pi/2 hasta pi/2) con un error máximo de 0.00012:
x2 = x * x
sen = x*(0.9998 - x2*(0.16574 - x2*0.007514))
Hay que calcular 4 multiplicaciones y dos restas en coma flotante.
También es necesario utilizar un número en coma flotante auxiliar (x2) para reducir cálculos y ganar en velocidad.
Los cálculos también se pueden realizar de forma desarrollada:
x2 = x * x
sen = 0.007514
sen = sen * x2
sen = sen - 0.16574
sen = sen * x2
sen = sen + 0.9998
sen = sen * x
Los cálculos se pueden realizar para mayor rapidez con números en coma flotante de 24 bits (8 bits de exponente y 16 bit de mantisa)
El error máximo es de 0.00012 para todo el intervalo.
Saludos.
-
También se puede utilizar otra función que calcule sen(x*pi/2) con lo cual el intervalo de valores de x varía de -1 a +1, representando -1=-90 grados y +1=90 grados:
x2 = x * x
sen(x*pi/2) = x*(1.5705 - x2*(0.64237 - x2*0.07185))
Saludos.
-
Calcular el coseno es sencillo a partir de la función seno:
cos(x) = sen(90º - x)
Aplicado al primer ejemplo, con x en radianes:
cos(x) = sin(1.5708 - x)
Aplicado al segundo ejemplo, con x en valores de 0 a 1:
cos(x) = sin(1 - x)
Saludos
-
Marcado en favoritos...
Gracias!
-
Gracias Picuino por el aporte, muy valioso, en este orden de ideas como puedo calcular el aseno de un número, en un aplicación lo utilizo con la librería math pero consume demasiada memoria.
Saludos.
-
Se agradece!
-
Gracias Picuino por el aporte, muy valioso, en este orden de ideas como puedo calcular el aseno de un número, en un aplicación lo utilizo con la librería math pero consume demasiada memoria.
Saludos.
El arcoseno no es tan sencillo de calcular. Hay que calcular una raíz cuadrada primero:
asin(x) = 1,5707963 - sqrt(1-x)*(1.5707288 - 0.2121144*x + 0.0742610*x^2 - 0.0187293*x^3)
El error máximo es de 0.00005
Según Abramowitz and Stegun 4.4.45: http://people.math.sfu.ca/~cbm/aands/page_81.htm
Saludos.