像这种常见的「普通」计算器,其实啥都能算(有了极限,啥玩意都能变成加减乘除)。其中,自然对数尤其好算,本文将提供一种方法,主要利用的是计算器的开平方功能。
众所周知,自然对数有如下展开式:
\( ln{x} = x-\frac{x^{2}}{2}+\frac{x^{3}}{3}-\frac{x^{4}}{4}+\cdots \)
但这玩意对于这种「普通」计算器来说太难算了。所以,条条大路通罗马,在这里我们换一种思路。
回想一下函数 \( y = a^x (a> 0, a \neq 1) \) 的导数是怎么推出来的:
\( \frac{\mathrm{d}}{\mathrm{d}x}a^x \)
\( =\lim_{\Delta x\rightarrow 0}\frac{a^{x+ \Delta x} - a^x}{\Delta x} \)
\( =\lim_{\Delta x\rightarrow 0}a^x\frac{a^{\Delta x} - 1}{\Delta x} \)
\( =a^x\lim_{\Delta x\rightarrow 0}\frac{a^{\Delta x} - 1}{\Delta x} \) (1)
可以看出,后面那一坨极限已经跟 \(x\) 没关系了,应该等于一个跟 \(a\) 有关的常数。那么这个常数到底是多少呢?容易发现,令 \( x=0 \) 可得
\( \frac{\mathrm{d}}{\mathrm{d}x}a^x \Big|_{x=0} =\lim_{\Delta x\rightarrow 0}\frac{a^{\Delta x} - 1}{\Delta x} \)
也就是说,这个极限就等于函数在 \(x=0\) 处的导数值。根据指数函数的图像,我们「猜测」(这里就不是很严谨了,不过这不是本文的重点)当 \(a\) 取到某个值时,这个极限等于 \(1\), 此时函数的导函数恒等于函数本身。设这个值为 \(e\)(可以算出 \(e = 2.71828\cdots\), 用 \(ln{x}\) 表示以 \(e\) 为底 \(x\) 的对数),可得
\( \frac{\mathrm{d} }{\mathrm{d} x} e^x = e^x \)
所以
\( \frac{\mathrm{d} }{\mathrm{d} x} a^x \)
\(= \frac{\mathrm{d} }{\mathrm{d} x} (e^{ln{a}})^x\) (代入对数恒等式可得)
\(= \frac{\mathrm{d} }{\mathrm{d} x} e^{xln{a}} \)
\( = \frac{\mathrm{d} }{\mathrm{d} (xln{a})} e^{xln{a}} \frac{\mathrm{d} }{\mathrm{d} x}(xln{a}) \) (链式法则)
\( = e^{xln{a}}\cdot ln{a} \)
\( = {(e^{ln{a}})}^x\cdot ln{a} \)
\( = a^x\cdot ln{a} \)
跟 (1) 式比较一下,即得
\( ln{a} = \lim_{\Delta x\rightarrow 0}\frac{a^{\Delta x} - 1}{\Delta x} \)
左边是对数,右边是指数,离目标近了一步,不过还是不好算。来点黑科技,把指数式变成根式:
\( ln{a} = \lim_{x\rightarrow 0}\frac{a^{x} - 1}{x} \)
\( = \lim_{k\rightarrow +\infty }\frac{a^{(2^{-k})} - 1}{(2^{-k})} \)
\( = \lim_{k\rightarrow +\infty }(a^{\frac{1}{2^{k}} } - 1)\cdot 2^{k} \)
\( = \lim_{k\rightarrow +\infty }(\sqrt[2^k]{a} - 1)\cdot 2^{k} \)
\( = \lim_{k\rightarrow +\infty }(\underbrace{\sqrt{\cdots\sqrt{\sqrt{a}}}}_{k\times } - 1)\cdot 2^{k} \) \( (k\in \mathbb{N}) \)
这个式子的值就很好算了,只要不断开平方就行了。试着令 \(k=8\), 算一下 \( ln{2} \):
算出的值是 \( 0.694086413 \), 事实上 \( ln{2} \approx 0.693147 \), 误差 \( 0.000939413 \), 怎么样,够精确吧?再算算 \( ln{3} \):
算出的值是 \( 1.100972987 \), 事实上 \( ln{3} \approx 1.09861 \), 误差 \( 0.00236299 \), 比刚才略大。可以证明,\( x \) 越接近 \( 1 \), 用这种方法算出的 \( ln{x} \) 的近似值跟实际值误差越小。下面是函数 \( y=ln{x} \) 和 \( y=(\sqrt[256]{x}-1)\cdot 256 \) 在同一坐标系内的部分图像。可以看出,拟合得非常好:
这还只是 \( k=8 \) 时的情形, \(k\) 更大就更精确了。怎么样,这个方法不错吧?