在C中评估积分时答案错误

时间:2018-10-12 12:28:19

标签: c

我正在尝试计算一个积分,其中根据所处的间隔不同地定义被积分数。因此,我们有了f:[-1,1] -> R,其中{{1}代表f(x) = sin(pi/x) 1}}和x[-1,0]f(x) = 1/2

使用Maple我得到积分的值大约为x。但是,在[0,1]中,我得到了I = 0.04030。这是我自己的代码:

C

有人能看到为什么这段代码给了我错误的答案吗?

2 个答案:

答案 0 :(得分:4)

您必须

  1. 初始化S_n
  2. 考虑要集成的窗口的大小。

因此正确的代码是:

  double x,y,S_n;
  int n = 10000;
  int i;

  S_n = 0;
  srand ( time ( NULL));

  for (i = 0; i < n; i++){
    x = (double)rand()/RAND_MAX*2.0-1.0;   //generate double in range -1 to 1
    if(x < 0){
      y = sin(M_PI/x);
    }
    else {
      y = 0.5;
    }
    S_n = S_n + y * (1.0 - -1.0);
  }
  S_n = S_n/n;
  printf ( "%f\n", S_n);

答案 1 :(得分:2)

您的代码会调用未定义行为(UB),因为它不会初始化S_n,但会在循环中将其增加1。

因此,当您在此处声明时:

double x,y,S_n;

您也应该像这样初始化它:

double x, y, S_n = 0.0;

然后,我得到的输出值为0.36。如果我是你,我将返回我的Maple代码,并仔细检查它。


PS:如果仍然不确定,请发布一个新的Maple问题,该问题链接到该问题。