C 如何实现泰勒级数的停止准则?

C 如何实现泰勒级数的停止准则?,c,taylor-series,C,Taylor Series,我正在编写一个C程序来计算e^x,并在系统满足关系x^k/k时停止 xk/k!在您的条件下,是您系列中的当前术语。你们还不知道e是什么,因为你们在计算它,所以你们必须用迄今为止的项的总和来估计它 double x = 1.0; double e = 1.0; double t = 1.0e-8; int k; for (k = 1; ; k++) { double a = pow(x, k) / fact(k); e += a; if (e * a <

我正在编写一个C程序来计算
e^x
,并在系统满足关系
x^k/k时停止 xk/k!在您的条件下,是您系列中的当前术语。你们还不知道e是什么,因为你们在计算它,所以你们必须用迄今为止的项的总和来估计它

double x = 1.0;
double e = 1.0;

double t = 1.0e-8;

int k;

for (k = 1; ; k++) {
    double a = pow(x, k) / fact(k);
    
    e += a;
    if (e * a < t) break;
}
double x=1.0;
双e=1.0;
双t=1.0e-8;
int k;
对于(k=1;;k++){
双a=功率(x,k)/事实(k);
e+=a;
如果(e*a
这里,a随每项减小,因此级数收敛,最终满足终止条件。(如果x是−1,该标准将立即得到满足,因为累计e为0。您的程序可能应使用关系e处理负值(−x) =1/e(x)

但有一个问题:由于阶乘增长很快,这些项迅速减少。使用32位整数,最多可以表示12!,wit 64位整数,最高可达20!。根据您的容差,您可能需要更高的阶乘。每次从一开始就重新计算阶乘也是低效的

此类序列的常用方法是用前一个术语ak表示ak− 1.该系列为:

    前任≈ 1+x/1+x·x/1·2+x·x·x/1·2·3+x·x·x·x·x·1·2·3·4+

因此:

    ak=ak− 1·x/k

您的程序现在可以是:

double x = 1.0;
double e = 1.0;
double a = 1.0;

double t = 1.0e-8;

int k;
for (k = 1; ; k++) {
    a *= x / k;
    
    e += a;
    if (e * a < t) break;
}
double x=1.0;
双e=1.0;
双a=1.0;
双t=1.0e-8;
int k;
对于(k=1;;k++){
a*=x/k;
e+=a;
如果(e*a
xk/k!在您的条件下,是您系列中的当前术语。你们还不知道e是什么,因为你们在计算它,所以你们必须用迄今为止的项的总和来估计它

double x = 1.0;
double e = 1.0;

double t = 1.0e-8;

int k;

for (k = 1; ; k++) {
    double a = pow(x, k) / fact(k);
    
    e += a;
    if (e * a < t) break;
}
double x=1.0;
双e=1.0;
双t=1.0e-8;
int k;
对于(k=1;;k++){
双a=功率(x,k)/事实(k);
e+=a;
如果(e*a
这里,a随每项减小,因此级数收敛,最终满足终止条件。(如果x是−1,该标准将立即得到满足,因为累计e为0。您的程序可能应使用关系e处理负值(−x) =1/e(x)

但有一个问题:由于阶乘增长很快,这些项迅速减少。使用32位整数,最多可以表示12!,wit 64位整数,最高可达20!。根据您的容差,您可能需要更高的阶乘。每次从一开始就重新计算阶乘也是低效的

此类序列的常用方法是用前一个术语ak表示ak− 1.该系列为:

    前任≈ 1+x/1+x·x/1·2+x·x·x/1·2·3+x·x·x·x·x·1·2·3·4+

因此:

    ak=ak− 1·x/k

您的程序现在可以是:

double x = 1.0;
double e = 1.0;
double a = 1.0;

double t = 1.0e-8;

int k;
for (k = 1; ; k++) {
    a *= x / k;
    
    e += a;
    if (e * a < t) break;
}
double x=1.0;
双e=1.0;
双a=1.0;
双t=1.0e-8;
int k;
对于(k=1;;k++){
a*=x/k;
e+=a;
如果(e*a
你没有调用
tolerance()
,这可能是拼写错误('tolerance'中有一个n;你的声明和定义是自一致的,但省略了n)。看看连续术语之间的变化,比如用
if(fabs(prev_term-this_term)
你不调用
tolerance()
,这可能是拼写错误(“tolerance”中有一个n;你的声明和定义是自一致的,但省略了n)。看看连续术语之间的变化,比如用
if(fabs(prev_term-this_term)谢谢您的帮助,代码现在可以了,谢谢您的详细解释;)谢谢您的帮助,代码现在就可以了,谢谢您的详细解释;)