下面这道积分题的计算,随着n的增大,如果用I(n) = 1- n I(n-1)来算,即文中的第一种算法,误差很快积累,最后计算就失效了。所以要第2种算法,倒过来推算。即用I(n-1) = 1/n - I(n)/n 来推算。那么倒过来用递算怎么用呢?怎样才能先求出I7,然后用它一个一个求出I6,I5,…,I0呢?
观察被积函数。在[0, 1]之间,随着n增大,x^n越来越小。因此积分I(n)总是小于I(n-1),并且单调的趋向于0。所以有I(无穷大)=0。因而可以用0来估计n较大的I(n),而不用计算。这里x的初值取0,意思是估计I(20)=0,同时也是认可这个估算的误差的意思:
x=0.0;
for(i=20; i>0; --i) {
x = (1-x)/i;
print i-1,": ", x;
}
于是得到,
19 : 0.050000
18 : 0.050000
17 : 0.052778
16 : 0.055719
15 : 0.059018
14 : 0.062732
13 : 0.066948
12 : 0.071773
11 : 0.077352
10 : 0.083877
9 : 0.091612
8 : 0.100932
7 : 0.112384
6 : 0.126802
5 : 0.145533
4 : 0.170893
3 : 0.207277
2 : 0.264241
1 : 0.367879
0 : 0.632121
除了前面几项误差较大,后面都是有效的。 所以算得I7 = 0.112384。提取结果的时候注意,迭代式中除以n得到I(n-1),而不是I(n),这个下标不能弄错。
如果就要求I20怎么办呢,只要估计I30=0就可以了。这样求得I20 = 0.045545。