Publi

Algoritmos: Factorial y cálculo del seno por la serie de MacLaurin (Taylor alrededor de 0) en C

Algo más matemático vuelvo cuando propongo lo siguiente. Vamos a calcular un seno con la serie de MacLaurin. Ésta es la fórmula, extraída de Wikipedia.sin_maclaurin

Y este el algoritmo en C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define PI 3.141592653588

unsigned factorial(int n)
{
  if (n<1)
    return 1;
 
  return n*factorial(n-1);
}

double senoTaylor(double n)
{
  double t=0;
  int i;

  short signo=(n>=0);
  n=fabs(n);            /* Calculamos el valor absoluto */

  while (n>PI)      /* Reducimos el ángulo, de dos en dos cuadrantes*/
    {
      n-=PI;            /* 1 vuelta = 2PI radianes */
      signo=!signo;     /* cada PI, el signo cambia */
    }

  for (i=0; i<9; i++)
    t+=pow(-1, i)*pow(n, 2*(double)i+1)/(double)factorial(2*i+1);

  if (!signo)           /* Cambiamos el signo del ángulo */
    t*=-1;

  return t;
}

Con este algoritmo, cuantas más iteraciones demos, más preciso será el cálculo, aunque tenemos que tener cuidado de nos desbordar las variables, ya que el crecimiento de la función factorial es bastante rápido.

Es importante lo que hacemos al principio, el ángulo en radianes debe ser reducido, nos quedamos con un valor que esté siempre en la mitad superior del eje X (cuadrantes 1 y 2), este algoritmo es mejor con valores pequeños. Sería incluso mejor quedarnos con el ángulo en el primer cuadrante para que mejore la precisión.

Para probar el algoritmo, podemos utilizar este programa, en él utilizamos la función sin() de math.h y la comparamos con esta nueva función (aunque sin es más rápida y mejor, dejamos esta función de Taylor o MacLaurin con fines educativos):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
*************************************************************
* @file senoMaclaurin.c
* @brief Cálculo del seno con el algoritmo de MacLaurin
*
* @author Gaspar Fernández <blakeyed@totaki.com>
* http://totaki.com/poesiabinaria/algoritmos/
*
* Compilar con:
*   $ gcc -o senoMaclaurin senoMaclaurin.c -lm
* para incluir la biblioteca matemática
*************************************************************/


#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define PI 3.141592653588

unsigned factorial(int n)
{
  if (n<1)
    return 1;
 
  return n*factorial(n-1);
}

double senoTaylor(double n)
{
  double t=0;
  int i;

  short signo=(n>=0);
  n=fabs(n);            /* Calculamos el valor absoluto */

  while (n>PI)      /* Reducimos el ángulo, de dos en dos cuadrantes*/
    {
      n-=PI;            /* 1 vuelta = 2PI radianes */
      signo=!signo;     /* cada PI, el signo cambia */
    }

  for (i=0; i<9; i++)
    t+=pow(-1, i)*pow(n, 2*(double)i+1)/(double)factorial(2*i+1);

  if (!signo)           /* Cambiamos el signo del ángulo */
    t*=-1;

  return t;
}

int main(int argc, char *argv[])
{
  double n;
  printf ("Introduzca un numero: ");
  scanf ("%lf", &n);

  printf ("sen: %lf\n", sin(n));
  printf ("sen: %lf\n", senoTaylor(n));

  return EXIT_SUCCESS;
}

Importante, para compilar el proyecto, debemos utilizar gcc con el modificador -lm para poder utilizar math.h correctamente.

Descargar: senomaclaurin.c (1.2Kb)

También podría interesarte...

There are 3 comments left Ir a comentario

  1. Pingback: BlogESfera.com /

  2. kovalevsky /
    Usando Google Chrome Google Chrome 18.0.1025.142 en Windows Windows 7

    Muy buen artículo Gaspar.

  3. Gaspar Fernández / Post Author
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

    @kovalevsky
    Muchas gracias !

Leave a Reply