简单矩形法算法题

Simple rectangle method algorithm problem

我被要求写一个矩形法算法来计算函数的估计面积,但是我的讲师发回我的代码并让我更正它,因为结束条件是错误的?

double prostokaty(double( *f)(double))
{
    double krok, p, suma = 0;
    krok = (c_do - c_od) / lp;
    for (p = c_od + krok; p < c_do; p += krok) {
        suma += (*f)(p);
    }
    return suma * krok;      
}

我花了将近两个小时来找出问题所在,但我失败了。

最好使用矩形的中间 c_od + krok/2 而不是右边缘 c_od + krok

double prostokaty(double( *f)(double)) {
  double p, suma = 0;
  double krok = (c_do - c_od) / lp;
  // for (p = c_od + krok; p < c_do; p += krok) {
  for (p = c_od + krok/2; p < c_do; p += krok) {
    suma += (*f)(p);
  }
  return suma * krok;      
}

如果lp是整型,更好的避免累加误差

  double suma = 0;
  double krok = (c_do - c_od) / lp;
  for (int i = 0; i < lp; i++) {
    double p = c_od + (i + 0.5)*krok;
    suma += f(p);
  }
  return suma * krok;