28. [M30 ] (R. Feynman.) 开发一个计算
的算法,其中 0 ≤ x < 1, 只使用加法、减法和移位(shifting)运算(类似于 exercise 25 使用的算法), 并分析算法的精度。
解:
Exercise 25 是计算 其中
的一个简易算法,算法用到了两个变量 x 和 y,其中 x 初值为输入的 x,y 的初值为零。在算法中 x 不断减去它当前数值的
( k 从 1 开始逐渐递增),相当于 x 以
的比例逐渐递减,同时 y 会相应加上
来弥补 x 的减少,使得当前的
的值始终保持近似恒定,直到 x(或 x 的近似值)减到1为止,此时 y 的值就是算法所求的
。当然算法需要一个所有 k
对应的
的值的辅助表来快速计算 y 的值。
Exercise 28 刚好是 Exercise 25 的逆运算,因此我们正好将对 x 和 y 变量的操作互换。注意到 此时算法输入的 x 限制为 0 ≤ x < 1,而我们发现 ,因此可以将变量 x 的初值设为(1-x),变量 y 的初值设为分子 b
,在算法进行中 y 变量的值以
的比例逐渐递减( k 从 1 开始逐渐递增),同时 x 变量的值会相应减去
来弥补 y 变量值的减少,使得当前变量
的值始终保持近似恒定(
),直到 变量 x(或 x 的近似值)减到 0 为止,此时 变量 y 的值就是算法所求的
的值。具体英文算法如下(考虑到计算机的有限精度限制,引入很小的常数
):
-
E1. [Initialize.] Set
,
, and
, where
is the largest possible value of x, and
is the nearest approximation to
. (The quantity
will remain approximately constant in the following steps.)
-
E2. [Test for end.] If
, stop.
-
E3. [Compare.] If
, increase
by 1 and repeat this step.
-
E4. [Reduce values.] Set
,
,
and go to E2.
当然算法需要复用 25 题用到过的所有 k 对应的
的值的辅助表。
在步骤 E1 中,假设 y 的初值(考虑近似误差)为 ,在其后每次执行 E4 时,都可能会产生计算误差,对应到第 j 次 (j > 0),可表示为
,
,其中
和
是每次 E4 在有限精度限制下导致的小误差。当算法终止时,得到最终结果
。
有必要指出, 那个辅助表中 的值也只能是在有限精度下的近似值。但当基数 b 是 e 时(自然对数),计算机可以算出
更为精确的值。根据麦克劳林级数展开,
,那么就有
,这个计算在电脑中可以通过简单的移位操作更加高效地完成。
29. [HM20 ] Let x be a real number greater than 1. (a) For what real number b > 1 is
a minimum? (b) For what integer b > 1 is it a minimum? (c) For what integer b > 1 is
a minimum?
解:
将 改写成
。
(a): 令 f(b) = ,则
,若要让 f(b) 取到最小值,则必须
,再和其它 b 的取值比较,显然有 当 b = e 时
有最小值。
(b): 当 b 是大于 1 的整数时,其实就是看 什么时候最小。显然,当 b 是大于 e 的整数时,随着 b 的增大,
也会相应增大。现在只需要比较下当 b = 2 和 b = 3 时
的值哪个大就行。由于 ,可知当 b = 3 时
取到最小值,也就是
在 b = 3 时取到最小值。
(c): 由 ,当 b 是大于 1 的整数时,其实就是看
什么时候最小。貌似和上面一样, 当 b 是大于 e 的整数时,随着 b 的增大,
也会相应增大。而且比较 b = 2 和 b = 3 时的情况,也有
,即 b =3 时
比 b = 2 时更小。微妙之处在于比较 b = 3 和 b = 4 的情况, 有 ,即
当 b = 3 时 比 b = 4 时 更大。且
,即
当 b = 5 时 比 b = 4 时 更大。这说明 b = 4 才是
向上的拐点,所以可得 b = 4时
取到最小值,也就是
在 b = 4 时取到最小值。
30. [12] Simplify the expression
, assuming that
and
.
解:
对这个表达式再取一次自然对数,就得到 ,因此这个表达式可直接简化为 x 。