Autor Tema: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas  (Leído 16646 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #15 en: 14 de Mayo de 2014, 20:54:51 »
En realidad las funciones trascendentes (seno, coseno, tangente, logaritmos, etc) no se implementan con tablas, sino con polinomios.

Vaya Picuino, me siento rebasado con lo que algunos de ustedes llegan a saber. Gracias por dejar claro que se puede implementar todo en el PIC, justo como los algoritmos que Manolo también publicó.

Saludos  :angel:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #16 en: 14 de Mayo de 2014, 22:59:26 »
En la Universidad era normal al ver aplicaciones de las Series de Taylor, ejemplos de aproximación para las funciones trigonométricas.

De hecho, recuerdo que Chaly29, hace muchos años, buscando una manera sencilla de implementar un seno y coseno en assembler, utilizó una serie de taylor para realizar el cálculo. Si hablamos sólo de seno y coseno, técnicamente sólo hace falta una de las dos implementar, ya que la otra se obtiene desplazando el ángulo en PI/2.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #17 en: 14 de Mayo de 2014, 23:17:57 »
Me sigo sintiendo rebasado estimado Bruno.  :mrgreen:

Mi educación matemática no es tan fuerte, pero lo bueno es que siempre hay alguien que puede ayudarme.  :grin:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #18 en: 14 de Mayo de 2014, 23:45:45 »
Pues tampoco me considero el haz de la matemática, aunque sí he padecido de muchísima, junto con álgebra y física durante mi formación, por lo que no sé si sentirme afortunado o no. :D

Técnicamente una serie no es más que un polinomio infinito (que obviamente uno hace finito al aplicarlo) y que sigue un determinado patrón. Por lo que no se aleja mucho de los polinomios que mencionó Picuino previamente. Las calculadoras científicas calculan las funciones trigonométricas por aproximación también, siguiendo métodos similares. No hay tablas, como bien dijo Picuino.

Saludos!!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #19 en: 14 de Mayo de 2014, 23:47:40 »
Entendido  :mrgreen:

A veces yo preferiría haber sufrido más con las matemáticas jeje

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #20 en: 14 de Mayo de 2014, 23:51:29 »
Entendido  :mrgreen:

A veces yo preferiría haber sufrido más con las matemáticas jeje

Masoquista!!! :mrgreen:

------------------------------------

La verdad yo me siento mas alejado matemáticamente  :oops: xD también me falto estudiarle mas en la escuela pero mucho,bueno en mate y otras  :D
« Última modificación: 14 de Mayo de 2014, 23:54:59 por AKENAFAB »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #21 en: 14 de Mayo de 2014, 23:52:21 »
Entendido  :mrgreen:

A veces yo preferiría haber sufrido más con las matemáticas jeje

Masoquista!!! :mrgreen:



jajajaj  :mrgreen:

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #22 en: 15 de Mayo de 2014, 06:33:50 »
En la Universidad era normal al ver aplicaciones de las Series de Taylor, ejemplos de aproximación para las funciones trigonométricas.

De hecho, recuerdo que Chaly29, hace muchos años, buscando una manera sencilla de implementar un seno y coseno en assembler, utilizó una serie de taylor para realizar el cálculo. Si hablamos sólo de seno y coseno, técnicamente sólo hace falta una de las dos implementar, ya que la otra se obtiene desplazando el ángulo en PI/2.

Saludos!

Las series de taylor aproximan una función muy bien cerca del punto x=0
A medida que nos alejamos de ese punto, el error se va haciendo mayor.


Los polinomios de Chebyshev aproximan muy bien una función en todo un intervalo (por ejemplo de x=0 a x=PI/2)
Dentro de ese intervalo, el error absoluto se mantiene constante
Fuera de ese intervalo, el error se va haciendo mayor.

A la hora de aproximar una función en un intervalo (no en un punto), es mejor utilizar estos últimos.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #23 en: 15 de Mayo de 2014, 08:33:10 »
Chebyshev Polynomial Approximator Code Generator:

   http://www.goddard.net.nz/files/js/chebyshev/cheby.html


Ejemplo de función seno aproximada con grado 5:
Código: [Seleccionar]
const float my_sin_coefficients[] = {
  0.5692364413309924,
  -0.667166678115238,
  0.1111230022470422
};

float my_sin(float x) {

  float xt2 = x * 2;
  float b_5 = coefficients[2];
  float b_4 = b_5 * xt2;
  float b_3 = b_4 * xt2 + coefficients[1] - b_5;
  float b_2 = b_3 * xt2 - b_4;
  float b_1 = b_2 * xt2 + coefficients[0] - b_3;
  float b_0 = x * b_1 - b_2;
  return b_0;
}

Saludos.
« Última modificación: 15 de Mayo de 2014, 08:40:22 por Picuino »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #24 en: 15 de Mayo de 2014, 11:34:32 »
Perdón por el off-topic, Picuino es un lujo para el foro tener un forista como vos.

Saludos !

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #25 en: 16 de Mayo de 2014, 18:58:11 »
Muchas gracias RICHI

Este tema me interesó mucho en su momento porque me apasionan las calculadoras y los métodos matemáticos que utilizan.

Más tarde descubrí que esos métodos (como los polinomios de Chebyshev), sirven para aproximar cualquier función que quieras.
Puedes utilizarlos para compensar la frecuencia de un oscilador con la temperatura (como en los TCXO), para linelizar el comportamiento de sensores (sondas de temperatura NTC, Termopares, LDR, etc.) y muchas más aplicaciones prácticas.
Merece la pena aprender un poco de estos polinomios. No es necesario meterse de lleno en las matemáticas que hay por debajo, basta con saber manejar un paquete de matemáticas y llamar a la función que te da los coeficientes.

Saludos.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #26 en: 16 de Mayo de 2014, 18:59:49 »
Muchas gracias RICHI

Este tema me interesó mucho en su momento porque me apasionan las calculadoras y los métodos matemáticos que utilizan.

Más tarde descubrí que esos métodos (como los polinomios de Chebyshev), sirven para aproximar cualquier función que quieras.
Puedes utilizarlos para compensar la frecuencia de un oscilador con la temperatura (como en los TCXO), para linelizar el comportamiento de sensores (sondas de temperatura NTC, Termopares, LDR, etc.) y muchas más aplicaciones prácticas.
Merece la pena aprender un poco de estos polinomios. No es necesario meterse de lleno en las matemáticas que hay por debajo, basta con saber manejar un paquete de matemáticas y llamar a la función que te da los coeficientes.

Saludos.

+1

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #27 en: 28 de Julio de 2014, 19:37:25 »
hola, estoy usando en ccs el código que implementó migsantiago , según las coordenadas que uso en google maps   hay 96 metros, cuando compilo en el micro la función me retorna 68.58m, tambien lo probé con distancias mas grandes de 3.8km segun google maps y el micro devuelve 2.7km.
pongo el código por si ven algo raro

Código: [Seleccionar]
#INCLUDE <24FJ64GA002.h>
#INCLUDE <MATH.H>
#FUSES ICSP1, NOWDT, NODEBUG, NOPROTECT, NOJTAG, FRC, NOWINDIS, NOPR, IOL1WAY, OSCIO, NOCKSFSM, NOIESO
#USE DELAY(clock=8000000)
 
#PIN_SELECT U2TX=pin_b2
#PIN_SELECT U2RX=pin_b3
#PIN_SELECT U1TX=pin_b5
#PIN_SELECT U1RX=pin_b4

#use rs232(baud=9600, Xmit=pin_b5, rcv=pin_b4,   STREAM=UART1)  //PC
#use rs232(baud=9600, Xmit=pin_B2, rcv=pin_b3,   STREAM=UART2) //GPS

#define SIM_EARTH_RADIUS   (6372797.560856)
   
FLOAT LAT1=3.427318;
FLOAT LON1=-76.499700 ;
FLOAT LAT2= 3.427912;
FLOAT LON2=-76.499072;
 
float Degree_to_Radian(float x);
void SIM_GPS_Distance(float lat1, float lon1, float lat2, float lon2);



void main()
{

while(true)
{
SIM_GPS_Distance(lat1,lon1,lat2,lon2);

}

}



  float Degree_to_Radian(float x)
{
   return (x * 0.017453292);
}

void  SIM_GPS_Distance(float lat1, float lon1, float lat2, float lon2)
{
   float delta_lat;
   float delta_lon;
   float a;
   float c;
   float dist;

   lat1 = Degree_to_Radian(lat1);
   lat2 = Degree_to_Radian(lat2);

   delta_lat = Degree_to_Radian(lat2 - lat1);
   delta_lon = Degree_to_Radian(lon2 - lon1);

   a = sin(delta_lat / 2.0) * sin(delta_lat / 2.0) +
         cos(lat1) * cos(lat2) *
         sin(delta_lon / 2.0) * sin(delta_lon / 2.0);
   c = 2.0 * atan2(sqrt(a), sqrt(1.0 - a));
   dist = SIM_EARTH_RADIUS * c;

   FPRINTF(UART1,"%f",dist);
   while(1){}
   
}
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #28 en: 28 de Julio de 2014, 20:18:43 »
Hola Jhozate, ¿de qué precisión son los float en CCS?

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: [RESUELTO] XC8 - Mejorar precisión de funciones trigonométricas
« Respuesta #29 en: 28 de Julio de 2014, 21:12:46 »
Hola Jhozate, ¿de qué precisión son los float en CCS?

32bits para float en ccs  :mrgreen: