cos(x) 通过 MacLaurin 级数的图只得到第一个结果正确
Graph of cos(x) through MacLaurin series only getting the first result right
我正在尝试创建一个程序来比较通过 MacLaurin 级数计算函数的效率。
想法是:在 -Pi 和 Pi(100 个间隔)之间绘制 cos(x) 的图形(使用 gnuplot),使用其麦克劳林级数的前 4 项计算 cos(x),然后,前 6术语,并比较它们之间的图形。
Cos(x) through MacLaurin.
因此,为了使用 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...
在 serie()
函数中使用未初始化的 s
(我已根据自己的喜好随意格式化代码)。
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;
}
我正在尝试创建一个程序来比较通过 MacLaurin 级数计算函数的效率。
想法是:在 -Pi 和 Pi(100 个间隔)之间绘制 cos(x) 的图形(使用 gnuplot),使用其麦克劳林级数的前 4 项计算 cos(x),然后,前 6术语,并比较它们之间的图形。 Cos(x) through MacLaurin. 因此,为了使用 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...
在 serie()
函数中使用未初始化的 s
(我已根据自己的喜好随意格式化代码)。
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;
}