有理関数の積分と部分分数分解をマスターする

有理関数の積分は、微積分の中でも特にテクニカルな分野です。有理関数(多項式の比)は、部分分数分解(partial fraction decomposition)を行うことで、必ず初等関数で積分できます。この事実は、有理関数の積分に対する完全なアルゴリズムが存在することを意味しています。

部分分数分解は、積分だけでなくラプラス変換の逆変換、z変換、制御工学の伝達関数の解析など、工学の幅広い場面で活用されます。本記事では、部分分数分解の体系的な手順と、各パターンの積分方法を解説します。

本記事の内容

  • 有理関数と部分分数分解の原理
  • 実数1次因子(単根・重根)の場合
  • 既約2次因子の場合
  • 各パターンの積分法
  • Pythonでのsympyを使った自動計算

前提知識

有理関数とは

有理関数(rational function)とは、2つの多項式の比:

$$ R(x) = \frac{P(x)}{Q(x)} = \frac{a_m x^m + \cdots + a_1 x + a_0}{b_n x^n + \cdots + b_1 x + b_0} $$

真分数と仮分数

  • 真分数: $\deg P < \deg Q$(分子の次数 < 分母の次数)
  • 仮分数: $\deg P \geq \deg Q$

仮分数の場合は、多項式の除法(長除法)で:

$$ \frac{P(x)}{Q(x)} = S(x) + \frac{R(x)}{Q(x)} $$

($S(x)$ は商の多項式、$R(x)$ は余りで $\deg R < \deg Q$)

$S(x)$ の積分は簡単なので、以下では真分数 $R(x)/Q(x)$ の積分に集中します。

部分分数分解の原理

定理

任意の真分数 $\frac{P(x)}{Q(x)}$ は、$Q(x)$ の因数分解に応じて、以下の形の和に分解できます。

パターン1: 異なる1次因子

$Q(x) = (x – a_1)(x – a_2) \cdots (x – a_n)$ のとき:

$$ \frac{P(x)}{Q(x)} = \frac{A_1}{x – a_1} + \frac{A_2}{x – a_2} + \cdots + \frac{A_n}{x – a_n} $$

パターン2: 重複する1次因子

$(x – a)^k$ が因子に含まれる場合:

$$ \frac{A_1}{x – a} + \frac{A_2}{(x – a)^2} + \cdots + \frac{A_k}{(x – a)^k} $$

パターン3: 既約2次因子

$x^2 + bx + c$(判別式 < 0)が因子に含まれる場合:

$$ \frac{Ax + B}{x^2 + bx + c} $$

重複する場合は $(x^2 + bx + c)^k$ に対応して $k$ 個の項が生じます。

係数の決定法

方法1: 代入法(ヘヴィサイドの被覆法)

異なる1次因子の場合に最も便利です。

$$ \frac{P(x)}{(x-a_1)(x-a_2)\cdots} = \frac{A_1}{x-a_1} + \frac{A_2}{x-a_2} + \cdots $$

$A_i$ を求めるには、両辺に $(x-a_i)$ を掛けて $x = a_i$ を代入:

$$ A_i = \frac{P(a_i)}{\prod_{j \neq i}(a_i – a_j)} $$

方法2: 恒等式の比較

両辺を通分して、分子の各次数の係数を比較する方法。すべてのパターンに使えます。

具体例と積分

例1: 異なる1次因子

$$ \int \frac{3x + 5}{(x+1)(x+2)} \, dx $$

部分分数分解:

$$ \frac{3x+5}{(x+1)(x+2)} = \frac{A}{x+1} + \frac{B}{x+2} $$

$x = -1$: $A = \frac{3(-1)+5}{(-1)+2} = \frac{2}{1} = 2$

$x = -2$: $B = \frac{3(-2)+5}{(-2)+1} = \frac{-1}{-1} = 1$

$$ \int \frac{3x+5}{(x+1)(x+2)} \, dx = \int \frac{2}{x+1} \, dx + \int \frac{1}{x+2} \, dx = 2\ln|x+1| + \ln|x+2| + C $$

例2: 重根

$$ \int \frac{x+3}{(x-1)^2} \, dx $$

部分分数分解:

$$ \frac{x+3}{(x-1)^2} = \frac{A}{x-1} + \frac{B}{(x-1)^2} $$

両辺に $(x-1)^2$ を掛けて:$x + 3 = A(x-1) + B$

$x = 1$: $B = 4$

$x$ の係数を比較: $A = 1$

$$ \int \frac{x+3}{(x-1)^2} \, dx = \ln|x-1| – \frac{4}{x-1} + C $$

例3: 既約2次因子

$$ \int \frac{2x+1}{x^2+4} \, dx $$

分子を $\frac{d}{dx}(x^2+4) = 2x$ の部分とそれ以外に分けます:

$$ = \int \frac{2x}{x^2+4} \, dx + \int \frac{1}{x^2+4} \, dx $$

$$ = \ln(x^2+4) + \frac{1}{2}\arctan\frac{x}{2} + C $$

例4: 混合型

