zoukankan      html  css  js  c++  java
  • 用 Basic Mode 的计算器算对数(顺带解释自然底数 e 的来历)

    像这种常见的「普通」计算器,其实啥都能算(有了极限,啥玩意都能变成加减乘除)。其中,自然对数尤其好算,本文将提供一种方法,主要利用的是计算器的开平方功能。


    众所周知,自然对数有如下展开式:

    ( ln{(1+x)} = x-frac{x^{2}}{2}+frac{x^{3}}{3}-frac{x^{4}}{4}+cdots ;; left ( |x| < 1 ight ) )

    但这玩意对于这种「普通」计算器来说太难算了。所以,条条大路通罗马,在这里我们换一种思路。

    回想一下函数 ( y = a^x (a> 0, a eq 1) ) 的导数是怎么推出来的:

    ( frac{mathrm{d}}{mathrm{d}x}a^x )

    ( =lim_{Delta x ightarrow 0}frac{a^{x+ Delta x} - a^x}{Delta x} )

    ( =lim_{Delta x ightarrow 0}a^xfrac{a^{Delta x} - 1}{Delta x} )

    ( =a^xlim_{Delta x ightarrow 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 ightarrow 0}frac{a^{Delta x} - 1}{Delta x} )

    也就是说,这个极限就等于函数在 (x=0) 处的导数值。根据指数函数的图像,我们「猜测」(这里就不是很严谨了,不过这不是本文的重点)当 (a) 取到某个值时,(x=0)处的切线斜率等于 (1), 即这个极限等于 (1), 此时函数的导函数恒等于函数本身。设这个值为 (e)(用 (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}})}^xcdot ln{a} )

    ( = a^xcdot ln{a} )

    跟 (1) 式比较一下,即得

    ( ln{a} = lim_{Delta x ightarrow 0}frac{a^{Delta x} - 1}{Delta x} ) (2)


    那么,这个 (e) 到底等于多少呢?取反函数,得:

    ( e^x = lim_{p ightarrow +infty }{(frac{x}{p}+1)}^{p} )

    ( e = lim_{p ightarrow +infty }{(frac{1}{p}+1)}^{p} )

    可以算出 (e = 2.71828cdots), 这即是「自然对数的底」,( ln{x} ) 即 (x) 的「自然对数」。


     (2) 式左边是对数,右边是幂,离目标近了一步,不过还是不好算。来点黑科技,把指数式变成根式:

     ( ln{a} = lim_{x ightarrow 0}frac{a^{x} - 1}{x} )

    ( = lim_{k ightarrow +infty }frac{a^{(2^{-k})} - 1}{(2^{-k})} )

    ( = lim_{k ightarrow +infty }(a^{frac{1}{2^{k}} } - 1)cdot 2^{k} )

    ( = lim_{k ightarrow +infty }(sqrt[2^k]{a} - 1)cdot 2^{k} )

    ( = lim_{k ightarrow +infty }(underbrace{sqrt{cdotssqrt{sqrt{a}}}}_{k imes } - 1)cdot 2^{k} ) ( (kin 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) 更大就更精确了。怎么样,这个方法不错吧?

  • 相关阅读:
    JVM视角:值传递or引用传递?【转】
    mybaits trim用法
    Collections.shuffle()用法
    api缓存
    接口开发
    Integer.parseInt()和这个Integer.valueOf()的详解【转】
    MyBatis 通过包含的jdbcType类型
    idea 相关设置
    idea快捷键
    equals 与 ==
  • 原文地址:https://www.cnblogs.com/li-hua/p/5590359.html
Copyright © 2011-2022 走看看