首页 > 解决方案 > 通过 MacLaurin 级数的 cos(x) 图表仅获得第一个结果正确

问题描述

我正在尝试创建一个程序来比较通过 MacLaurin 系列计算函数的效率。

想法是:在 -Pi 和 Pi(100 个区间)之间绘制 cos(x) 的图(使用 gnuplot),使用其 MacLaurin 系列的前 4 项,然后,前 6 项计算 cos(x),并比较它们之间的图形。 Cos(x) 通过麦克劳林。 因此,为了使用 gnuplot,我编写了下面的代码,它获取了 2 个包含我需要的数据的文件,但是,当我运行代码时,只有第一个结果是正确的。对于前 4 个术语,我的文件是:-3.141593 -9.760222e-001 -3.078126 2.367934e+264 而我的 Y 轴的其余部分只是 2.367934e+264 一遍又一遍地重复。6 个术语文件也就是这个数字。X轴没问题。

我对编码很陌生,只是不知道我做错了什么。任何帮助,将不胜感激。这是代码:

 #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用来计算阶乘,serie用来计算MacLaurin...

标签: cmathgraphgnuplot

解决方案


使用未初始化sserie()函数(我冒昧地将代码格式化为我喜欢的格式)。

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;
}

推荐阅读