用泰勒级数估算平方根需展开的阶数
要估算一个数的平方根,可以用泰勒级数,而需要展开的阶数和所需的精度以及求根的数有关。
我们知道,一个可导函数,可以用泰勒级数展开,这是一种估算函数值的方法。泰勒级数展开的基本公式是[1]:
用泰勒级数估算函数值的方法是只取前几项,忽略后面的无限多项。但泰勒级数并非必然收敛[2],所以需要凑出能使泰勒级数收敛的,且的计算要容易,才能准确地用泰勒级数估算函数值。
博文[3]介绍了一种用泰勒级数估算平方根的方法,大致思路就是将平方根转化为,其中为正整数,是一个接近1的数。但该文的方法只取泰勒展开式的二阶近似,有时准确,有时不准确。当然,该文给出了通过乘以某一系数的方法提高准确度的方法,是有效的。但本文推荐的方法是展开更高阶的泰勒级数,而展开的泰勒级数的阶数并不固定,而是和精度要求,以及被开方数有关。被开方数与1的接近程度可以决定泰勒级数在展开一定阶数后剩余项的大小,且可以用数学算式得出。所以,根据精度的要求,被开方数只要在0到2之间,就可以计算出应展开的阶数,然后无需乘系数,就计算出符合精度要求的平方根。
一、平方根函数的泰勒展开式
对于平方根函数,其一阶导数为,二阶导数为,三阶导数为。以此类推,阶导数是
对于泰勒展开,这里取,则,无论如何取值。
所以
由于展开式是正负交替,这里将其写成
(1)
二、泰勒展开式收敛性的证明
式(1)中,令
这里采用[4]中提到的比值审敛法判断式(1)的收敛性。
注:因为这里前提是,所以可以约掉。
显然,当时,,故式(1)收敛。
三、泰勒展开式的阶数及剩余项的大小
(一)级数公比初步分析
首先,根据的算式,用GeoGebra软件[5],画出当和时关于的函数图像。
从图中可看出在时单调递增,且始终大于0。鉴于其极限值存在,因此可以猜测,当时,。若证实成立,则可用无穷等比数列的算式找到式(1)的剩余项的上限值。具体说明将在本章节第三小节详述。
(二)数学证明
这里用作差法证明。
(2)
现在判断(2)式的正负
首先,已知,所以。另外,由于,所以。
对于,当确定时,该式就是的一次函数,在上单调,所以只要和时该式值均大于0,该式就必然大于0。
当时,该式,当时其必然
当时,该式,当时其必然
而对于
当时,该式
当时,该式
所以式(2)必为负,说明成立
于此同时,可用类似的方法证明,所以
综上所述,
(三)剩余项上限值算式
在上一小节中,已经证明了,所以的绝对值必然小于首项为,公比为的无穷等比数列的绝对值。根据[6]中的无穷等比数列公式,
将代入,可知对于式(1),当计算到时,剩余项的绝对值 (3)
因此,只要,估算平方根时,根据所需的精度,只需用式(3)算出令的最小即可。
四、实验
在这一章节,用Matlab计算当时通过式(1),令估算出来的,以及通过式(3)计算的的上限值,因此验证通过泰勒级数算出的估计值和实际值的误差小于(3)中计算的上限值。另外,也观察对于各值,通过泰勒级数展开阶后,余式的上限值,从而找出对于不同的值,需要展开多少阶后才能达到所需的精度。
(一)实验代码
首先是通过泰勒级数估算值的程序
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代表,函数中的n代表。
另外,计算的上限值
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代表,m代表。
然后计算对于不同的,不同的,估算的平方根值和剩余值上限。注意:对于用阶展开的估值,其余式是。另外,也用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)
结果如下:
从表格中可看出,越远离1,精确估计平方根需要展开的泰勒阶数越大。
第二个,是余式的上限
T = array2table(abs(square_root_remaining), 'VariableNames',c_labels,'RowNames',x_labels)
结果如下:
比较两表,可以确认平方根的计算差距小于通过(3)计算的上限。另外,对于,时,其差距就已经小于0.001。此时其为三阶展开。对于[3]中使用的方法,如写成,则令,此时其根式部分的计算差不超过0.0021,整体差距不超过0.0042。同样,若写成,则根式部分计算差不超过0.0015,整体差距不超过0.003。当然,若离1更远,需展开的阶数会更大,但只要,都可通过式(3)算出需展开的阶数。
五、总结
的泰勒展开式,在时,是收敛的,所以可以用泰勒级数进行估算。另外,由于展开式的后项与前项之比始终小于,因此可以用以为公比的无穷等比数列找出泰勒展开式余项的上限值,也可以确定达到所需精度需要展开的泰勒阶数。
参考资料
[1]泰勒(Taylor)展开式(泰勒级数)_泰勒展开-CSDN博客
[4]马同学
[5]GeoGebra - the world’s favorite, free math tools used by over 100 million students and teachers
[6]概率 无穷数列求和公式
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)