SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: sanlegas2000 en Domingo 19 de Junio de 2011, 16:54

Título: funcion de taylor
Publicado por: sanlegas2000 en Domingo 19 de Junio de 2011, 16:54
Bueno me dejaron hacer la serie de taylor, me base en este libro(les adjuto la imagen)
el caso es que si funciona para ese problema(solo se pasa por unas centesimas) pero cuando pongo otros valores como 90, por ejemplo sen de 90 es uno, me deberia de dar no se un numero cercano a , pero me da 1.4 y tanto , siento que el problema es que me como muchos centecimos o no se donde este si pueden ayudarme gracias.
imageshack.us/photo/my-images/38/taylot.png(aun no cuento con privilegios de subir imagen xD)
Código: C
  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include <math.h>
  5. #define pi 3.141592654
  6. int factorial(int n)
  7. {
  8.     int i;
  9.     int fac=1;
  10.     for (i=1;i<=n;i++)
  11.     {
  12.         fac=fac*i;
  13.     }
  14.     return  fac;
  15. }
  16. int main()
  17. {
  18.     float x=90,a=45,suma=1;
  19.     float z=(x-a)/180*pi;
  20.     int i;
  21.     int iteraciones=15;
  22.     float e,r,t;
  23.     e=(float)1/90;
  24.     float param=90,resul;
  25.     resul=sin(param*pi/180);
  26.     for (i=1;i<iteraciones;i++)
  27.     {
  28.        
  29.     if(i%4==1 || i%4==2)
  30.        
  31.             suma=suma+pow(z,i)/factorial(i);
  32.        
  33.         if(i%4==3|| i%4==0)
  34.            
  35.         suma=suma+(-1)*(pow(z,i)/factorial(i));
  36.        
  37.         }
  38.         e=sin(a*pi/180);
  39.    
  40.     printf(" %.15fn",suma*e);
  41.  
  42.     return 0;
  43. }
  44.  
Título: Re: funcion de taylor
Publicado por: Checho360 en Miércoles 22 de Junio de 2011, 22:07
Es fácil. El código solucionado, si no me equivoco, es este:

Código: C++
  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include <math.h>
  5. #define pi 3.141592654
  6. int factorial(int n)
  7. {
  8.     int i;
  9.     int fac=1;
  10.     for (i=1;i<=n;i++)
  11.     {
  12.         fac=fac*i;
  13.     }
  14.     return  fac;
  15. }
  16. int main()
  17. {
  18.     float x=90,a=45,suma=1;
  19.     float z=(x-a)/180*pi;
  20.     int i;
  21.     int iteraciones=15;
  22.     float e,r,t;
  23.     e=(float)1/90;
  24.     float param=90,resul;
  25.     resul=sin(param*pi/180);
  26.     for (i=1;i<iteraciones;i++)
  27.     {
  28.        
  29.     if(i%4==1 || i%4==0)
  30.        
  31.             suma=suma+pow(z,i)/factorial(i);
  32.        
  33.         if(i%4==3|| i%4==2)
  34.            
  35.         suma=suma+(-1)*(pow(z,i)/factorial(i));
  36.        
  37.         }
  38.         e=sin(a*pi/180);
  39.    
  40.     printf(" %.15fn",suma*e);
  41.  
  42.     return 0;
  43. }
  44.  

El problema estaba en que si divides el número de la "iteración" entre 4 (utilizando ambos como enteros), y analizas el resto, se dan las cuatro opciones que tenías expresadas: 0, 1, 2, 3, pero sólo obtienes como resto 0 y 1 cuando la derivada enésima de la función es positiva (para el punto que escogiste), y, con lo cual, los restos 2 y 3 coinciden cuando el signo es negativo. Si intercambias eso la solución es: 0.999999940395355 que es una tolerancia bastante pequeña al menos para utilizar la serie de Maclaurin.

Un saludo!
Título: Re: funcion de taylor
Publicado por: sanlegas2000 en Jueves 7 de Julio de 2011, 04:40
gracias amigo por tomarte la molestia en responder, gracias por la aclaracion B)