在C中计算积分时回答错误

在C中计算积分时回答错误,c,C,我试图计算一个积分,其中被积函数的定义不同,取决于我们所处的区间。因此我们有f:[-1,1]->R,其中f(x)=sin(pi/x)表示x中的[-1,0]和f(x)=1/2表示[0,1]中的x 使用Maple,我得到积分的值约为i=0.04030。然而,在C中,我得到了I=0.35829。这是我自己的代码: int main(){ double x,y,S_n; int n = 1000; int i; srand ( time ( NULL)); f

我试图计算一个积分,其中被积函数的定义不同,取决于我们所处的区间。因此我们有
f:[-1,1]->R
,其中
f(x)=sin(pi/x)
表示
x
中的
[-1,0]
f(x)=1/2
表示
[0,1]
中的
x

使用Maple,我得到积分的值约为
i=0.04030
。然而,在
C
中,我得到了
I=0.35829
。这是我自己的代码:

int main(){
    double x,y,S_n;
    int n = 1000;
    int i;

    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;
    }
    S_n = S_n/n;
    printf ( "%f\n", S_n);
}
intmain(){
双x,y,S\n;
int n=1000;
int i;
srand(时间(空));
对于(i=0;i

有人知道为什么这段代码给了我错误的答案吗?

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

所以,当你在这里申报时:

double x,y,S_n;
您也应该初始化它,如下所示:

double x, y, S_n = 0.0;
然后我得到的输出值大约是.36。如果我是你,我会回到我的Maple代码中,仔细检查它


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

您必须

  • 初始化
    S\n
  • 考虑要集成的窗口的大小
  • 因此,正确的代码是:

      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);
    
    double x,y,S\n;
    int n=10000;
    int i;
    S_n=0;
    srand(时间(空));
    对于(i=0;i
    始终初始化变量。在执行循环true之前,您可能应该执行
    S\u n=0
    ,但这不会改变结果!!!当枫树有50%的机会获得0.5%时,它怎么会这么小呢??真的,我不知道。对我来说,C值是确定的,你的被积函数在0附近的行为非常不好,所以没有所有者,你会得到任意的答案。正确答案是appx<代码>0.731435
    :两个结果都是错误的。实际结果是
    0.731435
    。你通常不会以这种方式积分任何东西,要么用一个漂亮的网格,要么用适当的蒙特卡罗积分。也就是说,你的C代码(一旦你初始化了
    S_n
    )将正确到2倍,这是由于最后不正确的重新缩放(点之间的平均距离是2/n,而不是1/n)。我已经尝试设置为0,同样的结果。所以只有部分答案。我认为结果是正确的,枫叶版本可能是正确的wrong@Jean-弗朗索瓦·法布:我同意,我得到的产出是差不多的。该死的gcc甚至没有对此发出警告。“我打赌克朗会的。”让·弗朗索瓦·法布两人都没有发出警告!该死!世界将何去何从?当我运行您提供的上述代码时,它不起作用。输出是10000个不同的S_n值,我只想要其中一个。不确定我是否应该在这之后做其他事情?是的,删除中间的打印文件…需要编辑。最后一个值是正确的。非常感谢,现在当我看分层抽样的公式时,它确实有意义。然而,您是否也知道如何计算这种MC方法的误差?这是另一个不在SO范围内的问题。