Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Calculando el seno y el coseno con Taylor

Estas en el tema de Calculando el seno y el coseno con Taylor en el foro de C/C++ en Foros del Web. Hola buenas, estoy tratando de calcular el seno de un ángulo medido en radianes a partir del polinomio de Taylor, y una vez conocido este, ...
  #1 (permalink)  
Antiguo 17/11/2015, 12:27
 
Fecha de Ingreso: noviembre-2015
Ubicación: Madrid
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Pregunta Calculando el seno y el coseno con Taylor

Hola buenas, estoy tratando de calcular el seno de un ángulo medido en radianes a partir del polinomio de Taylor, y una vez conocido este, calcular el coseno del ángulo con la fórmula sen^2 x + cos^2 x = 1.

Tengo un código bastante aproximado, me está fallando en algo y no consigo saber en que. Me compila sin errores pero no me devuelve los resultados correctos. Intento cambiar cosas pero nada, me arroja desde 0 a direcciones de memoria, espero que alguien pueda decirme en que estoy fallando.

Gracias :)

Código c:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define PI 3.1415926
  6. #define UMBRAL 10e-6
  7.  
  8.  
  9. /* ---------- Declaración de los prototipos de las funciones ---------- */
  10.  
  11. double calcula_term_N (const double t_ant, const double x, const int n);
  12. void seno(double angulo, double *res);
  13. void coseno (const double angulo, double *res);
  14.  
  15.  
  16.  
  17. int main(void) {
  18.    
  19.     /* ---------- Declaración de variables ---------- */
  20.    
  21.     double angulo; /* Ángulo introducido por teclado */
  22.     double res; /* Resultado de la función seno */
  23.     double res_seno;
  24.     double res_coseno;
  25.    
  26.    
  27.    
  28.     /* ------------ Programa principal ------------- */
  29.    
  30.     printf("\n\n               ** Calculadora de funciones trigonometricas **");
  31.     printf("\n                    Aproximacion de la serie de McLaurin");
  32.    
  33.     printf("\n\n\nIntroduzca el valor del angulo en radianes: ");
  34.     scanf("%lf", &angulo);
  35.     while ( angulo > PI || angulo < -PI)
  36.     {
  37.         printf("Valor incorrecto");
  38.         printf("\n\nIntroduzca el valor del angulo en radianes: ");
  39.         scanf("%lf", &angulo);
  40.     }
  41.    
  42.    
  43.     printf("\n    - Angulo introducido: %f", angulo);
  44.    
  45.     /* Llamada a la función seno(); */
  46.     seno(angulo, &res);
  47.     printf("\n    - Seno de %f  : %f", angulo, res);
  48.    
  49.     /* Llamada a la función coseno(); */
  50.     coseno(angulo, &res);
  51.     printf("\n    - Coseno de %f: %f", angulo, res);
  52.    
  53.    
  54.     return 0;
  55. }
  56.  
  57.  
  58.  
  59. /* ---------- Definición de funciones ---------- */
  60.  
  61.  
  62. /* Calcula un término de la serie de McLaurin para la función seno */
  63. double calcula_term_N (const double t_ant, const double x, const int n)
  64. {
  65.     int termN;
  66.    
  67.     termN = ( (-1)*(t_ant)*(pow(x,2)) ) / ( 2*n*( (2*n) + 1) );
  68.    
  69.     return termN;  
  70. }
  71.  
  72.  
  73. /* Calcula el valor del seno del ángulo medido en radianes usando la función calcula_Term_N
  74.    para calcular cada término de la serie de McLaurin */
  75. void seno(double angulo, double *res)
  76. {
  77.     int t_actual; /* Almacena el valor del primer término */
  78.     int term; /* Término en el que se encuentra el bucle */
  79.     int t_ant; /* Término anterior al termino actual */
  80.    
  81.    
  82.     term=0; /* Se inicializa a 0 porque es el primer término */
  83.     *res=0; /* Al principio el resultado es 0 */
  84.     t_actual = angulo; /* Para la función seno, el valor del primer término coincide con el valor del ángulo */
  85.    
  86.    
  87.     /* Mientras el valor absoluto del término que se va a calcular sea menor que el UMBRAL, el bucle sigue ejecutándose */
  88.     while ( abs(t_actual) > UMBRAL )
  89.     {
  90.         /* Se contabiliza el término actual y se guarda en *res */
  91.         *res = *res + t_actual;
  92.         term++;
  93.        
  94.         /* El término anterior pasa a ser el término actual */
  95.         t_ant=t_actual;
  96.        
  97.         t_actual = calcula_term_N(t_ant, angulo, term);
  98.     }
  99.  
  100. }
  101.  
  102.  
  103. /* Calcula el valor del coseno de un ángulo medido en radianes usando la función seno, a partir de la fórmula sen^2 x + cos^2 x = 1 */
  104. void coseno (const double angulo, double *res)
  105. {      
  106.     if ( angulo < (PI/2) )
  107.     {
  108.         *res = -*res;
  109.     }
  110.  
  111.     *res = sqrt ( 1 - pow(*res, 2) );
  112. }

Última edición por david_rep_15; 17/11/2015 a las 12:46
  #2 (permalink)  
Antiguo 17/11/2015, 14:54
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Calculando el seno y el coseno con Taylor

Código C++:
Ver original
  1. int t_actual; /* Almacena el valor del primer término */
  2. int term; /* Término en el que se encuentra el bucle */
  3. int t_ant; /* Término anterior al termino actual */

Seguro que todas esas variables tienen que ser de tipo int???
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 17/11/2015, 15:08
 
Fecha de Ingreso: noviembre-2015
Ubicación: Madrid
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Calculando el seno y el coseno con Taylor

Cita:
Iniciado por eferion Ver Mensaje
Código C++:
Ver original
  1. int t_actual; /* Almacena el valor del primer término */
  2. int term; /* Término en el que se encuentra el bucle */
  3. int t_ant; /* Término anterior al termino actual */

Seguro que todas esas variables tienen que ser de tipo int???
La verdad es que t_actual y t_ant tienen que ser double, porque le estoy pasando el valor del ángulo a una y luego igualando con otra el valor del término que se va calculando, gracias por eso ^^ ah y termN también debe ser double.
Estoy trasteando un poco pero sin encontrar la solución definitiva.
  #4 (permalink)  
Antiguo 17/11/2015, 19:56
 
Fecha de Ingreso: noviembre-2015
Ubicación: Madrid
Mensajes: 5
Antigüedad: 8 años, 5 meses
Puntos: 0
Respuesta: Calculando el seno y el coseno con Taylor

El problema era el abs() que devolvia valores erróneos, lo solucione con un simple if else, y me funciona.

Etiquetas: funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:48.