求递推数列{aₙ}的极限(含存在性验证)
问题描述
给定数列${a_n}$满足递推关系:
$$a_1 = 1, \quad a_{n+1} = \frac{3n-1}{3n} a_n + \frac{1}{n^2}, \quad \forall n\ge 1$$
通过MATLAB数值计算猜测极限为0,但数列收敛速度极慢,下面我们从理论上严谨证明极限确实是0,并解释收敛慢的原因。
步骤1:分析齐次递推的解
首先看对应的齐次递推方程:
$$a_{n+1}^h = \frac{3n-1}{3n} a_n^h$$
齐次解可以通过累乘法得到:
$$a_n^h = a_1 \cdot \prod_{k=1}^{n-1} \frac{3k-1}{3k} = \prod_{k=1}^{n-1} \left(1 - \frac{1}{3k}\right)$$
对乘积取自然对数:
$$\ln\left(a_n^h\right) = \sum_{k=1}^{n-1} \ln\left(1 - \frac{1}{3k}\right)$$
利用泰勒展开$\ln(1-x) \approx -x - \frac{x^2}{2} - \cdots$($x$趋近于0),当$k$较大时,$\ln\left(1 - \frac{1}{3k}\right) \approx -\frac{1}{3k}$,而调和级数$\sum_{k=1}^\infty \frac{1}{k}$发散到$+\infty$,因此:
$$\ln\left(a_n^h\right) \approx -\frac{1}{3} \sum_{k=1}^{n-1} \frac{1}{k} \to -\infty \quad (n\to\infty)$$
这说明齐次解$a_n^h \to 0$,且收敛速度是$n{-1/3}$量级(因为$\sum_{k=1}{n-1}\frac{1}{k} \approx \ln n + \gamma$,所以$\ln(a_n^h)\approx -\frac{1}{3}\ln n$,即$a_n^h \approx C n^{-1/3}$,$C$为常数)。
步骤2:求解非齐次递推的通解
对于线性非齐次递推$a_{n+1}=P(n)a_n+Q(n)$,通解公式为:
$$a_n = \left(a_1 + \sum_{k=1}^{n-1} \frac{Q(k)}{\prod_{i=1}^k P(i)}\right) \cdot \prod_{i=1}^{n-1} P(i)$$
这里$P(k)=\frac{3k-1}{3k}$,$Q(k)=\frac{1}{k^2}$,代入得:
$$\frac{Q(k)}{\prod_{i=1}^k P(i)} = \frac{1}{k^2} \cdot \prod_{i=1}^k \frac{3i}{3i-1} = \frac{1}{k^2} \cdot \prod_{i=1}^k \left(1 + \frac{1}{3i-1}\right)$$
同样用对数估计这个乘积:
$$\ln\left(\prod_{i=1}^k \left(1 + \frac{1}{3i-1}\right)\right) = \sum_{i=1}^k \ln\left(1 + \frac{1}{3i-1}\right) \approx \sum_{i=1}^k \frac{1}{3i-1} \approx \frac{1}{3}\ln k + C'$$
因此$\prod_{i=1}^k \left(1 + \frac{1}{3i-1}\right) \approx C'' k^{1/3}$($C''$为常数),进而通项:
$$\frac{Q(k)}{\prod_{i=1}^k P(i)} \approx \frac{C'' k{1/3}}{k2} = C'' k^{-5/3}$$
由于级数$\sum_{k=1}^\infty k^{-5/3}$是收敛的($p$-级数,$p=5/3>1$),记其和为$S$,则当$n\to\infty$时:
$$a_1 + \sum_{k=1}^{n-1} \frac{Q(k)}{\prod_{i=1}^k P(i)} \to 1 + S$$
这是一个有限常数。
步骤3:结论:数列极限为0
结合齐次解的收敛性,通解可以写成:
$$a_n = (常数 + o(1)) \cdot a_n^h$$
而$a_n^h \to 0$,因此$\lim_{n\to\infty} a_n = 0$,和MATLAB数值猜测的结果一致。
为什么收敛速度极慢?
从上面的分析可知,$a_n$的量级约为$C n^{-1/3}$,这是一种非常缓慢的收敛速度——比如要让$a_n < 0.1$,需要$n > (C/0.1)^3$,如果$C$是1左右,那$n$需要达到1000;要让$a_n < 0.01$,则$n$需要达到1e6,这就解释了为什么MATLAB计算时会感觉收敛很慢。
MATLAB数值验证代码
可以用这段代码直观观察数列的收敛情况:
a = 1; % 初始项 for n = 1:100000 a = (3*n - 1)/(3*n)*a + 1/(n^2); if mod(n, 10000) == 0 fprintf('n = %d, a_n = %.6f\n', n, a); end end
运行后会看到,当$n=100000$时,$a_n$大概在0.1左右,确实收敛得很慢。
内容的提问来源于stack exchange,提问作者Tien Kha Pham




