你有没有发现:炸弹倒计时越到后面「感觉」越快?🤔 这不是错觉——对数函数(log)会告诉你答案
炸弹倒计时从 1000 开始。⚠️ 注意看:线性刻度和对数刻度有什么不同?对数刻度把大数「压扁」了!
先点「▶ 开始倒计时」,再切换速度观察。⚠️ 注意看右侧数据表中 log₁₀(x) 的变化!
| x (剩余) | log₁₀(x) | 变化率 |
|---|
刚才的倒计时游戏中,我们同时观察了剩余时间 x和对数值 log₁₀(x)。你发现了什么?
人教版必修第一册(P112):
一般地,函数 y = logₐx(a > 0 且 a ≠ 1)叫做对数函数(log),其中 x 是自变量,输入的范围(x的取值范围)是 (0, +∞)。
对数函数(log)是指数函数(a的x次方) y = aˣ 的反函数。
对数函数(log)回答的问题是「a 的几次方等于 x?」
比如:log₁₀1000 = 3,因为 10³ = 1000
对数函数(log)的本质是把乘除变成加减,把乘方变成乘法:
• 地震用里氏震级(对数)——每差 1 级,能量差约 30 倍
• 声音用分贝(对数)——每差 10dB,强度差 10 倍
• 炸弹倒计时也一样:从 1000 到 1,在对数刻度上只是从 3 到 0
在对数函数(log) y = logₐx 中,a 叫做底数。 不同的底数,图象的形状不同。常用底数有 10(常用对数)和 e(自然对数)。
把 a 调到 2,观察 x=1,2,4,8,16 时 y 的值——它们分别是 0,1,2,3,4!这就是二进制的对数。
import math # 常用对数(底数为10) print(math.log10(1000)) # 3.0 print(math.log10(100)) # 2.0 print(math.log10(1)) # 0.0 # 自然对数(底数为e) print(math.log(math.e)) # 1.0 # 换底公式:log_a(b) = log(b) / log(a) def log_base(a, b): return math.log(b) / math.log(a) print(log_base(2, 32)) # 5.0 print(log_base(3, 81)) # 4.0
3.0 2.0 0.0 1.0 5.0 4.0
import numpy as np import matplotlib.pyplot as pt x = np.linspace(0.1, 20, 200) for a in [2, 5, 10, np.e]: y = np.log(x) / np.log(a) # 换底公式 pt.plot(x, y, 'o-', label=f'a={a}') pt.axhline(0, color='k', lw=0.5) pt.axvline(0, color='k', lw=0.5) pt.legend() pt.savefig('log_curves.png')