如何用矩形积分法得出这个百分比误差
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;
}
我正在复习一些数值积分方法。我遇到了矩形积分法(即欧拉法)。根据我正在阅读的书,实际算法是
代码是不言自明的。作者为这个例子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;
}