反向使用递推关系的求值

下面这道积分题的计算,随着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。

猜你喜欢

转载自blog.csdn.net/aaasssdddd96/article/details/110670290