|||
离开计算器可以走多远:x + ln x =0
2015年秋季研究生课程《高等应用数学》期末测验的一道附加题:求方程 x + ln x = 0 的实根,要求给出分析和计算过程,结果的有效数字越多越好,且不能使用计算器。在上一年度的期末测验中也有一道类似的估算题,难度稍微要大一些。168名研究生参加测验,几尽无视附加题,也或许是瞄一眼整个人都不好了,直接放弃。仅有十余名学生动笔写了点东西,而仅有一名学生稍稍走得远一些,但也还是差临门一脚。此次稍稍降低了难度,在确保思想性和技巧性不差的情况下适当地降低了所需手工计算的难度。142名研究生和2名本科生参加测验,虽然学生数少了,但约半数学生动了笔,不过都走得不是太远,相比较离目标最近的还是去年的那名学生。考虑到考试时间的限制,而且没有任何提示,能走出一两步也已经很不容易了,但即使时间不限,不提示,不讨论,不会的也还是很可能不会。
本年度首次有本科生选修该研究生课程,自然对这两名本科生的表现较为期待,就谈谈他和她如何处理这道附加题。他先用作图法找到根所在的区间 (0,1),然后采用牛顿迭代格式
xk+1 = xk - (xk + ln xk)/(1 + 1/xk), k = 0, 1, 2, ...
给出 x0 = 1, x1 = 0.5, x2= ?,然而由于不能使用计算器,他没能走得更远。她给的第一种思路也是牛顿迭代法,并给出了 x0 = 0.6 和 x1 = 0.55,但未详细说明 0.55 是如何手算出来的。她显然意识到在这个思路下没有计算器是走不了更远的,而且牛顿迭代法是本科掌握的方法,在大学数学复习课上有提到,但不是该课程考察的知识。进而她在第二种思路中试图构造一个小参数 0.1 以采用级数法,然而经过一些尝试发现未能找到合适的构造就放弃了。事实上,在后一种思路中,她已经跨出了大大的一步,若稍加提示,必将天堑变通途。
作为附加题,题目可以较为开放,任何方法都可以尝试,目的也是希望学生能够灵活运用课程中教授的方法。如果不限制使用计算器,牛顿迭代法无疑是可选的最佳方案,迭代效率高。通常的数学软件都采用了牛顿迭代法,如Mathematica软件的FindRoot函数或Matlab软件的fzero函数。这个时代的人啊,敲几下键盘立马就可以获得精度极高的结果,例如用Mathematica软件输入FindRoot[x+Log[x], {x,1}],可得{x->0.567143}。然而,重要的并不是这个附加题的结果。
该课程以林家翘先生和西格尔的《自然科学中确定性问题的应用数学》第一、二卷为主要教材,旨在通过案例讲授“应用数学过程”的思想,贯穿始终介绍了各种各样的摄动方法:级数法、参数微商法、迭代法、庞加莱方法、分部积分法、拉普拉斯方法、傅里叶分析、小波分析、匹配法、WKB方法、多重尺度法、均匀化方法。解答该附加题也自然可以只限定在这些方法中尝试,容易猜测级数法和迭代法等正则摄动法最为可能可行。
摄动法的思想是将精确解作微小的扰动变成近似解,使得它满足一些可解的方程用以代替原来很难或不能精确求解的方程。因此,对解有初步的了解是很重要的。若把 x + ln x 看作函数,可以采用零值定理找出解所在的大概区间,如 0 < x < 1,当然也可以采用作图法。可是,居然还有更直接的方法,考虑到 x 和 ln x 必须一正一负,立即可得 0< x < 1。这么直接而清晰的一个方法是一名研究生写下的,虽然他写下这点后就没有再走多远。由解所在的区间说明可以将 x 视为小量,那么借助泰勒展开令人讨厌的 ln x 似乎就可以不那么讨厌了。倘若将 ln x 在 x = 0 附近作泰勒展开,即麦克劳林展开,那是行不通的。换个思路,1-x 也是小量,由泰勒展开(见附A),可得:
ln x = ln[1- (1-x)] ~ - (1-x) - (1-x)2/2 - (1-x)3/3 - (1-x)4/4 - (1-x)5/5 - ...,
至此,可以得到一个能够手工计算的迭代式子,如
xk+1 = 1/2+1/2*[(1-xk)2/2 + (1-xk)3/3+ ...], k = 0, 1, 2, ...,
但算起来很辛苦。例如,若保留方括号中两项进行迭代,有:
x0 = 0.5, x1 = 0.5833, x2= 0.5555, x3 = 0.5640, x4 = 0.5613, x5 = 0.5622, ...
辛辛苦苦算来算去也仅能精确到小数点后两位。为提高精度必须保留更高阶的部分,计算难度越发大了去。如果把方程改写为 x*exp(x) = 1 或 exp(-x) = x,将左端作麦克劳林展开再构造迭代式,这样的思路也可行,但也还是会算得很辛苦。至此说明可以通过构造特殊的迭代格式进行计算,与牛顿迭代法相比,效率低一些,但至少是能够手工计算的。实际上,“有效数字越多越好”这个要求的信息量很大,暗示不能蛮干。嗯,还是可以再走得更远一些的。
迭代法通过不断迭代来提高结果的精度,但每次迭代所需的计算量越来越大,而且还有一个严重的缺点,每次迭代都要重复计算出已经精确到的部分。这个缺点是有办法克服的,比方改用级数法,这在课程教学中已经说明过。然而,整个教科书几乎都是围绕着包含小参数的问题在讨论,该附加题所给的方程可不包含小量,那似乎就没辙了。嗯,得先构造一个小量。迭代法可以不用明确小参数,但是可以帮助构造小参数。如果先将方程改写为 x = exp(-x),再运用麦克劳林展开,可得:
x = 1 - x + x2/2! - x3/3! + x4/4! - x5/5! + ...
然后基于迭代法思想将方程进一步改写为:
2x-1 = x2/2! - x3/3! + x4/4! - x5/5! + ...
等式左边的每一项至少是O(x),而右边的每一项都是o(x)。若略去右边的部分可得x = 1/2,可将其取为小量,记为a = 1/2。方程可以进一步改写为:
2x-2a = x2/2! - x3/3! + x4/4! - x5/5! + ...
进而,可以采用级数法求解得到:
x = a + 1/4*a2 + 1/24*a3 - 1/192*a4 - 13/1920*a5 +...
考虑到 a = 1/2,上式的每一项都可以较轻松地通过手工计算完成,各项分别为0.5, 0.0625, 0.0052083, -0.0003255, -0.0002115等等。因此,若保留前五项可得结果为 0.567171,精确到了小数点后四位;项数取得越多精度越高,但收敛速度越来越慢。实际上,也可取小量 c = 1/10 = 0.1,正如那名本科生所期待的。进而将方程改写为:
2x-10c = x2/2! - x3/3! + x4/4! - x5/5! + ...
其级数解中每一项的数量级将非常清晰,见附B。然而,对于这个题嘛,其实际的计算量没有太多差别,因为收敛速度是一样的。
还能走多远呢?路漫漫其修远兮~~~
郑志军
2016年1月7日
附A:麦克劳林展开
ln(1 + u) = u - u2/2 + u3/3 - u4/4 + u5/5 - u6/6 + ...
= Sum[(-1)^(n-1)u^n/n,{n, 1, Infinity}]
exp(u) = 1 + u + u2/2! + u3/3! + u4/4! +u5/5! + u6/6! + ...
= Sum[u^n/n!, {n,0, Infinity}]
附B:解答小结
1. 方程x + ln x = 0的根满足 0 < x < 1,说明x可以作为小量
2. 由麦克劳林展开有:x = exp(-x) = 1 - x+ x2/2! - x3/3! + x4/4! - x5/5! + ...
3. 由迭代法思想有:2x-1 = x2/2! - x3/3! + x4/4! - x5/5! + ...,右边的每一项都是 o(x)
4. 取小量 c = 1/10,将方程进一步改写为:2x-10c = x2/2! - x3/3! + x4/4! - x5/5! + ...
5. 由级数法可得:x = 5c + 25/4*c2 + 125/24*c3- 625/192*c4- 8125/384*c5- 146875/4608*c6+ 1140625/64512*c7 + 191171875/1032192*c8 + ...
6. 手工计算可得:x = 5c + 6.25c2 + 5.2083c3 - 3.255c4 - 21.15c5 - 31.8c6 + 17.c7 + 185.c8 +... = 0.567143...
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-24 15:31
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社