对数函数求导公式及常见题型解析

百科常识4小时前发布 jdkjadmin
0 00
对数函数求导公式及常见题型解析

对数函数求导公式及常见题型解析

对数求导看起来公式不多,真正容易出错的地方却不在“记住一个倒数”,而在于判断对数的底数和真数是否满足条件、复合函数的内层导数有没有漏掉,以及化简时是否改变了函数的定义域。本文从基本公式讲起,逐步分析常见题型、参数限制和数值计算中的注意事项,并提供可以运行的 Python 示例。

一、先明确对数的定义域

在实数范围内,常见对数函数写作

y = logax

其中底数和真数必须满足:

  • a > 0:对数底数必须为正数;
  • a ≠ 1:底数为 1 时,1y 恒等于 1,无法表示任意正数;
  • x > 0:实数对数的真数必须为正数。

因此,logax作为实函数的定义域是x > 0。如果底数也是变量,例如logxt,还必须同时满足x > 0、x ≠ 1和t > 0。

后续公式默认讨论实数微积分。若表达式含有参数,求导之前应先确定参数取值以及函数在哪些区间内有定义。对数函数的导数只在原函数定义且相关分母不为零的地方讨论。

二、对数函数求导基本公式

1. 自然对数

自然对数记作ln x,其底数是数学常数e。当x > 0时:

(ln x)' = 1/x

如果真数是一个可导函数u(x),链式法则给出:

(ln u(x))' = u'(x)/u(x)

但这个公式用于原函数ln u(x)时,必须有u(x) > 0。不能仅仅因为右侧形式上可以写出u'/u,就忽略左侧对数的定义域。

例如,设y = ln(3x2 + 1)。由于3x2 + 1 > 0对所有实数x成立,原函数定义域为全体实数。求导时先求内层导数:

y' = 6x/(3x2 + 1)

2. 一般底数的对数

由换底公式:

logax = ln x / ln a

当底数a是固定常数,且a > 0、a ≠ 1、x > 0时,ln a是非零常数,因此:

(logax)' = 1/(x ln a)

复合函数形式为:

(logau(x))' = u'(x)/(u(x) ln a)

这里要求u(x) > 0。如果0 < a < 1,则ln a < 0,导数自然带负号;不需要另外改写公式。

例如:

y = log2(x2 + 1)

因为真数始终为正,且底数 2 合法,所以:

y' = 2x/((x2 + 1)ln 2)

3. 绝对值形式

有时会遇到ln|u(x)|。当u(x) ≠ 0时,绝对值内部为正,且在不穿过零点的区间上:

(ln|u(x)|)' = u'(x)/u(x)

注意,此处的定义域条件是u(x) ≠ 0,而不是u(x) > 0。定义域通常由若干个不跨越u(x)=0的区间组成。例如,ln|x|在x ≠ 0时有定义,导数是1/x。

不要把ln|u|与ln u混为一谈。后者在实数范围内只要求u > 0,前者允许u为负,但仍不允许u=0。

三、复合对数函数:先检查定义域,再用链式法则

对数复合函数的核心步骤是:确定内层函数的符号,再将“真数的导数除以真数”。如果还有外层函数,则继续应用相应求导法则。

题型一:多项式或简单函数作真数

例:求y = ln(x2 - 4x + 5)的导数。

先检查真数:

x2 - 4x + 5 = (x - 2)2 + 1 > 0

所以定义域是全体实数。由复合函数求导法则:

y' = (2x - 4)/(x2 - 4x + 5)

如果真数不是恒正,需要先解不等式。例如ln(x - 3)的定义域是x > 3,导数公式虽为1/(x - 3),但不能据此把定义域扩展到其他实数。

题型二:幂函数作真数

例:求y = ln(x3)的导数。

在实数范围内,要求x3 > 0,也就是x > 0。在这个定义域上可写为y = 3 ln x,于是:

y' = 3/x

公式直接计算也得到3x2/x3 = 3/x,但其适用区间仍是原函数的定义域x > 0。

另一个常见形式是ln(x2)。它的定义域为x ≠ 0,不是全体实数,也不是只限x > 0。因为在定义域内有ln(x2) = 2ln|x|,所以导数为2/x。这里的定义域包含正、负两部分,但不包含零。

