2021 STEP II Q8 —— e 的近似分数值
问题梗概
多年后,终于能给曾经的一篇水文《1997 STEP I Q6 —— π 的近似分数值》,续上一个姊妹篇。
本篇的问题来自于 2021 STEP II 数学考试中的第8题。题中给出了一种巧妙地利用积分构造的递推关系,找到数学常数 \(\mathrm{e}\) 的分式近似表达式的方法。
STEP (Sixth Term Examination Paper) 是英国剑桥考试中心为本科申请者提供的数学专项考试,通常会是剑桥、帝国理工、伦敦大学、华威等名校的数学、计算机、工程等专业的录取要求之一。每年都会有一些非常精彩的考题,我在此挑选一些个人喜欢的考题作分享。
具体推导
(i)
构造辅助函数
\[f_n(t) \equiv t^n (1-t)^n\]先算一波这家伙的一阶和二阶导数。对 \(n\geq 2\),我们有
\[\begin{aligned} \frac{\mathrm{d}f_n}{\mathrm{d}t} &= nt^{n-1}(1-t)^n - nt^n(1-t)^{n-1} \\ \frac{\mathrm{d}^2f_n}{\mathrm{d}t^2} &= n(n-1)t^{n-2}(1-t)^n - 2n^2t^{n-1}(1-t)^{n-1} + n(n-1)t^n(1-t)^{n-2} \\ & = nt^{n-2}(1-t)^{n-2} \left[ (n-1)t^2 - 2nt(1-t) + (n-1)(1-t)^2 \right] \\ & = nt^{n-2}(1-t)^{n-2} \left[ 4nt^2 - 2t^2 - 4nt + 2t + n - 1 \right] \\ & = nt^{n-2}(1-t)^{n-2} \left[ (n-1) + 2(2n-1)t(1-t) \right] \\ &= n(n-1)f_{n-2}(t) + 2n(2n-1)f_{n-1}(t) \end{aligned}\](ii)
引入定积分序列
\[T_n \equiv \frac{1}{n!} \int_0^1 f_n(t) \mathrm{e}^t \,\mathrm{d}t \qquad \text{for } n\geq0\]对于 \(n\geq2\),运用两次分部积分,我们有
\[\begin{aligned} T_n &= \frac{1}{n!} \int_0^1 f_n(t) \,\mathrm{d}\mathrm{e}^t \\ &= \frac{1}{n!} \underbrace{f_n(t)\mathrm{e}^{t}\Big|_0^1}_{=0} - \frac{1}{n!} \int_0^1 \frac{\mathrm{d}f_n}{\mathrm{d}t} \mathrm{e}^{t} \,\mathrm{d}t\\ &= - \frac{1}{n!} \int_0^1 \frac{\mathrm{d}f_n}{\mathrm{d}t} \,\mathrm{d}\mathrm{e}^t \\ &= -\frac{1}{n!} \underbrace{\frac{\mathrm{d}f_n}{\mathrm{d}t} \mathrm{e}^{t} \Big|_0^1}_{=0} + \frac{1}{n!} \int_0^1 \frac{\mathrm{d^2}f_n}{\mathrm{d}t^2} \mathrm{e}^{t} \,\mathrm{d}t \\ &= -\frac{1}{n!} \underbrace{\frac{\mathrm{d}f_n}{\mathrm{d}t} \mathrm{e}^{t} \Big|_0^1}_{=0} + \frac{1}{n!} \int_0^1 \frac{\mathrm{d^2}f_n}{\mathrm{d}t^2} \mathrm{e}^{t} \,\mathrm{d}t \\ &= \frac{1}{n!} \int_0^1 \left[ n(n-1)f_{n-2}(t) + 2n(2n-1)f_{n-1}(t) \right] \mathrm{e}^{t}\,\mathrm{d} t \\ &= \underbrace{\frac{1}{(n-2)!} \int_0^1 f_{n-2}(t) \mathrm{e}^{t} \,\mathrm{d} t}_{T_{n-2}} + 2(2n-1)\times\underbrace{\frac{1}{(n-1)!}\int_0^1 f_{n-1}(t) \mathrm{e}^{t} \,\mathrm{d} t}_{T_{n-1}} \end{aligned}\]于是得到了重要的递推关系:
\[T_n = T_{n-2} - 2(2n-1) T_{n-1} \qquad \text{for } n\geq2\](iii)
\(T_0\) 和 \(T_1\) 的值可以轻松算出来:
\[\begin{aligned} T_0 &= \int_0^1 \mathrm{e}^{t} \,\mathrm{d} t = \mathrm{e}^{t}\Big|_0^1 = 1 - e\\ T_1 &= \int_0^1 t(1-t) \mathrm{e}^{t}\,\mathrm{d} t = (-3+3t-t^2) \mathrm{e}^{t}\Big|_0^1 = 3 - e \end{aligned}\]注意到 \(T_0\) 和 \(T_1\) 都是 \(\{1, \mathrm{e}\}\) 的整数系数的线性组合。根据递推公式,\(T_n\) 也总是 \(T_{n-1}\) 和 \(T_{n-2}\) 的整数系数的线性组合。因此,对于任意 \(n\geq0\),\(T_n\) 一定是 \(\{1, \mathrm{e}\}\) 的整数系数的线性组合,即有
\[T_n = a_n + b_n \mathrm{e}\]其中 \(a_n\),\(b_n\) 都是整数,且可以由上述的递推关系一步一步地算出。不难证明,对 \(n\geq2\),
\[\begin{aligned} a_n &= a_{n-2} - 2(2n-1) a_{n-1} \\ b_n &= b_{n-2} - 2(2n-1) b_{n-1} \end{aligned}\](iv)
回到 \(T_n\) 的积分形式。注意到在积分区间 \([0,1]\) 上,有 \(f_n(t) =t^n(1-t)^n \geq 0\) 及 \(\mathrm{e}^t >0\),因此
\[T_n > 0\]另一方面,在积分区间 \([0,1]\) 上,有 \(f_n(t) =t^n(1-t)^n <1\) 及 \(\mathrm{e}^t \leq \mathrm{e}\),因此
\[T_n < \frac{1}{n!}\int_0^1 \mathrm{e}\,\mathrm{d} t = \frac{\mathrm{e}}{n!}\]于是我们得到关于 \(T_n\) 估值的区间:\(\displaystyle 0 < T_n < \frac{\mathrm{e}}{n!}\)
当 \(n\to\infty\) 时,\(\frac{\mathrm{e}}{n!}\to0\),因此 \(\lim_{n\to\infty}T_n = \lim_{n\to\infty}(a_n - b_n\mathrm{e}) = 0\)
或者可以写成
\[\lim_{n\to\infty}(-)\frac{a_n}{b_n} = \mathrm{e}\]| 换而言之,序列 $${ | \frac{a_n}{b_n} | }\(可以不断地给出精度无限逼近于准确值的常数\)\mathrm{e}$$! |
(v)
这个序列的前几项不难人肉算出来:
\[\begin{aligned} a_0 &= -1 & b_0 &= 1\\ a_1 &= 3 & b_1 &= -1 \\ a_2 &= -1-6\times3 = -19 & b_2 &= 1 - 6\times(-1) = 7 \\ a_3 &= 3-10\times(-19) = 193 & b_3 &= -1 - 10\times7 = -71 \\ & \cdots &&\cdots \end{aligned}\]简单地验算可以得到:
\[\begin{aligned} \bigg|\frac{a_2}{b_2}\bigg| &= \frac{19}{7} = 2.71429\cdots \\ \bigg|\frac{a_3}{b_3}\bigg| &= \frac{193}{71} = 2.71831\cdots \\ \end{aligned}\]跟 \(\mathrm{e}\approx 2.71828\) 的准确值比起来是不是已经有那么点意思了?
再往后的 \(a_n\) 和 \(b_n\) 的具体数值,人肉是算不了一点了。但写一个小程序,就可以计算出一堆来,也顺势可以算出它们的比值与 \(\mathrm{e}\) 来比较。
import pandas as pd
import math
def display_values(n=10, precision=10):
a = [-1, 3]
b = [1, -1]
for n in range(2, n):
a.append(a[n-2] - 2 * (2*n - 1) * a[n-1])
b.append(b[n-2] - 2 * (2*n - 1) * b[n-1])
df_values = pd.DataFrame({'a':a, 'b':b})
df_values['|a/b|'] = -df_values['a']/df_values['b']
df_values['error'] = abs(math.e - df_values['|a/b|'])
pd.set_option("display.precision", precision)
print(df_values)
return df_values
display_values(8)
结果列举如下:
每轮迭代,就又会有几个新的小数位跟 \(\mathrm{e}\) 拉齐。
数字控表示,这奇妙的感觉棒极了!