c - 在 C 中使用梯形法则对某些值给出错误答案的积分

标签 c

我已经编写了一些代码来集成函数 5x^4 + 4x^3 + 3x^2 + 2x + 1。

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

float func(float x){
    float a;
    a = 5*pow(x,4) + 4*pow(x,3) + 3*pow(x,2) + 2*x +1;
    return a;
}

int main(){ 
    float numberOfXValues;
    float a = 0;            //lower limit
    float b = 1;            //upper limit
    float numberOfStrips;
    float stripSize;
    float finalAnswer;
    float sumFirstAndLast;  //summation of first and last x value

    while(1){
        printf("Input number of X values:");
        scanf("%f", &numberOfXValues);

        numberOfStrips = numberOfXValues - 1;
        stripSize = (b - a)/(numberOfStrips);                      
        sumFirstAndLast = 0.5*func(a) + 0.5*func(b);

        for (float z = stripSize; z < b; z += stripSize ){
            sumFirstAndLast += func(z);
        }

        finalAnswer = sumFirstAndLast * stripSize;

        printf("%f\n", finalAnswer);
    }
return 0;
}

它适用于大多数值,但 13 和 20 的输出给出了错误的答案。我已经仔细查看了几次,但看不出是什么原因造成的。

输入 X 值的数量:10 5.039070 输入 X 值的数量:11 5.031651 输入 X 值的数量:12 5.026160 输入 X 值的数量:13 6.271982 输入 X 值的数量:14 5.018732 输入 X 值的数量:15 5.016153 输入 X 值个数:16 5.014071 输入 X 值个数:17 5.012367 输入 X 值个数:18 5.010955 输入 X 值的数量:19 5.009773 输入 X 值的数量:20 5.798243 输入 X 值的数量:21 5.007917

最佳答案

问题是在内循环的退出条件下,你比较了两个 float 。在numberOfStrips之后迭代,不能保证 z == b因为浮点精度。 z < b 完全有可能或 z > b .在z < b情况下,它再次执行循环。

你应该制作numberOfStrips一个整数并像这样重写循环:

float z = stripSize;
for (int i = 1; i < numberOfStrips; i++) {
    sumFirstAndLast += func(z);
    z += stripSize;
}

关于c - 在 C 中使用梯形法则对某些值给出错误答案的积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703463/

相关文章:

c - 将两个二维数组传递给函数进行比较

c - 如何在 Windows 8 命令提示符下运行和编译 c

c - C 编程中的映射文件

c - 定义测试替身时如何避免多重定义

c++ - 使用 void 指针时转换函数(CUBA Nint 例程)

c - C 中的命名空间

c - C中的文件内存泄漏

c - #undef-ing 在实践中?

c 在字符串中搜索目标字符串

c - 出现段错误(核心转储)