题型三:对数外面还有函数

如果函数形如y = [ln u(x)]n,需要同时使用幂函数求导和链式法则:

y' = n[ln u(x)]n-1 · u'(x)/u(x)

例如y = [ln(x2 + 1)]3,有:

y' = 3[ln(x2 + 1)]2 · 2x/(x2 + 1)

常见错误是只对最外层的立方求导,或者只写出对数的导数,漏掉另一层的导数。遇到嵌套结构时,可以先标出最外层、中间层、最内层,逐层相乘。

四、对数求导法:处理复杂乘积和变指数

对数求导法不是一种新的基本求导规则,而是先对函数取对数,将乘积、商或幂次转化为更易求导的表达式,再解出y'。它特别适合以下形式:

  • 多个因子相乘或相除,直接使用乘积法则会产生很多项;
  • 变量同时出现在底数和指数位置,例如xx;
  • 指数本身是较复杂函数,例如u(x)v(x)。

步骤与条件

常用步骤如下:

  1. 先判断原函数在哪些点有定义;
  2. 在适用的区间上令y=f(x),对等式两边取自然对数;
  3. 利用对数运算法则展开,再对两边求导;
  4. 将结果整理为含y'的等式,并代回原函数;
  5. 检查所得到的导数是否与原函数的定义域一致。

对于标准形式y = u(x)v(x),若想直接使用实数形式的取对数过程,通常要在u(x) > 0的区间内进行:

ln y = v ln u

进一步得到:

y' = uv[v' ln u + v·u'/u]

如果底数可能为负,不能不加说明地套用这套实数推导。负底数的实数幂只在某些特定指数条件下有意义,且随参数变化时未必构成一个可导的实函数。应先分析原函数的定义和定义域,再决定是否能取实数对数。

例:求xx的导数

在实数范围内,xx用标准实数幂函数解释时,通常在x > 0上使用。令y=xx,两边取自然对数:

ln y = x ln x

求导得:

y'/y = ln x + 1

所以:

y' = xx(ln x + 1)

这里ln x要求x > 0,也与本题采用的实数定义域相符。

例:乘积中含多个对数

对y = x2√(x + 1)/(x + 2)3求导时,可尝试先取对数。但要注意,若直接写ln y,必须确认y > 0。在x > 0时,上式的各因子使y > 0,因此可以写成:

ln y = 2ln x + (1/2)ln(x + 1) - 3ln(x + 2)

两边求导:

y'/y = 2/x + 1/[2(x + 1)] - 3/(x + 2)

因此:

y' = y[2/x + 1/[2(x + 1)] - 3/(x + 2)]

最后可将原式代回。对数求导法通常能让表达式更紧凑,但它不自动解决定义域问题;取对数前的符号检查不可省略。

五、底数是变量:变底对数的导数

若底数不是常数,固定底数公式1/(x ln a)不能直接使用。将其改写为自然对数之比:

logu(x)v(x) = ln v(x)/ln u(x)

它要求u(x) > 0、u(x) ≠ 1、v(x) > 0。对商求导可得:

(loguv)' = [v'/v · ln u - ln v · u'/u]/(ln u)2

这是变量底数与变量真数都可变化时的通用公式。若只有底数变化而真数固定,只需令v'=0;若只有真数变化而底数固定,则回到固定底数公式。

例:y = logx4。定义域要求x > 0且x ≠ 1。由换底公式:

y = ln 4/ln x

因此:

y' = -ln 4/[x(ln x)2]

求导后仍应保留原函数的定义域限制;分母不为零只能说明导数表达式在某些点有意义,不能替代原函数的定义域分析。

六、含参数的对数题:参数限制不能省略

参数可能出现在底数、真数,也可能控制真数的正负。求导前应将参数条件列出来,再按条件确定合法区间。

1. 参数作为固定底数

对于y = logax,参数a必须满足a > 0且a ≠ 1。在满足这些条件时:

∂y/∂x = 1/(x ln a)

这里对x求导,把a视为常数。若a趋近于 1,公式分母中的ln a趋近于零,导数可能变得很大。这不是公式失效,而是函数对底数变化的敏感性在该参数附近增强。

