【问题标题】:How to implement stopping criteria Taylor series?如何实现停止标准泰勒级数?
【发布时间】:2021-04-04 04:45:30
【问题描述】:

我正在编写一个 C 程序来计算 e^x 并在系统满足关系 x^k/k!<t/e 时停止,其中 t 是固定容差。 我不知道如何实现最后一个条件,因为在代码中,k 的值不应该是已知的,它总是给我错误的结果。 这是我在知道 k 时写的代码;我该如何修改?

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

int factorial(int);
double tolerace();

int main() {

    int n;

    double x, k;
    double value, ex;

    value = ex = 0.0;

    printf("Enter the value for x and n");
    scanf("%lf %d", & x, & n);

    for (k = 1; k <= n; k++) {
        value = pow(x, k);
        ex = ex + value / factorial(k);
    }
    ex = ex + 1;
    printf("Result  %lf", ex);

    return 0;
}

int factorial(int n) {
    int j, fact = 1;

    for (j = n; j > 0; j--)
        fact = fact * j;
    return fact;
}

double tolerace() {
    double t, m;
    m = pow(10, (-4));
    do {
        printf("\n range of tolerance 0<t<= 10^-4: ");
        scanf("%lf", & t);
    }
    while (t < 0 || t > m);
    return t;
}

我尝试定义 e 的值并创建一个 while 循环,但它不起作用:(

【问题讨论】:

  • 你不要调用tolerance(),这可能是拼写错误('tolerance' 有一个 n;你的声明和定义是自洽的,但省略了 n)。
  • 看连续词之间的变化,比如if(fabs(prev_term - this_term) &lt; epsilon) break;

标签: c taylor-series


【解决方案1】:

xk/k! in your condition 是您系列中的当前术语。你还不知道你的 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;
}

在这里,a 随每一项而减小,因此级数收敛并最终满足终止标准。 (如果 x 为 -1,则将立即满足标准,因为累积的 e 为 0。您的程序可能应该处理具有关系 e(-x) = 1 / e(x) 的负值。)

但是有一个问题:项会迅速减少,因为阶乘增长很快。使用 32 位整数,您最多可以表示 12!,而 64 位整数最多可以表示 20!。根据您的容忍度,您可能需要更高的阶乘。每次从头开始重新计算阶乘也是低效的。

此类序列的常用方法是用前项 ak - 1 表示 ak。该系列是:

    ex ≈ 1   +   x / 1   +   x·x / 1·2   +   x·x·x / 1·2·3   +   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;
}

【讨论】:

  • 感谢您的帮助,代码现在可以了,感谢您的详细解释;)
猜你喜欢
  • 2021-04-09
  • 2020-04-21
  • 2019-08-31
  • 2014-04-03
  • 1970-01-01
  • 2021-11-13
  • 2017-08-21
  • 2011-11-04
  • 2017-12-02
相关资源
最近更新 更多