c - 泰勒定理 C

标签 c taylor-series

我有 cosh() 函数的泰勒定理的简单代码。

我试图发现一个错误 - 结果有时接近真实答案。

如何正确地做到这一点?

当我的开始为0,结束为5, segmentation 为5时,它给出了很好的结果,但是当我把5作为开始时以10为结束,结果与预期值相差较远。

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

int poww( float number, int a )
{
    float result = 1.0;
    int i;
    if( a != 0 );
    {
        for( i = 0; i < a; i++ ) {
            result = result * number;
        }
    }
    return result;
}

int factorial(int n)
{
    switch (n) {
    case 0:
        return 1;
        break;
    default:
        return n * factorial(n-1);
    }
}

void main()
{
    puts("Enter start: ");
    float start;
    scanf("%f", &start);

    puts("\nEnter end: ");
    float end;
    scanf("%f", &end);

    puts("\nSubintervals:");
    int subinterval;
    scanf("%d", &subinterval);

    float h = (end - start) / (float)subinterval;
    printf("h is : %3.2f \n", h);

    double x, result, temp;
    int n;

    for( x = start; x <= end; x += h) {
        result = 0;
        for(n = 0 ;  ; n++) {
            temp = poww(x, 2 * n) / (factorial( 2 * n ) * 1.0);
            if(temp < 0.00001) {
                break;
            } else {
                result = result + temp;
                printf("X = %f temp = %f, result = %f\n", x, temp, result);
            }
        }
        printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x) );
    }
    puts("Press any key...");
    getchar();
}

问题解决:

函数返回一个整数而不是 double ,我还将每个 float 更改为 double 。

最佳答案

全部更改float输入 double并使用double作为 factorial() 的返回类型和poww()函数也一样。在本例中,最后两个是最重要的。

此外,main() 上的返回类型应该是int ,不是void .

[我刚刚删除了 poww() 中的死 if 语句,并注意到该函数仅“加速”了 pow() 计算。如果您担心性能,请担心计算每一项的阶乘和幂,而不是将前一项乘以 x^2,然后除以 (2*n)*(2*n-1)。]

通过对代码的这个小修正,我得到了 4 到 10 之间的良好结果:

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

double poww( float number, int a )
{
    float result = 1.0;
    int i;
    for( i = 0; i < a; i++ )
    {
        result = result * number;
    }
    return result;
}

double factorial(int n)
{
     switch (n)
      {
            case 0: return 1;
                    break;
            default: return n * factorial(n-1);
      }
}

int main(){

    puts("Enter start: ");
    float start;
    scanf("%f", &start);

    puts("\nEnter end: ");
    float end;
    scanf("%f", &end);

    puts("\nSubintervals:");
    int subinterval;
    scanf("%d", &subinterval);

    float h = (end - start) / (float)subinterval;
    printf("h is : %3.2f \n", h);

    double x, result, temp;
    int n;

    for( x = start; x <= end; x += h){
        result = 0;
        for(n = 0 ;  ; n++){
            temp = poww(x, 2 * n) / (factorial( 2 * n ) * 1.0);
            if(temp < 0.00001){
                break; }
            else{
                result = result + temp;
                printf("X = %f temp = %f, result = %f\n", x, temp, result);
            }
        }
                printf("X = %f, result = %3.2f, cosH = %3.2f\n\n", x, result, cosh(x) );
    }

    puts("Press any key...");
    getchar();
    return 0;
}

关于c - 泰勒定理 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28572707/

相关文章:

c - 指数泰勒级数

c++ - C++-使用泰勒级数逼近估算cos(x)

c - C 编程中 cos x 和 sin x 的泰勒级数展开,不使用 math.h 且仅在 int main() 内部

c - 使用 strchr 构建字符串

c - 二维数组选择排序

c - 无法从用户空间 C 调用 ioctl

python - 通过使用python中的log(1 + e ^ x)的taylor级数展开1个暗淡矢量

Python:计算泰勒级数的误差

整数可以在线程之间安全地共享吗?

c++ - 我可以在 Vista 和 Windows 7 下以用户模式获得对原始磁盘扇区的写访问权限吗?