2. 参数作为真数中的系数

考虑f(x)=ln(ax+b)。若a、b是常数,定义域条件为:

ax+b > 0

在此条件下:

f'(x)=a/(ax+b)

若a=0,函数退化为ln b:当b>0时它是常数函数,导数为 0;当b≤0时,实数函数没有定义。这种特殊情况可由通式理解,但判断定义域时仍应单独检查。

3. 参数决定真数是否恒正

例如f(x)=ln(x2+c)。定义域由不等式x2+c>0决定:

  • 当c>0时,定义域是全体实数;
  • 当c=0时,定义域为x≠0;
  • 当c<0时,要求|x|>√(-c)。

在各自定义域内,导数为:

f'(x)=2x/(x2+c)

当c<0时,不能因为化简后的分式在某些区间之外也有形式,就把那些点纳入对数函数的定义域。原函数的限制优先。

七、常见错误与检查方法

  1. 漏掉链式法则。

    把(ln u)'写成1/u,漏掉了u'。正确结果是u'/u。

  2. 忘记固定底数的ln a。

    (logax)'不是1/x,而是1/(x ln a)。只有底数为e时,才简化成1/x。

  3. 把底数当成常数。

    对于logx2或logu(x)v(x),底数在变化,必须使用换底公式后再求导。

  4. 忽略真数必须为正。

    实数范围内,ln u要求u>0;ln|u|要求u≠0。计算导数前先列定义域。

  5. 把绝对值去掉后忘记分区间。

    ln|x|可以在x<0和x>0上分别求导,但在x=0处没有定义。任何跨越零点的化简都要谨慎。

  6. 取对数时没有检查函数的符号。

    实数等式ln y要求y>0。对数求导法应在原函数为正的区间使用,不能对任意有正有负的函数直接取实数对数。

  7. 化简后误以为定义域扩大。

    例如原式可能只在某个区间有定义,化简后的导数公式却在更大的集合上有意义。导数的有效范围仍受原函数定义域约束。

一个实用的检查顺序是:先写参数条件,再解真数不等式;随后选用基本公式或换底公式;求导后检查内层导数、常数因子和原定义域。对于复杂表达式,还可以用符号计算结果交叉核对,但不能让软件替代定义域判断。

八、可运行的 Python 示例

下面的示例使用 SymPy 做符号求导和数值比较。安装依赖的命令是python -m pip install sympy。代码不读取或执行用户输入,也不使用eval;表达式直接由 SymPy 对象构造。

import sympy as sp

x = sp.symbols("x", real=True)

# ln(x^2 + 1):对所有实数 x 都有定义
f = sp.log(x**2 + 1)
df = sp.diff(f, x)

print("f(x) =", f)
print("f'(x) =", sp.simplify(df))

# 一般底数 a:此处把 a 当作固定参数。
# 对实数对数,另需满足 a > 0、a != 1、x > 0。
a = sp.symbols("a", positive=True)
g = sp.log(x, a)
dg = sp.diff(g, x)

print("d/dx log_a(x) =", sp.simplify(dg))

# 变底对数 log_x(4),定义域要求 x > 0 且 x != 1。
h = sp.log(4) / sp.log(x)
dh = sp.diff(h, x)

print("d/dx log_x(4) =", sp.simplify(dh))

# 用数值差商与解析导数作一次近似核对
point = 2.0
step = 1e-6
f_num = sp.lambdify(x, f, "math")
df_num = sp.lambdify(x, df, "math")

difference_quotient = (f_num(point + step) - f_num(point - step)) / (2 * step)
exact_derivative = df_num(point)

print("中心差商 =", difference_quotient)
print("解析导数 =", exact_derivative)

在 SymPy 中,log(x, a)表示以a为底的对数。符号计算工具通常不会自动替你完整证明所有实数定义域条件;代码注释中的参数和定义域限制仍需由使用者明确给出。尤其是带参数的不等式、分段定义和含绝对值的表达式,应先在数学上确定适用区间。

带输入的数值计算示例

若需要计算logax及其对x的导数,可以使用 Python 标准库math.log。下面的函数显式验证底数与真数限制,非法输入会抛出异常:

import math

