如何用矩形积分法得出这个百分比误差

How to come up with this percent error with Rectangular integration method

我正在复习一些数值积分方法。我遇到了矩形积分法(即欧拉法)。根据我正在阅读的书,实际算法是

代码是不言自明的。作者为这个例子dxdt=cos(t)提供了初始值x(0)=0。解析解为x=sin(t)。我们可以在 t=1 处计算错误,实际上作者在以下 table:

中提供了错误

问题是,在我下面的代码中,错误是 9.1%,但在前面的 table 中,错误实际上是 2.6。我做错了吗?

#include <iostream>
#include <cmath>

int main()
{
    double x(0.0), dxdt, t(0.0), T(0.1), stopTime(1.0);

    for ( ; t <= stopTime; t += T ){
        dxdt = cos(t);
          x += dxdt*T;

          if ( t > 0.9 )
            std::cout << "Time: " << t << "  Error: " << fabs( (x - sin(t)) /sin(t) )*100.0 <<  std::endl;
    }

    return 0;
}

你需要考虑到当 x 被更新为 x(t+T) 的近似值时,循环变量 t 只会在循环的最后增加,所以在输出期间保留它的值 t 。这个时间不匹配引入了 abs(sin(t+T)/sin(t)-1) 的额外相对误差,对于 t=1, T=0.1 大约是 5.91 %.

您还应该在 t 增量中的舍入误差下使循环稳定,方法是计算循环的确切数量或通过选择步骤之间的不等式中的边界,如

while ( t < stopTime-0.5*T ){
    dxdt = cos(t);
      x += dxdt*T;
      t += T;

    if ( t > stopTime -2.5*T )
        std::cout << "Time: " << t << "  Error: " << fabs( (x - sin(t)) /sin(t) )*100.0 <<  std::endl;

}