数列の行方

a_1=2のとき漸化式a_{n+1}=\frac{2a_n+1}{a_n+1}で得られる数列は、

#include <stdio.h>

int main(void)
{
    int i;
    double an = 2;
    for (i = 1; i < 20;i ++) {
        printf("%2d: %f\n", i, an);
        an = (2 * an + 1) / (an + 1);
    }
    printf("%02d: %f\n", i, an);
    return 0;
}
 1: 2.000000
 2: 1.666667
 3: 1.625000
 4: 1.619048
 5: 1.618182
 6: 1.618056
 7: 1.618037
 8: 1.618034
 9: 1.618034
10: 1.618034
11: 1.618034
12: 1.618034
13: 1.618034
14: 1.618034
15: 1.618034
16: 1.618034
17: 1.618034
18: 1.618034
19: 1.618034
20: 1.618034

これは黄金数\phi=\frac{1+\sqrt{5}}{2}=1.61803398\ldotsに収束する。
上の漸化式を変形すると、
a_{n+1}=\frac{(a_n+1)+a_n}{a_n+1}=1+\frac{a_n}{a_n+1}=1+\frac{1}{1+\frac{1}{a_n}}
となり、これは黄金数の連分数表現
1+\frac{1}{1+\frac{1}{1+\frac{1}{1+\frac{1}{\ddots}}}}
を二段ずつ計算していくことに相当する。
数列a_n\phi\lt a_{n+1}\lt a_nとなる単調減少数列である。

黄金数の連分数表現を一段ずつ計算していくことを考える。
この場合、漸化式b_{n+1}=1+\frac{1}{b_n}で得られる数列b_nを求めることになる。
このままの漸化式でもいいし、冒頭の漸化式に合わせてb_{n+1}=\frac{b_n+1}{b_n}としてもいい。

#include <stdio.h>

int main(void)
{
    int i;
    double bn = 2;
    for (i = 1; i < 20;i ++) {
        printf("%2d: %f\n", i, bn);
        bn = (bn + 1) / bn;
    }
    printf("%02d: %f\n", i, bn);
    return 0;
}
 1: 2.000000
 2: 1.500000
 3: 1.666667
 4: 1.600000
 5: 1.625000
 6: 1.615385
 7: 1.619048
 8: 1.617647
 9: 1.618182
10: 1.617978
11: 1.618056
12: 1.618026
13: 1.618037
14: 1.618033
15: 1.618034
16: 1.618034
17: 1.618034
18: 1.618034
19: 1.618034
20: 1.618034

b_na_nと異なり振動しながら黄金数に収束していく。
また、収束の速度はa_nよりも遅いことが分かる。

\phi>\sqrt{2}なので明らかにa_n>\sqrt{2}だけど\sqrt{2}に収束するわけではありませんでした。