def log_base_and_derivative(x, base):
    """返回 log_base(x) 及其对 x 的导数,仅支持实数输入。"""
    if not math.isfinite(x) or not math.isfinite(base):
        raise ValueError("x 和 base 必须是有限数值")
    if x <= 0:
        raise ValueError("对数真数 x 必须大于 0")
    if base <= 0 or base == 1:
        raise ValueError("对数底数 base 必须大于 0 且不能等于 1")

    value = math.log(x, base)
    derivative = 1.0 / (x * math.log(base))
    return value, derivative

value, derivative = log_base_and_derivative(8.0, 2.0)
print("log_2(8) =", value)
print("导数 =", derivative)

这类输入校验适用于普通数值计算中的参数检查,不等于全面的安全防护方案。实际程序还应结合应用场景处理类型转换、异常记录、调用频率和资源限制,避免直接信任外部输入。数学上合法的参数也可能导致数值计算出现精度或范围问题。

九、数值计算中的边界与稳定性

理论公式正确,不代表浮点计算在所有输入下都稳定。对数接近边界时,尤其需要注意以下情况:

  • 真数接近零。当x接近零且为正时,ln x趋向负无穷;其导数1/x也会变得很大。程序应按业务需求限制输入范围,而不是把接近零的结果误认为普通有限值。
  • 底数接近 1。ln a接近零,1/(x ln a)可能非常大。若底数来自测量或用户输入,应考虑参数容差和结果范围。
  • 计算ln(1+t)时的精度损失。当t非常小时,先算1+t可能丢失有效数字。Python 的math.log1p(t)专门用于较稳定地计算ln(1+t)。
  • 指数与对数配合时避免不必要的中间量。像exp(x)-1在x接近零时也可能损失精度,Python 提供math.expm1(x)。这是数值稳定性工具,不是对数求导公式的改变。

示例:

import math

t = 1e-12

naive = math.log(1.0 + t)
stable = math.log1p(t)

print("直接计算 =", naive)
print("log1p =", stable)

如果需要将对数用于数据分析或评分模型,还应弄清楚输入是否可能为零、负数、非有限值,以及业务上应如何处理这些值。简单地把非法输入替换成一个极小正数,会改变计算含义;只有在有明确建模理由并记录规则时,才应采用这样的处理策略。

十、练习与答案

练习一

求y=log3(5x-1)的定义域和导数。

解:真数要求5x-1>0,所以定义域为x>1/5。导数为:

y'=5/[(5x-1)ln 3]

练习二

求y=ln|x2-1|的定义域和导数。

解:要求x2-1≠0,即x≠±1。定义域为实数中去掉-1和1的部分,导数为:

y'=2x/(x2-1)

导数公式适用于定义域内的各个区间;函数在x=±1处没有定义。

练习三

求y=(x+1)x的导数。

解:在实数范围内,先取对数通常要求底数x+1>0,即x>-1。令y=(x+1)x,取对数得ln y=x ln(x+1)。两边求导:

y'/y=ln(x+1)+x/(x+1)

因此:

y'=(x+1)x[ln(x+1)+x/(x+1)]

练习四

求y=log2x(x+1)的导数及定义域。

解:底数要求2x>0且2x≠1,真数要求x+1>0。综合得到x>0且x≠1/2。换底后:

y=ln(x+1)/ln(2x)

由商法则:

y'=[ln(2x)/(x+1)-ln(x+1)/x]/[ln(2x)]2

这个例子同时包含变量底数和变量真数,先列定义域再换底,可以避免漏掉底数不能为 1 的限制。

结语

对数求导的基础公式可以概括为:自然对数的导数是“真数的导数除以真数”;以固定常数a为底的对数,还要除以ln a;底数变化时,则先用换底公式。对数求导法适合简化复杂乘积和变指数表达式,但取对数前必须确认函数在所讨论区间为正。

做题时最稳妥的流程是:先列出底数、真数和参数条件,解出定义域;再选择基本公式、链式法则或换底公式;最后检查结果是否遗漏内层导数、常数因子或原函数的定义域限制。掌握这套流程,比单独背公式更能避免常见错误,也更容易把解析推导可靠地转化为程序中的数值计算。

© 版权声明

相关文章