【问题标题】:Integration using the Trapezium Rule in C giving wrong answer for certain values使用 C 中的梯形规则集成对某些值给出错误答案
【发布时间】:2015-02-25 03:00:48
【问题描述】:

我已经编写了一些代码来集成函数 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 的输出给出了错误的答案。我已经查看了几次,但看不出是什么原因造成的。

Input number of X values:10 5.039070 Input number of X values:11 5.031651 Input number of X values:12 5.026160 Input number of X values:13 6.271982 Input number of X values:14 5.018732 Input number of X values:15 5.016153 Input number of X values:16 5.014071 Input number of X values:17 5.012367 Input number of X values:18 5.010955 Input number of X values:19 5.009773 Input number of X values:20 5.798243 Input number of X values:21 5.007917

【问题讨论】:

  • 预期值是多少?
  • 什么是正确的值,为什么你认为它们是正确的?
  • 它应该只趋向于 5。除了我发布的两个数字之外,还有很多数字不起作用,例如。 24、28、29 和 32。
  • 顺便说一句,我认为你的numberOfXValues 应该是整数..
  • 我现在已将 numberOfXValues 和 numberOfStrips 都更改为整数,但仍然无法正常工作。

标签: c


【解决方案1】:

问题是在内循环的退出条件中,你比较了两个浮点数。在numberOfStrips 迭代之后,由于浮点精度,不能保证z == bz &lt; bz &gt; b 完全有可能。在z &lt; b 的情况下,它又执行了一次循环。

您应该将numberOfStrips 设为整数并像这样重写循环:

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

【讨论】:

    【解决方案2】:

    乍一看,这似乎是float 的精度和舍入问题。 因此将float 更改为double

    例如,在我的机器上,当使用float 时,我得到6.271982 作为10 的输入,而在使用double 时,我得到5.021983 作为结果。

    此外,您应该在浮点比较中使用 epsilon。

    【讨论】:

      【解决方案3】:

      放线:

      printf("%f, %d\n", z, z < b);
      

      for 循环内,每次迭代都会打印z 值以及循环条件结果。最后的输出是:

      1.000000, 1
      

      这表明我们已经达到了正确的限制,但仍在执行循环体。从字面上看,它认为1.000 &lt; 1.000。使用浮点数时可能会发生这种情况,因此为了防止这种情况发生,请考虑在某个整数上循环(例如numberOfXValues)。

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 1970-01-01
        • 2023-02-17
        • 2015-05-15
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多