我正在审查一些集成的数值方法。我遇到了矩形积分方法(即Euler方法)。根据我正在阅读的书,实际的算法是
代码不言自明。作者为此示例int sumResult = sum(number1, number2);
int diffResult = difference(number1, number2);
int mulResult = multiplies(number1, number2);
提供了初始值dxdt=cos(t)
。分析解决方案是x(0)=0
。我们可以在x=sin(t)
计算错误,实际上作者在下表中提供了错误:
问题是在我的下面的代码中,错误是9.1%,但在上表中,错误实际上是2.6。我犯了错误吗?
t=1
答案 0 :(得分:1)
您需要考虑到,当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;
}