Autor Tema: Calcular la función seno rápidamente y en poco espacio  (Leído 2039 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5598
    • Picuino
Calcular la función seno rápidamente y en poco espacio
« 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:

Código: [Seleccionar]
    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:   
Código: [Seleccionar]
    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.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5598
    • Picuino
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #1 en: 09 de Octubre de 2012, 16:59:33 »
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:

Código: [Seleccionar]
  x2 = x * x

   sen(x*pi/2) = x*(1.5705 - x2*(0.64237 - x2*0.07185))

Saludos.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5598
    • Picuino
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #2 en: 09 de Octubre de 2012, 17:01:52 »
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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #3 en: 09 de Octubre de 2012, 17:50:36 »
Marcado en favoritos...

Gracias!
-
Leonardo Garberoglio

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1085
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #4 en: 09 de Octubre de 2012, 23:30:10 »
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.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #5 en: 10 de Octubre de 2012, 01:11:21 »
Se agradece!

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5598
    • Picuino
Re: Calcular la función seno rápidamente y en poco espacio
« Respuesta #6 en: 10 de Octubre de 2012, 17:15:58 »
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.
« Última modificación: 10 de Octubre de 2012, 17:19:39 por Picuino »