13.5 定步长积分循环的终止
数学计算中最常见的一类计算是微分方程的数值计算,而这类计算通常是一个积分循环。例如,一个以时间为自变量的微分方程的积分形式如下:
- while( 积分循环条件 )
- {
- X(t) => X( t+h )
- 例如二阶Runge-Kutta积分
- t += h;
- }
当这个循环结束时就可以得到结果。当然,实际使用的形式有多种,例如还可以使用:
- while( 1 )
- {
- X(t) => X( t+h )
- if( 积分终止条件 )
- break;
- t += h;
- }
不过,它们在逻辑上是一致的,可以通过变形相互转化。
这类定步长积分终止条件一般有两类:一类就是自变量自身,例如某一方程要求从时间t0积分到t1,此处的t1就是积分终止条件;一类是约束条件,例如弹道导弹积分一般以落地为终止条件。
13.5.1 自变量终止条件
要满足这类终止条件,往往需要在最后一步做些修正。曾有一个程序员给出下列终止条件:
- if( t >= tEnd )
- break;
当积分终止时t>=tEnd,而正确的计算要求t=tEnd,显然上述积分终止条件会导致积分误差t-tEnd,最大可能接近一个积分步长。在弹道计算的主动段,积分步长可能是0.1s,如果加速度是10m/s2,这意味着速度偏差1m/s。如果随后导弹飞行10min,那么将造成约600m的偏差,远远超过了一般战术弹道导弹的命中精度指标。
为了避免这种错误,需要在积分的最后一步作些特殊处理。修改终止条件:
- while( t <= tEnd - h )
- {
- X(t) => X( t+h )
- t += h;
- }
上述积分循环在t接近tEnd时终止,终止时tEnd-t- h = tEnd - t;
- X(t) => X( t+h )
- t += h;
【责任编辑:
董书 TEL:(010)68476606】