1

I'm trying to create a program that compares the efficiency of calculating a function through MacLaurin series.

The idea is: Make a graph (using gnuplot) of cos(x) between -Pi and Pi (100 intervals) calculating cos(x) using the first 4 terms of its MacLaurin series, then, the first 6 terms, and comparing the graph between them. Cos(x) through MacLaurin. So, to use gnuplot, I made the code below that gets 2 files with the data I need, however, when i run the code only the first result is correct. For the first 4 terms my file is: -3.141593 -9.760222e-001 -3.078126 2.367934e+264 And the rest of what would be my Y axis is just 2.367934e+264 repeated over and over. The 6 terms file is also just that number. X axis is fine.

I'm fairly new to coding and just don't know what i'm doing wrong. Any help would be appreciated. Here's the code:

 #include <stdio.h>
#include <math.h>
#define X_INI -M_PI
#define X_FIM M_PI
#define NI 100
int fatorial(int);
double serie(int ,double );
int main()
{
    double x, y[NI], dx;
    int i;
    FILE *fp[3];
    fp[0]=fopen("4Termos.dat","w");
    fp[1]=fopen("6Termos.dat","w");
    x=X_INI;
    dx = (X_FIM - X_INI)/ (NI - 1);
    for(i=0; i<NI; i++){
        y[i]=serie(4,x);
        fprintf(fp[0],"%lf %e\n", x, y[i]);
        y[i]=serie(6,x);
        fprintf(fp[1],"%lf %e\n", x, y[i]);
        x = x + dx;
        }
    return 0;
}
int fatorial(int n) {

 int i,p;
 p = 1;
 if (n==0)
 return 1;
 else {
 for (i=1;i<=n;i++)
 p = p*i;
 return p;
 }
}
double serie(int m, double z){
double s;
int j;
 for(j = 0; j < m+1; j++)
    {
        s = s + ( ( pow((-1) , j))*pow(z, (2*j)) ) / (fatorial(2*j));

    }
return s;
}

Fatorial is used to calculate factorial, serie used to calculate MacLaurin...

  • Not 100% sure is the same issue, but read this post I made a while back: https://stackoverflow.com/a/67665601/2988730. It's python, but you shouldn't have any trouble following it – Mad Physicist Jul 04 '21 at 06:47

1 Answers1

0

Use of uninitialized s in serie() function (I've taken the liberty to format the code to my liking).

double serie(int m, double z) {
    double s;                                   // better: double s = 0;
    int j;
    for (j = 0; j < m + 1; j++) {
        s += pow(-1, j) * pow(z, 2 * j) / fatorial(2 * j);
    }
    return s;
}
pmg
  • 106,608
  • 13
  • 126
  • 198