
含复合函数的对数函数求导:方法与步骤
对数函数里出现复合表达式时,求导的核心并不复杂:先识别最外层的对数,再对内部函数使用链式法则。真正容易出错的地方,是把内层导数漏掉、混淆自然对数与一般底数对数,或忽略对数的定义域。本文从公式、步骤和例题入手,说明不同情形的处理方法,并给出可以直接运行的 Python 符号求导示例。
一、先确认对数的定义域
在实数范围内,自然对数 ln u 只有在 u > 0 时才有定义。一般底数对数 loga u 除了要求真数 u > 0,还要求底数满足 a > 0 且 a ≠ 1。求导前先检查这些限制,因为一个表达式即使形式上能写出导数,也不代表原函数在所有实数处都有定义。
例如,ln(x² - 1) 的实数定义域要求 x² - 1 > 0,也就是 x < -1 或 x > 1。不能因为求导结果在某些其他位置有数值,就把那些位置视为原函数的定义域。
二、最基本的复合对数求导公式
设 u(x) 在某区间内可导,且 u(x) > 0。由链式法则:
d/dx [ln u(x)] = u'(x) / u(x)
可以把它理解为两步:先对外层函数 ln t 求导,得到 1/t;再乘以内层函数 u(x) 的导数,最后将 t 换回 u(x)。
一般底数为常数 a 时,利用换底公式 logau = ln u / ln a,得到:
d/dx [loga u(x)] = u'(x) / [u(x) ln a]
这里的 a 是固定常数,并且必须满足 a > 0、a ≠ 1。若底数也随 x 变化,就不能直接把它当成常数使用。
三、按步骤处理复合函数
- 确定函数范围。识别对数的真数,以及底数是否为常数;写出实数定义域限制。
- 标出外层与内层。例如
ln(sin(x² + 1))的最外层是自然对数,真数是sin(x² + 1),其内部还包含平方和正弦函数。 - 先写外层求导结构。对
ln u写成u'/u,暂时不要展开内层细节。 - 求出真数的导数。按由外到内的复合层次连续使用链式法则。
- 检查定义域与结果。确认原函数有定义,并查看分母是否可能为零;必要时保留定义域说明。
四、例题:由简单到多层复合
例 1:平方函数作为真数
求 y = ln(3x² + 2) 的导数。
令 u = 3x² + 2,则 u' = 6x。由于 3x² + 2 对所有实数都为正,定义域是全体实数。因此:
y' = 6x / (3x² + 2)
例 2:根式与多项式组合
求 y = ln(√(x² + 1)) 的导数。
令 u = √(x² + 1)。因为 x² + 1 > 0,所以根号真数为正,且 u > 0。先求内层导数:
u' = x / √(x² + 1)
代入对数求导公式:
y' = [x / √(x² + 1)] / √(x² + 1) = x / (x² + 1)
也可以先利用 ln(√v) = (1/2)ln v 化简,再求导。两种方法结果一致,但化简时仍需确认所用恒等式成立的范围。
例 3:三层复合函数
求 y = ln(sin(x² + 1)) 的导数。
设 u = sin(x² + 1)。链式法则给出 u' = cos(x² + 1) · 2x,于是:
y' = 2x cos(x² + 1) / sin(x² + 1) = 2x cot(x² + 1)
此处不能只写出余切项而漏掉 2x。另外,原函数要求 sin(x² + 1) > 0。因此这个公式只在满足该条件的实数点处适用;在正弦值为零或负值的位置,原对数函数没有实数定义。
例 4:一般底数的对数
求 y = log2(x³ - 1) 的导数。
底数 2 是大于零且不等于 1 的常数。真数要求 x³ - 1 > 0,即 x > 1。由一般底数公式:
y' = 3x² / [(x³ - 1) ln 2]
这里的 ln 2 是对底数换底产生的因子,不应省略。只有当原函数是自然对数 ln 时,公式中才没有这个因子。
五、真数含绝对值时的处理
对实数 u(x),表达式 ln|u(x)| 在 u(x) ≠ 0 时有定义。若 u 可导,则在该定义域内:
d/dx [ln|u(x)|] = u'(x) / u(x)
注意,这与 ln u(x) 的条件不同。后者要求 u(x) > 0;前者允许 u(x) 为正或为负,但不能为零。
例如 y = ln|x² - 4| 的实数定义域是 x ≠ -2 且 x ≠ 2,导数为:
y' = 2x / (x² - 4)
不能在 x = ±2 处代入该导数式,因为这些点不属于原函数的定义域。绝对值并不意味着可以忽略零点。
六、底数也是函数时
设 a(x) 和 u(x) 都随 x 变化,考虑 y = loga(x) u(x)。在实数范围内,必须在所讨论的区间满足:
u(x) > 0,即真数为正;a(x) > 0,即底数为正;a(x) ≠ 1,即底数不能为 1。
使用换底公式可写成 y = ln u / ln a。商法则给出:
y' = [u' ln a / u - (ln u) a' / a] / (ln a)²
这里的 a、u、a'、u' 都是关于 x 的函数值。公式中的每一项都来自对换底表达式求导:分子有真数变化产生的部分,底数变化也会贡献一项。
例如 y = logx(x + 1)。实数定义域要求 x > 0、x ≠ 1,同时 x + 1 > 0;综合后为 x > 0 且 x ≠ 1。求导得到:
y' = [ln x / (x + 1) - ln(x + 1) / x] / (ln x)²
在 x = 1 时,虽然真数为正,但底数等于 1,原来的对数表达式仍不符合定义条件。
七、常见错误与检查方法
- 漏掉内层导数。把
ln(5x + 3)错写成1/(5x + 3)。正确结果还要乘以内层导数 5,即5/(5x + 3)。 - 把
ln u与logau混为一谈。常数底数对数的导数分母还包含ln a。 - 忘记真数必须为正。在实数分析中,不能对负数取自然对数。若表达式是
ln|u|,条件才改为u ≠ 0。 - 把变量底数当常数。
logxu(x)必须对换底后的分式整体求导。 - 错误约掉因子。约分时要确认因子不为零,并保留原函数的定义域限制。化简后的表达式可能在额外点上有定义,但这些点未必属于原函数定义域。
- 只检查导数,不检查函数。求导结论必须针对原函数有定义且可导的区间,不能仅凭最后的分式判断。
八、可运行代码示例:用 SymPy 符号求导
下面示例使用 SymPy 计算符号导数,并检查几个表达式。安装依赖可使用 python -m pip install sympy。示例中的 positive=True 表示告知 SymPy 变量为正,有助于某些化简;它不会替代对实际问题定义域的分析,也不应在变量可能为负时随意添加。
import sympy as sp
x = sp.symbols("x", real=True)
examples = {
"ln(3*x**2 + 2)": sp.log(3 * x**2 + 2),
"ln(sqrt(x**2 + 1))": sp.log(sp.sqrt(x**2 + 1)),
"ln(sin(x**2 + 1))": sp.log(sp.sin(x**2 + 1)),
"log_2(x**3 - 1)": sp.log(x**3 - 1, 2),
}
for name, expression in examples.items():
derivative = sp.diff(expression, x)
print(name)
print(" expression :", expression)
print(" derivative :", sp.simplify(derivative))
SymPy 的 log(z) 默认表示自然对数;写成 sp.log(z, 2) 才是以 2 为底的对数。符号求导可以处理形式上的表达式,但程序打印出结果并不自动证明该结果在所有实数处都有效。比如 ln(sin(x² + 1)) 仍受正弦值大于零的限制,log_2(x³ - 1) 仍要求 x > 1。
还可以对变量底数示例求导:
import sympy as sp
x = sp.symbols("x", real=True)
expression = sp.log(x + 1, x) # 以 x 为底,x + 1 为真数
derivative = sp.diff(expression, x)
print(sp.simplify(derivative))
该表达式的实数定义域为 x > 0 且 x ≠ 1。符号计算工具通常不会替用户完整呈现所有定义域条件,因此应把定义域与导数一起记录。
九、程序输入与安全边界
上面的代码只对源码中预先写定的 SymPy 表达式求导,没有执行用户输入的 Python 代码。若要把表达式作为用户输入接入程序,不要用 Python 内置的 eval() 执行任意字符串;不可信输入可能包含并非数学表达式的代码。应采用具有明确语法和函数白名单的解析方式,并限制可用符号、函数、表达式长度及计算资源。具体解析接口和限制应以所用 SymPy 版本的文档为准。
符号求导结果也不等于对输入表达式的安全认证,更不能单凭“求导成功”判断程序或数学模型可靠。对于外部数据,应分别处理输入验证、错误信息、超时或资源限制等工程问题;这些属于软件安全与可靠性措施,不是对数求导公式本身提供的保证。
十、简明复核清单
完成一道含复合对数的求导题后,可以依次核对:
- 真数是否满足正值条件;若是真数的绝对值,是否排除了零点?
- 底数是否为固定常数?若是,其是否大于零且不等于 1?若底数可变,是否对换底后的式子整体求导?
- 是否对外层对数使用了正确公式,并乘上真数的导数?
- 多层复合是否逐层应用链式法则?
- 化简是否引入了原函数定义域以外的点?
记住最常用的两条公式:在 u > 0 时,(ln u)' = u'/u;对固定底数 a > 0 且 a ≠ 1,(logau)' = u'/(u ln a)。先写清定义域,再逐层求内函数导数,最后检查边界,通常就能可靠地处理大多数含复合函数的对数求导问题。









