対数微分法は、通常の微分法では計算が煩雑になる関数を効率よく微分するためのテクニックです。特に、変数がべき乗の指数部分に含まれる関数(例: $x^x$)や、多数の因子の積や商からなる関数を微分する際に威力を発揮します。
対数微分法の基本的なアイデアは、「まず両辺の対数を取り、それから微分する」というものです。対数の性質を利用することで、積が和に、商が差に変換され、微分の計算が大幅に簡単になります。
本記事の内容
- 対数微分法の原理
- さまざまな関数への適用例
- Pythonでの数値的な検証
前提知識
この記事を読む前に、以下の概念を理解しておくと理解が深まります。
- 微分の基本(連鎖律、積の微分)
- 対数関数の性質($\ln(ab) = \ln a + \ln b$ 等)
対数微分法とは
基本原理
$y = f(x) > 0$ の微分を求めたいとき、両辺の自然対数を取ると、
$$ \ln y = \ln f(x) $$
両辺を $x$ で微分すると、左辺は連鎖律により
$$ \frac{d}{dx} \ln y = \frac{1}{y} \cdot \frac{dy}{dx} $$
したがって、
$$ \frac{1}{y} \cdot \frac{dy}{dx} = \frac{d}{dx} \ln f(x) $$
$$ \frac{dy}{dx} = y \cdot \frac{d}{dx} \ln f(x) $$
これが対数微分法の基本式です。右辺の $\ln f(x)$ の微分が簡単に計算できるとき、対数微分法は非常に有効です。
対数の性質の復習
対数微分法の有効性は、以下の対数の性質に基づいています。
$$ \begin{align} \ln(ab) &= \ln a + \ln b \quad \text{(積 → 和)} \\ \ln\left(\frac{a}{b}\right) &= \ln a – \ln b \quad \text{(商 → 差)} \\ \ln(a^n) &= n \ln a \quad \text{(べき → 積)} \end{align} $$
具体例1: $y = x^x$ の微分
$y = x^x$($x > 0$)は、$x$ が底と指数の両方に現れるため、通常のべき関数の微分法 ($x^n$ の微分) も指数関数の微分法 ($a^x$ の微分) も直接適用できません。
両辺の対数を取ります。
$$ \ln y = \ln(x^x) = x \ln x $$
両辺を $x$ で微分します。
$$ \begin{align} \frac{1}{y} \cdot \frac{dy}{dx} &= \frac{d}{dx}(x \ln x) \\ &= 1 \cdot \ln x + x \cdot \frac{1}{x} \quad \text{(積の微分)} \\ &= \ln x + 1 \end{align} $$
したがって、
$$ \frac{dy}{dx} = y(\ln x + 1) = x^x(\ln x + 1) $$
具体例2: 積と商の微分
$$ y = \frac{x^2 \sqrt{x+1}}{(x-1)^3} \quad (x > 1) $$
通常の商の微分と積の微分を組み合わせると計算が煩雑ですが、対数微分法を使うと見通しよく計算できます。
$$ \ln y = 2\ln x + \frac{1}{2}\ln(x+1) – 3\ln(x-1) $$
両辺を $x$ で微分します。
$$ \frac{1}{y} \cdot \frac{dy}{dx} = \frac{2}{x} + \frac{1}{2(x+1)} – \frac{3}{x-1} $$
$$ \frac{dy}{dx} = \frac{x^2 \sqrt{x+1}}{(x-1)^3} \left(\frac{2}{x} + \frac{1}{2(x+1)} – \frac{3}{x-1}\right) $$
具体例3: $y = x^{\sin x}$ の微分
$y = x^{\sin x}$($x > 0$)も対数微分法で扱います。
$$ \ln y = \sin x \cdot \ln x $$
$$ \frac{1}{y} \cdot \frac{dy}{dx} = \cos x \cdot \ln x + \sin x \cdot \frac{1}{x} $$
$$ \frac{dy}{dx} = x^{\sin x}\left(\cos x \cdot \ln x + \frac{\sin x}{x}\right) $$
一般のべき乗関数 $y = f(x)^{g(x)}$
一般に、$y = f(x)^{g(x)}$($f(x) > 0$)の微分は、対数微分法により
$$ \ln y = g(x) \ln f(x) $$
$$ \frac{1}{y} \frac{dy}{dx} = g'(x) \ln f(x) + g(x) \frac{f'(x)}{f(x)} $$
$$ \boxed{\frac{dy}{dx} = f(x)^{g(x)} \left[ g'(x) \ln f(x) + g(x) \frac{f'(x)}{f(x)} \right]} $$
Pythonでの検証
対数微分法で求めた導関数を、数値微分と比較して検証します。
import numpy as np
import matplotlib.pyplot as plt
def numerical_derivative(f, x, h=1e-8):
"""中心差分による数値微分"""
return (f(x + h) - f(x - h)) / (2 * h)
# y = x^x の解析的導関数と数値微分の比較
def f_xx(x):
return x**x
def f_xx_deriv(x):
"""対数微分法で求めた導関数"""
return x**x * (np.log(x) + 1)
x = np.linspace(0.1, 3, 200)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 関数のプロット
ax = axes[0]
ax.plot(x, f_xx(x), 'b-', linewidth=2, label='$y = x^x$')
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.set_title('$y = x^x$')
ax.legend()
ax.grid(True, alpha=0.3)
# 導関数の比較
ax = axes[1]
y_analytical = f_xx_deriv(x)
y_numerical = np.array([numerical_derivative(f_xx, xi) for xi in x])
ax.plot(x, y_analytical, 'b-', linewidth=2, label='Analytical: $x^x(\\ln x + 1)$')
ax.plot(x, y_numerical, 'r--', linewidth=2, label='Numerical derivative')
ax.set_xlabel('$x$')
ax.set_ylabel("$y'$")
ax.set_title("Derivative of $x^x$")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('logarithmic_differentiation.png', dpi=150, bbox_inches='tight')
plt.show()
# 数値的な誤差の確認
x_test = np.array([0.5, 1.0, 1.5, 2.0, 2.5])
print("x\t\tAnalytical\tNumerical\tError")
print("-" * 60)
for xi in x_test:
a = f_xx_deriv(xi)
n = numerical_derivative(f_xx, xi)
print(f"{xi:.1f}\t\t{a:.6f}\t{n:.6f}\t{abs(a-n):.2e}")
実行結果として、解析的な導関数と数値微分がほぼ一致することが確認できます。これにより、対数微分法で求めた結果の正しさを数値的に検証できます。
import numpy as np
import matplotlib.pyplot as plt
# y = x^sin(x) の可視化
def f_xsinx(x):
return x**np.sin(x)
def f_xsinx_deriv(x):
return x**np.sin(x) * (np.cos(x) * np.log(x) + np.sin(x) / x)
x = np.linspace(0.1, 4*np.pi, 500)
y = f_xsinx(x)
dy = f_xsinx_deriv(x)
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
axes[0].plot(x, y, 'b-', linewidth=2)
axes[0].set_ylabel('$y$')
axes[0].set_title('$y = x^{\\sin x}$')
axes[0].grid(True, alpha=0.3)
axes[1].plot(x, dy, 'r-', linewidth=2)
axes[1].axhline(y=0, color='k', linewidth=0.5)
axes[1].set_xlabel('$x$')
axes[1].set_ylabel("$y'$")
axes[1].set_title("Derivative of $x^{\\sin x}$")
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('xsinx_derivative.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、対数微分法の仕組みと使い方を解説しました。
- 対数微分法の基本: 両辺の対数を取ってから微分する手法
- 有効な場面: $x^x$ のような変数がべき乗の指数に含まれる関数、多数の因子の積・商
- 一般公式: $[f(x)^{g(x)}]’ = f(x)^{g(x)} [g'(x) \ln f(x) + g(x) f'(x)/f(x)]$
- 対数の性質(積→和、商→差、べき→積)が計算を簡略化する鍵
次のステップとして、高階微分やライプニッツの公式についても学んでみましょう。