用泰勒级数估算平方根需展开的阶数
用泰勒级数估算平方根需展开的阶数
本文详细探讨了如何使用泰勒级数估算平方根,并深入分析了展开的阶数与精度的关系。文章从泰勒级数的基本概念出发,逐步推导出平方根函数的泰勒展开式,通过数学证明确定剩余项的上限,并使用Matlab进行实验验证。内容深入且系统,适合对数学和编程感兴趣的读者阅读。
我们知道,一个可导函数,可以用泰勒级数展开,这是一种估算函数值的方法。泰勒级数展开的基本公式是:
$$
f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \cdots + \frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x)
$$
用泰勒级数估算函数值的方法是只取前几项,忽略后面的无限多项。但泰勒级数并非必然收敛,所以需要凑出能使泰勒级数收敛的条件。
博文介绍了一种用泰勒级数估算平方根的方法,大致思路就是将平方根转化为 $\sqrt{x} = \sqrt{a^2(1+b)} = a\sqrt{1+b}$,其中 $a$ 为正整数,$b$ 是一个接近1的数。但该文的方法只取泰勒展开式的二阶近似,有时准确,有时不准确。当然,该文给出了通过乘以某一系数的方法提高准确度的方法,是有效的。但本文推荐的方法是展开更高阶的泰勒级数,而展开的泰勒级数的阶数并不固定,而是和精度要求,以及被开方数有关。被开方数与1的接近程度可以决定泰勒级数在展开一定阶数后剩余项的大小,且可以用数学算式得出。所以,根据精度的要求,被开方数只要在0到2之间,就可以计算出应展开的阶数,然后无需乘系数,就计算出符合精度要求的平方根。
一、平方根函数的泰勒展开式
对于平方根函数 $f(x) = \sqrt{x}$,其一阶导数为 $f'(x) = \frac{1}{2\sqrt{x}}$,二阶导数为 $f''(x) = -\frac{1}{4x\sqrt{x}}$,三阶导数为 $f'''(x) = \frac{3}{8x^2\sqrt{x}}$。以此类推,$n$ 阶导数是:
$$
f^{(n)}(x) = (-1)^{n-1}\frac{(2n-3)!!}{2^n x^{n-\frac{1}{2}}}
$$
对于泰勒展开,这里取 $a=1$,则 $f(1) = 1$,$f'(1) = \frac{1}{2}$,$f''(1) = -\frac{1}{4}$,$f'''(1) = \frac{3}{8}$。无论 $x$ 如何取值。
所以泰勒展开式为:
$$
\sqrt{x} = 1 + \frac{1}{2}(x-1) - \frac{1}{8}(x-1)^2 + \frac{1}{16}(x-1)^3 - \cdots
$$
由于展开式是正负交替,这里将其写成:
$$
\sqrt{x} = \sum_{n=0}^{\infty} (-1)^n \frac{(2n-1)!!}{2^n n!} (x-1)^n
$$
(1)
二、泰勒展开式收敛性的证明
式(1)中,令 $r_n = \frac{a_{n+1}}{a_n}$,这里采用比值审敛法判断式(1)的收敛性。
注:因为这里前提是 $0 < x < 2$,所以 $x-1$ 可以约掉。
显然,当 $n \to \infty$ 时,$r_n \to 0$,故式(1)收敛。
三、泰勒展开式的阶数及剩余项的大小
(一)级数公比初步分析
首先,根据 $r_n$ 的算式,用GeoGebra软件,画出当 $n=1$ 和 $n=2$ 时 $r_n$ 关于 $x$ 的函数图像。
从图中可看出 $r_n$ 在 $0 < x < 2$ 时单调递增,且始终大于0。鉴于其极限值存在,因此可以猜测,当 $n \to \infty$ 时,$r_n \to 0$。若证实成立,则可用无穷等比数列的算式找到式(1)的剩余项的上限值。具体说明将在本章节第三小节详述。
(二)数学证明
这里用作差法证明 $r_n < 1$。
(2)
现在判断(2)式的正负
首先,已知 $0 < x < 2$,所以 $x-1 > -1$。另外,由于 $n \geq 1$,所以 $2n-1 > 0$。
对于 $2n-1$,当 $n$ 确定时,该式就是 $x$ 的一次函数,在 $0 < x < 2$ 上单调,所以只要 $x=0$ 和 $x=2$ 时该式值均大于0,该式就必然大于0。
当 $x=0$ 时,该式 $2n-1 > 0$,当 $n \geq 1$ 时其必然成立。
当 $x=2$ 时,该式 $2n-1 > 0$,当 $n \geq 1$ 时其必然成立。
而对于 $-8n + 4nx - x - 1$,
当 $n=1$ 时,该式 $-8 + 4x - x - 1 = 3x - 9 < 0$。
当 $n>1$ 时,该式 $-8n + 4nx - x - 1 < 0$。
所以式(2)必为负,说明 $r_n < 1$ 成立。
于此同时,可用类似的方法证明 $r_n > 0$,所以 $0 < r_n < 1$。
(三)剩余项上限值算式
在上一小节中,已经证明了 $0 < r_n < 1$,所以剩余项的绝对值必然小于首项为 $a_1$,公比为 $r_n$ 的无穷等比数列的绝对值。根据无穷等比数列公式:
$$
S = \frac{a_1}{1-r}
$$
将 $a_1$ 和 $r_n$ 代入,可知对于式(1),当计算到第 $m$ 项时,剩余项的绝对值:
$$
R_m = \frac{a_{m+1}}{1-r_{m+1}}
$$
(3)
因此,只要给定精度要求 $\epsilon$,估算平方根时,根据所需的精度 $\epsilon$,只需用式(3)算出令 $R_m < \epsilon$ 的最小 $m$ 即可。
四、实验
在这一章节,用Matlab计算当 $x$ 时通过式(1),令 $m$ 估算出来的 $\sqrt{x}$,以及通过式(3)计算的 $R_m$ 的上限值,因此验证通过泰勒级数算出的 $\sqrt{x}$ 估计值和实际值的误差小于(3)中计算的上限值。另外,也观察对于各 $m$ 值,通过泰勒级数展开 $m$ 阶后,余式的上限值,从而找出对于不同的 $x$ 值,需要展开多少阶后才能达到所需的精度。
(一)实验代码
首先是通过泰勒级数估算 $\sqrt{x}$ 值的程序
function res = estiSquareRoot(x, n)
if x <= 0 || x >= 2
res = nan;
disp("x must be between 0 and 2, open range")
return
end
if n < 0 || rem(n, 1) ~= 0
res = nan;
disp("n must be a non-negative integer!")
return
end
res = 1/2 + x/2;
for m = 1:n
ks = 1:(2 * m - 1);
res = res + prod(2*ks-1) * (x - 1) ^ (2 * m) * (-8 * m + 4 * m * x - x - 1) / (2 ^ (2 * m + 1) * factorial(2 * m + 1));
end
end
函数中的x代表 $x$,函数中的n代表 $m$。
另外,计算 $R_m$ 的上限值
function remainSup = getRemainTaylor(x, m)
if x <= 0 || x >= 2
remainSup = nan;
disp("x must be between 0 and 2, open range")
return
end
if m < 0 || rem(m, 1) ~= 0
remainSup = nan;
disp("n must be a non-negative integer!")
return
end
ks = 1:(2*m-1);
remainSup = prod(2 * ks - 1) * (x - 1)^(2 * m) * (-8 * m + 4 * m * x - x - 1)/((1 - (x - 1) ^ 2) * 2 ^ (2 * m + 1)*factorial(2 * m + 1));
end
函数中x代表 $x$,m代表 $m$。
然后计算对于不同的 $x$,不同的 $m$,估算的平方根值和剩余值上限。注意:对于用 $m$ 阶展开的估值,其余式是 $R_{m+1}$。另外,也用Matlab内置的函数计算平方根,作为参考。
x_to_test = 0.1:0.1:1.9;
c_to_test = 1:10;
square_root_estimation = zeros(length(x_to_test), length(c_to_test));
square_root_remaining = zeros(length(x_to_test), length(c_to_test));
for ii_for_x = 1:length(x_to_test)
for jj_for_c = 1:length(c_to_test)
square_root_estimation(ii_for_x, jj_for_c) = estiSquareRoot(x_to_test(ii_for_x), c_to_test(jj_for_c));
square_root_remaining(ii_for_x, jj_for_c) = getRemainTaylor(x_to_test(ii_for_x), c_to_test(jj_for_c) + 1);
end
end
square_root_real = sqrt(x_to_test)';
(二)实验结果
然后观察两个结果。第一个,是估算的平方根和实际平方根的差值。
x_labels = "x=" + x_to_test;
c_labels = "c=" + c_to_test;
T = array2table(abs(square_root_real - square_root_estimation), 'VariableNames', c_labels, 'RowNames', x_labels)
结果如下:
从表格中可看出,$x$ 越远离1,精确估计平方根需要展开的泰勒阶数 $m$ 越大。
第二个,是余式的上限
T = array2table(abs(square_root_remaining), 'VariableNames',c_labels,'RowNames',x_labels)
结果如下:
比较两表,可以确认平方根的计算差距小于通过(3)计算的上限。另外,对于 $x$,$m$ 时,其差距就已经小于0.001。此时其为三阶展开。对于[3]中使用的方法,如写成 $\sqrt{x} = \sqrt{a^2(1+b)} = a\sqrt{1+b}$,则令 $b$,此时其根式部分的计算差不超过0.0021,整体差距不超过0.0042。同样,若写成 $\sqrt{x} = \sqrt{a^2(1+b)} = a\sqrt{1+b}$,则根式部分计算差不超过0.0015,整体差距不超过0.003。当然,若 $x$ 离1更远,需展开的阶数会更大,但只要 $x$,都可通过式(3)算出需展开的阶数。
五、总结
$\sqrt{x}$ 的泰勒展开式,在 $0 < x < 2$ 时,是收敛的,所以可以用泰勒级数进行估算。另外,由于展开式的后项与前项之比始终小于 $r_n$,因此可以用以 $r_n$ 为公比的无穷等比数列找出泰勒展开式余项的上限值,也可以确定达到所需精度需要展开的泰勒阶数。
参考资料
[1]泰勒(Taylor)展开式(泰勒级数)_泰勒展开-CSDN博客
[2]泰勒级数:数学的无限逼近之美
[3]手动计算开根号(泰勒展开法) - 小时百科
[4]马同学
[5]GeoGebra - the world’s favorite, free math tools used by over 100 million students and teachers
[6]概率 无穷数列求和公式