C++年复合辛普森规则中的错误
Errors in Composite Simpson's Rule in C++
我正在编写一个小程序,使用复合辛普森规则来近似C++中的积分。它似乎有效,但是当我计算不同间隔数的积分(因此for
循环)时,会出现一些错误,因为它似乎完全是随机的。这是我的代码。
#include <iostream>
#include <cmath>
double f(double x)
{
double y = x;
return y;
}
int main()
{
for(double n=1; n<20; n+=1)
{
double a = 1;
double b = 4;
double d = (b-a)/n;
double i = a;
double area = 0;
while(i<b)
{
double j = i + d;
area += (d/6) * ( f(i) + 4*f((i+j)/2) + f(j) );
i = i + d;
}
std::cout << "Order " << n << " : " << area << std::endl;
}
return 0;
}
输出如下。
Order 1 : 7.5
Order 2 : 7.5
Order 3 : 7.5
Order 4 : 7.5
Order 5 : 7.5
Order 6 : 7.5
Order 7 : 9.30612
Order 8 : 7.5
Order 9 : 7.5
Order 10 : 8.745
Order 11 : 8.6281
Order 12 : 7.5
Order 13 : 7.5
Order 14 : 7.5
Order 15 : 7.5
Order 16 : 7.5
Order 17 : 8.22145
Order 18 : 8.18056
Order 19 : 7.5
我认为这可能与变量类型或存储问题有关,尽管我无法弄清楚问题是什么。任何帮助,不胜感激。
这可能是由浮点数比较引起的。 在这种情况下,对于计算机来说,4.0<4.0
可能是正确的,使您的循环次数过多。
为了解决这个问题,你可以使用 epsilon 来比较数字:
#define EPS 1e-8
if(a<b-EPS){...} // this is analogous to < operator for ints
if(a<b+EPS){...} // this is analogous to <= operator for ints
另一种选择是动态生成i
变量,同时使用整数来控制循环:
for(int k=0;k<n;k++){
double i=a+(b-a)*k/n;
// ...
}
相关文章:
- 使用 bazel 从源代码构建张量流服务遇到错误:C++规则'@org_tensorflow//…'编译失败(出口 4)
- 错误“没有规则实现目标……”
- 将规则生产绑定到我的结构成员时出现编译错误
- 一般规则:C/C++中错误代码的负值或正值
- 生成文件失败,错误没有规则来设定目标
- 仅当我提供类型检查规则时才"No type checking rule"错误
- make:没有规则来设定目标.日食错误
- 在给定一组规则的情况下检查罗马数字的错误
- 错误:"混合的隐式和静态模式规则"在我的生成文件中
- 一般生成文件显示没有规则来生成目标错误
- 升灵气:轻微规则变化的编译错误
- C++年复合辛普森规则中的错误
- C++生成文件错误:没有要设为目标的规则
- 提升::精神::QI规则减少解析错误
- LNK2005错误,已定义:可能有一个定义规则违反
- boost::spirit::qi具有相同的简单自适应结构属性的规则会导致编译错误
- 没有规则来使目标"类.cpp,"构建/..."需要x86/class.o' 停止。乌班图中的错误
- 聚合Boost.灵气解析为规则间接产生错误
- Android Ndk错误没有规则使目标
- c++如何设置更严格的异常(错误)规则