我已经编写了一些代码来集成函数 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/