$$ \int \frac{x^2 + 2}{x(x^2+1)} \, dx $$

部分分数分解:

$$ \frac{x^2+2}{x(x^2+1)} = \frac{A}{x} + \frac{Bx+C}{x^2+1} $$

両辺に $x(x^2+1)$ を掛けて:$x^2 + 2 = A(x^2+1) + (Bx+C)x$

$x = 0$: $2 = A$

$x^2$ の係数: $1 = A + B \implies B = -1$

$x$ の係数: $0 = C$

$$ = \int \frac{2}{x} \, dx + \int \frac{-x}{x^2+1} \, dx = 2\ln|x| – \frac{1}{2}\ln(x^2+1) + C $$

積分公式のまとめ

部分分数分解後に現れる積分:

被積分関数 結果
$\frac{1}{x-a}$ $\ln\|x-a\| + C$
$\frac{1}{(x-a)^n}$ $(n \geq 2)$ $\frac{-1}{(n-1)(x-a)^{n-1}} + C$
$\frac{1}{x^2+a^2}$ $\frac{1}{a}\arctan\frac{x}{a} + C$
$\frac{x}{x^2+a^2}$ $\frac{1}{2}\ln(x^2+a^2) + C$

Pythonでの実装

sympyによる部分分数分解と積分

import sympy as sp

x = sp.Symbol('x')

# 例1: 異なる1次因子
expr1 = (3*x + 5) / ((x + 1) * (x + 2))
pf1 = sp.apart(expr1, x)
int1 = sp.integrate(expr1, x)
print("例1: 異なる1次因子")
print(f"  元の式: {expr1}")
print(f"  部分分数: {pf1}")
print(f"  積分: {int1}")

# 例2: 重根
expr2 = (x + 3) / (x - 1)**2
pf2 = sp.apart(expr2, x)
int2 = sp.integrate(expr2, x)
print(f"\n例2: 重根")
print(f"  元の式: {expr2}")
print(f"  部分分数: {pf2}")
print(f"  積分: {int2}")

# 例3: 既約2次因子
expr3 = (x**2 + 2) / (x * (x**2 + 1))
pf3 = sp.apart(expr3, x)
int3 = sp.integrate(expr3, x)
print(f"\n例3: 既約2次因子")
print(f"  元の式: {expr3}")
print(f"  部分分数: {pf3}")
print(f"  積分: {int3}")

# 例4: より複雑な例
expr4 = (2*x**3 + x**2 - 4*x + 1) / (x**2 * (x**2 + 1))
pf4 = sp.apart(expr4, x)
int4 = sp.integrate(expr4, x)
print(f"\n例4: 複雑な例")
print(f"  元の式: {expr4}")
print(f"  部分分数: {pf4}")
print(f"  積分: {int4}")

数値検証

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate as sci_integrate

# (3x+5)/((x+1)(x+2)) の積分を数値的に検証
def f(x):
    return (3*x + 5) / ((x + 1) * (x + 2))

def F_analytic(x):
    """解析解: 2*ln|x+1| + ln|x+2|"""
    return 2 * np.log(np.abs(x + 1)) + np.log(np.abs(x + 2))

x_vals = np.linspace(0, 5, 300)

# 数値積分(0からxまで)
F_numerical = [sci_integrate.quad(f, 0, xi)[0] for xi in x_vals]
F_analytical = F_analytic(x_vals) - F_analytic(0)

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左: 被積分関数
axes[0].plot(x_vals, f(x_vals), 'b-', linewidth=2)
axes[0].set_xlabel('x', fontsize=12)
axes[0].set_ylabel('f(x)', fontsize=12)
axes[0].set_title(r'$f(x) = \frac{3x+5}{(x+1)(x+2)}$', fontsize=14)
axes[0].grid(True, alpha=0.3)

# 右: 原始関数の比較
axes[1].plot(x_vals, F_analytical, 'b-', linewidth=2, label='解析解')
axes[1].plot(x_vals, F_numerical, 'r--', linewidth=2, label='数値積分')
axes[1].set_xlabel('x', fontsize=12)
axes[1].set_ylabel('F(x)', fontsize=12)
axes[1].set_title('原始関数の比較', fontsize=14)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

max_err = max(abs(a - n) for a, n in zip(F_analytical, F_numerical))
print(f"最大誤差: {max_err:.2e}")

まとめ

本記事では、有理関数の積分と部分分数分解を解説しました。

  • 有理関数(多項式の比)は部分分数分解により必ず初等関数で積分可能
  • 仮分数の場合はまず多項式の除法で真分数に変換
  • 異なる1次因子: $\frac{A}{x-a}$ → $\ln|x-a|$
  • 重根: $\frac{A}{(x-a)^n}$ → べき関数の積分
  • 既約2次因子: $\frac{Ax+B}{x^2+bx+c}$ → $\ln$ と $\arctan$ の組み合わせ
  • 係数の決定は代入法(ヘヴィサイド)と恒等式の比較を使い分ける
  • sympyで自動的に部分分数分解と積分が可能

次のステップとして、以下の記事も参考にしてください。