関数電卓やコンピュータは、$\sin$, $\cos$, $e^x$ のような超越関数をどのように計算しているのでしょうか。もちろん、CPUの中に無限の精度を持つ「三角関数回路」が入っているわけではありません。実際には、これらの関数を多項式で近似して計算しています。この「関数を多項式で表す」技法こそがテイラー展開です。
テイラー展開は、微積分学の中でも最も応用範囲が広い道具の一つです。その重要性は、以下のような場面で実感できます。
- 数値計算: コンピュータが $\sin x$, $e^x$, $\ln(1+x)$ などを計算する際の基盤となるアルゴリズム
- 物理学: 微小量の近似(振り子の小角近似 $\sin\theta \approx \theta$)、相対論的運動エネルギーの非相対論的極限
- 機械学習: ニュートン法やL-BFGS法は、目的関数を2次のテイラー展開で近似して最適化を行う
- 制御工学: 非線形システムの線形化に1次のテイラー展開(ヤコビ行列)を使う
本記事の内容
- テイラー展開の直感的な理解と動機
- テイラーの定理の厳密な定義と証明
- 剰余項(ラグランジュの剰余項、コーシーの剰余項)の評価
- 代表的な関数のマクローリン展開
- 収束半径と収束の判定
- Pythonによる実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- 微分の定義と計算方法 — 導関数の定義と高階微分
- 積分の基本定理 — 微積分学の基本定理
テイラー展開とは — 関数を多項式で「翻訳」する
直感的な理解
あなたが暗い部屋にいて、懐中電灯で壁を照らしているとしましょう。懐中電灯の光が当たっている小さな範囲では壁の様子がよくわかりますが、光が届かない場所のことはわかりません。しかし、壁が滑らかであれば、光が当たっている範囲の情報から、少し離れた場所の壁の様子も「推測」できるはずです。
テイラー展開はこれと似ています。ある1点 $a$ での関数の値 $f(a)$、傾き $f'(a)$、曲がり具合 $f”(a)$、さらに高次の微分の情報を使って、$a$ の近くでの関数の振る舞いを多項式として再構成するのです。
より具体的に考えてみましょう。関数 $f(x)$ を点 $a$ の近くで多項式 $P_n(x) = c_0 + c_1(x-a) + c_2(x-a)^2 + \cdots + c_n(x-a)^n$ で近似したいとします。この多項式が $f(x)$ に「最もよく似る」ためには、$x = a$ における関数値、1次導関数、2次導関数、…、$n$ 次導関数が全て一致すべきです。
$P_n(a) = c_0 = f(a)$ から $c_0$ が決まります。$P_n'(a) = c_1 = f'(a)$ から $c_1$ が決まります。$P_n”(a) = 2c_2 = f”(a)$ から $c_2 = f”(a)/2$ が決まります。一般に $P_n^{(k)}(a) = k! \cdot c_k = f^{(k)}(a)$ から $c_k = f^{(k)}(a)/k!$ が決まります。
このようにして得られる多項式がテイラー多項式です。
テイラー展開の歴史
テイラー展開の名はイギリスの数学者ブルック・テイラー(Brook Taylor, 1685–1731)に由来します。テイラーは1715年の著書 Methodus Incrementorum Directa et Inversa でこの公式を発表しました。しかし、テイラー自身はこの結果の重要性を十分に認識していなかったようです。
実は、テイラーより前にスコットランドの数学者ジェームズ・グレゴリー(1638–1675)やスイスのヨハン・ベルヌーイ(1667–1748)がすでに同様の結果を知っていました。また、$a = 0$ の特殊な場合であるマクローリン展開は、コリン・マクローリン(1698–1746)が体系的に扱ったことで知られていますが、インドの数学者マーダヴァ(14世紀)がそれよりさらに古い時代に三角関数の級数展開を発見していたことが近年の研究で明らかになっています。
こうした歴史を踏まえると、テイラー展開は数学史の中で何度も「再発見」された自然な概念であり、それだけ微積分学の本質に深く根ざした道具であることがわかります。
ここまでで、テイラー展開の直感とその歴史的背景を見てきました。次に、この考え方を数学的に厳密に定式化しましょう。
テイラーの定理 — 数学的定義
テイラー展開を厳密に述べるには、テイラーの定理(Taylor’s theorem)が必要です。この定理は「関数を多項式で近似したとき、その誤差(剰余項)がどの程度の大きさか」を保証してくれます。言い換えれば、テイラー多項式の「近似の質」を定量的に評価するための道具です。
定理(テイラーの定理): 関数 $f$ が区間 $I$ で $n+1$ 回連続微分可能であるとする。$a \in I$ に対して、任意の $x \in I$ について次が成り立つ:
$$ \begin{equation} f(x) = \sum_{k=0}^{n} \frac{f^{(k)}(a)}{k!}(x – a)^k + R_{n+1}(x) \end{equation} $$
ここで、$R_{n+1}(x)$ は剰余項(remainder term)であり、近似の誤差を表します。
右辺の和の部分
$$ P_n(x) = \sum_{k=0}^{n} \frac{f^{(k)}(a)}{k!}(x – a)^k = f(a) + f'(a)(x-a) + \frac{f”(a)}{2!}(x-a)^2 + \cdots + \frac{f^{(n)}(a)}{n!}(x-a)^n $$
を $f$ の $a$ における $n$ 次テイラー多項式と呼びます。
各項の意味を確認しておきましょう。
| 項 | 意味 |
|---|---|
| $f(a)$ | 点 $a$ での関数値(0次の情報) |
| $f'(a)(x-a)$ | 点 $a$ での接線(1次の情報、直線近似) |
| $\frac{f”(a)}{2!}(x-a)^2$ | 点 $a$ での曲率の情報(2次の情報、放物線近似) |
| $\frac{f^{(k)}(a)}{k!}(x-a)^k$ | $k$ 次の微分情報による補正 |
$k!$ で割る理由は、$(x-a)^k$ を $k$ 回微分すると $k!$ が出てくるため、$x = a$ で $k$ 次導関数が一致するように正規化が必要だからです。
特に $a = 0$ とした場合をマクローリン展開(Maclaurin expansion)と呼びます。
$$ f(x) = \sum_{k=0}^{n} \frac{f^{(k)}(0)}{k!}x^k + R_{n+1}(x) $$
テイラーの定理の核心は剰余項 $R_{n+1}(x)$ の具体的な形にあります。剰余項にはいくつかの表現方法がありますが、最もよく使われるのがラグランジュの剰余項です。次にその導出を見ていきましょう。
剰余項の導出
ラグランジュの剰余項
テイラーの定理で最も重要なのは、剰余項がどの程度の大きさかを評価できることです。ここでは、ラグランジュの剰余項の導出を行います。
目標: $R_{n+1}(x) = \frac{f^{(n+1)}(c)}{(n+1)!}(x-a)^{n+1}$ の形を導く。ここで $c$ は $a$ と $x$ の間のある点です。
導出にはロルの定理の一般化であるコーシーの平均値の定理を使います。まず、補助関数を導入します。
$$ F(t) = f(x) – \sum_{k=0}^{n} \frac{f^{(k)}(t)}{k!}(x – t)^k $$
この関数は「$t$ を中心にした $n$ 次テイラー多項式で $f(x)$ を近似したときの誤差」を表しています。
$F(t)$ を $t$ で微分します。和の各項を $t$ で微分する際、積の微分法を使います。$k$ 番目の項は
$$ \frac{d}{dt}\left[\frac{f^{(k)}(t)}{k!}(x-t)^k\right] = \frac{f^{(k+1)}(t)}{k!}(x-t)^k + \frac{f^{(k)}(t)}{k!}\cdot(-k)(x-t)^{k-1} $$
右辺の第2項を整理すると $-\frac{f^{(k)}(t)}{(k-1)!}(x-t)^{k-1}$ となります。$k=0$ から $k=n$ まで和を取ると、テレスコーピング(隣り合う項の相殺)が起こります。
$k$ 番目の項の第1項 $\frac{f^{(k+1)}(t)}{k!}(x-t)^k$ と、$(k+1)$ 番目の項の第2項 $-\frac{f^{(k+1)}(t)}{k!}(x-t)^k$ が打ち消し合うためです。結局、残るのは $k = n$ の第1項だけです。
$$ F'(t) = -\frac{f^{(n+1)}(t)}{n!}(x – t)^n $$
次に、もう一つの補助関数 $G(t) = (x – t)^{n+1}$ を導入します。$G'(t) = -(n+1)(x-t)^n$ です。
$F(x) = 0$($t = x$ のとき近似誤差はゼロ)、$F(a) = R_{n+1}(x)$($t = a$ のとき元のテイラー多項式の剰余項)であることに注意します。また $G(x) = 0$、$G(a) = (x-a)^{n+1}$ です。
コーシーの平均値の定理により、$a$ と $x$ の間にある $c$ が存在して
$$ \frac{F(x) – F(a)}{G(x) – G(a)} = \frac{F'(c)}{G'(c)} $$
左辺に代入すると
$$ \frac{0 – R_{n+1}(x)}{0 – (x-a)^{n+1}} = \frac{-\frac{f^{(n+1)}(c)}{n!}(x-c)^n}{-(n+1)(x-c)^n} $$
右辺を整理すると $\frac{f^{(n+1)}(c)}{(n+1)!}$ となり、したがって
$$ \begin{equation} R_{n+1}(x) = \frac{f^{(n+1)}(c)}{(n+1)!}(x – a)^{n+1} \end{equation} $$
が得られました。これがラグランジュの剰余項です。$c$ は $a$ と $x$ の間のある点ですが、具体的にどの点かはわかりません。それでも、$|f^{(n+1)}|$ の上界がわかれば、誤差の上界を評価できます。
コーシーの剰余項
剰余項にはもう一つの表現としてコーシーの剰余項があります。
$$ \begin{equation} R_{n+1}(x) = \frac{f^{(n+1)}(c)}{n!}(x – c)^n(x – a) \end{equation} $$
これは上の導出で $G(t) = t – a$(つまり $G'(t) = 1$)と置いた場合に得られます。ラグランジュの剰余項と比べると、$(x-c)^n$ という因子が入っている分、状況によってはより鋭い評価が可能になります。
積分型の剰余項
剰余項の最も「正確な」表現は積分型です。
$$ \begin{equation} R_{n+1}(x) = \int_a^x \frac{f^{(n+1)}(t)}{n!}(x – t)^n \, dt \end{equation} $$
この表現は、$f^{(n+1)}$ の挙動が詳しくわかっている場合に有用です。ラグランジュの剰余項もコーシーの剰余項も、この積分型の剰余項に平均値の定理を適用することで得られます。
剰余項の3つの形を理解したところで、次にこれらを使って実際の関数のテイラー展開を求めてみましょう。
代表的な関数のマクローリン展開
ここでは、よく使われる関数のマクローリン展開($a = 0$ でのテイラー展開)を導出します。これらの展開式は、数学や物理のあらゆる場面で登場する基本公式です。
指数関数 $e^x$
$f(x) = e^x$ の場合、全ての次数の導関数が $f^{(k)}(x) = e^x$ です。したがって $f^{(k)}(0) = 1$ となり
$$ \begin{equation} e^x = \sum_{k=0}^{\infty} \frac{x^k}{k!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots \end{equation} $$
ラグランジュの剰余項は $R_{n+1}(x) = \frac{e^c}{(n+1)!}x^{n+1}$($c$ は $0$ と $x$ の間)です。$|x| \leq M$ の範囲では $|e^c| \leq e^M$ なので
$$ |R_{n+1}(x)| \leq \frac{e^M}{(n+1)!}|x|^{n+1} \to 0 \quad (n \to \infty) $$
$(n+1)!$ の増大は $|x|^{n+1}$ の増大よりはるかに速いため、剰余項は任意の $x$ に対して0に収束します。つまり、この展開は全ての実数 $x$ で収束します。
三角関数 $\sin x$ と $\cos x$
$\sin x$ の導関数は $\sin x, \cos x, -\sin x, -\cos x, \sin x, \ldots$ と周期4で繰り返します。$x = 0$ での値は $0, 1, 0, -1, 0, 1, \ldots$ です。偶数次の項はゼロになるため
$$ \begin{equation} \sin x = \sum_{k=0}^{\infty} \frac{(-1)^k}{(2k+1)!}x^{2k+1} = x – \frac{x^3}{3!} + \frac{x^5}{5!} – \frac{x^7}{7!} + \cdots \end{equation} $$
同様に $\cos x$ は
$$ \begin{equation} \cos x = \sum_{k=0}^{\infty} \frac{(-1)^k}{(2k)!}x^{2k} = 1 – \frac{x^2}{2!} + \frac{x^4}{4!} – \frac{x^6}{6!} + \cdots \end{equation} $$
いずれも $|f^{(n+1)}(c)| \leq 1$ なので、指数関数と同様に全ての実数 $x$ で収束します。$\sin x$ は奇数次の項のみ、$\cos x$ は偶数次の項のみで構成されていることに注目してください。これは $\sin x$ が奇関数、$\cos x$ が偶関数であることに対応しています。
自然対数 $\ln(1+x)$
$f(x) = \ln(1+x)$ とします。$f(0) = 0$ であり、$f^{(k)}(x) = (-1)^{k-1}(k-1)!/(1+x)^k$ なので $f^{(k)}(0) = (-1)^{k-1}(k-1)!$ です。したがって
$$ \begin{equation} \ln(1+x) = \sum_{k=1}^{\infty} \frac{(-1)^{k-1}}{k}x^k = x – \frac{x^2}{2} + \frac{x^3}{3} – \frac{x^4}{4} + \cdots \end{equation} $$
この級数の収束半径は $R = 1$(比の判定法から $|(-1)^k/k| / |(-1)^{k-1}/(k-1)| = (k-1)/k \to 1$)です。$x = 1$ のとき、この級数は交代級数 $1 – 1/2 + 1/3 – 1/4 + \cdots = \ln 2$(交代級数の判定法により収束)となり、$x = -1$ のとき $-1 – 1/2 – 1/3 – \cdots$(調和級数)で発散します。
したがって、$\ln(1+x)$ のマクローリン展開は $-1 < x \leq 1$ の範囲で有効です。
二項級数 $(1+x)^\alpha$
一般の実数 $\alpha$ に対して
$$ \begin{equation} (1+x)^\alpha = \sum_{k=0}^{\infty} \binom{\alpha}{k} x^k = 1 + \alpha x + \frac{\alpha(\alpha-1)}{2!}x^2 + \frac{\alpha(\alpha-1)(\alpha-2)}{3!}x^3 + \cdots \end{equation} $$
ここで $\binom{\alpha}{k} = \frac{\alpha(\alpha-1)\cdots(\alpha-k+1)}{k!}$ は一般化二項係数です。$\alpha$ が非負整数のとき、級数は有限項で切れて通常の二項定理に一致します。$\alpha$ が非負整数でないとき、収束半径は $|x| < 1$ です。
物理学では $\alpha = -1$ の場合 $\frac{1}{1+x} = 1 – x + x^2 – x^3 + \cdots$(等比級数)や、$\alpha = 1/2$ の場合 $\sqrt{1+x} \approx 1 + \frac{x}{2} – \frac{x^2}{8} + \cdots$ がよく使われます。
展開式のまとめ
| 関数 | マクローリン展開 | 収束範囲 |
|---|---|---|
| $e^x$ | $\sum_{k=0}^{\infty} \frac{x^k}{k!}$ | $-\infty < x < \infty$ |
| $\sin x$ | $\sum_{k=0}^{\infty} \frac{(-1)^k x^{2k+1}}{(2k+1)!}$ | $-\infty < x < \infty$ |
| $\cos x$ | $\sum_{k=0}^{\infty} \frac{(-1)^k x^{2k}}{(2k)!}$ | $-\infty < x < \infty$ |
| $\ln(1+x)$ | $\sum_{k=1}^{\infty} \frac{(-1)^{k-1} x^k}{k}$ | $-1 < x \leq 1$ |
| $(1+x)^\alpha$ | $\sum_{k=0}^{\infty} \binom{\alpha}{k} x^k$ | $|x| < 1$($\alpha \notin \mathbb{N}$のとき) |
| $\frac{1}{1-x}$ | $\sum_{k=0}^{\infty} x^k$ | $|x| < 1$ |
代表的な関数の展開式を手に入れたところで、次にテイラー展開が収束する範囲(収束半径)について理論的に考えてみましょう。
収束半径とテイラー級数の収束
収束半径の定義
テイラー級数 $\sum_{k=0}^{\infty} a_k (x – a)^k$ に対して、収束半径 $R$ は
$$ \begin{equation} \frac{1}{R} = \limsup_{k \to \infty} |a_k|^{1/k} \end{equation} $$
で定義されます(コーシー・アダマールの公式)。$|x – a| < R$ のとき級数は絶対収束し、$|x - a| > R$ のとき発散します。$|x – a| = R$(収束円の境界)での振る舞いは個別に調べる必要があります。
実用的には、ダランベールの比の判定法を使うことが多いです。
$$ \frac{1}{R} = \lim_{k \to \infty} \left|\frac{a_{k+1}}{a_k}\right| $$
(この極限が存在する場合)
解析関数とテイラー展開の「限界」
「$n$ 次テイラー多項式が $n \to \infty$ で $f(x)$ に収束するか」は自明ではありません。テイラー級数が収束しても、もとの関数 $f(x)$ に一致するとは限らないのです。
有名な反例として、次の関数があります。
$$ f(x) = \begin{cases} e^{-1/x^2} & (x \neq 0) \\ 0 & (x = 0) \end{cases} $$
この関数は $x = 0$ で無限回微分可能であり、全ての $k$ について $f^{(k)}(0) = 0$ が成り立ちます。したがって、マクローリン級数は恒等的に $0$ ですが、$f(x) \neq 0$($x \neq 0$)なので、テイラー級数は $x = 0$ でしか $f(x)$ に一致しません。
テイラー級数が $f(x)$ に一致する関数を解析関数(analytic function)と呼びます。多項式、$e^x$、$\sin x$、$\cos x$、有理関数はすべて(定義域内で)解析関数です。
複素解析からの視点
$\ln(1+x)$ の収束半径が $R = 1$ であることは、複素数の立場から見ると自然です。$\ln(1+z)$ は $z = -1$ で特異点(対数の分岐点)を持ちます。$z = 0$ を中心とするテイラー展開の収束円は、最も近い特異点($z = -1$)に触れるところまでしか広がれません。$|z – 0| = |-1 – 0| = 1$ なので、収束半径は1になるのです。
同様に、$\frac{1}{1+x^2}$ は実数の範囲では至る所滑らかですが、$z = \pm i$ に極を持つため、マクローリン展開の収束半径は $|i| = 1$ となります。実関数としては全く問題がないのに、複素平面上の特異点の存在が収束半径を決めてしまうのです。この事実は、テイラー展開の収束を理解する上で非常に重要な視点です。
収束に関する理論を整理したところで、次にテイラー展開の応用例を見てみましょう。
テイラー展開の応用
近似計算
テイラー展開の最も基本的な応用は、複雑な関数を低次の多項式で近似することです。
例: $e^{0.1}$ の近似値を求めます。$e^x$ のマクローリン展開で $x = 0.1$ とすると
$$ e^{0.1} \approx 1 + 0.1 + \frac{0.01}{2} + \frac{0.001}{6} + \frac{0.0001}{24} = 1 + 0.1 + 0.005 + 0.000\overline{166} + 0.0000041\overline{6} $$
4次までの近似で $e^{0.1} \approx 1.10517$(真値は $1.10517…$)であり、非常に高い精度が得られます。
ラグランジュの剰余項で誤差を評価すると、5次の剰余項は $|R_5| \leq \frac{e^{0.1}}{5!}(0.1)^5 < \frac{3}{120} \times 10^{-5} = 2.5 \times 10^{-7}$ 以下です。
極限の計算
テイラー展開は、不定形の極限を計算する強力なツールです。
例: $\lim_{x \to 0} \frac{\sin x – x}{x^3}$ を求めます。
$\sin x = x – \frac{x^3}{6} + \frac{x^5}{120} – \cdots$ を代入すると
$$ \frac{\sin x – x}{x^3} = \frac{-\frac{x^3}{6} + \frac{x^5}{120} – \cdots}{x^3} = -\frac{1}{6} + \frac{x^2}{120} – \cdots $$
$x \to 0$ とすると $-1/6$ が得られます。ロピタルの定理を3回使うよりもはるかに簡潔です。
物理学での近似
物理学では、微小量に対するテイラー展開が頻繁に使われます。
単振り子の近似: 振り子の運動方程式は $\ddot{\theta} = -(g/l)\sin\theta$ ですが、$\theta$ が小さいとき $\sin\theta \approx \theta$(1次近似)を使うと $\ddot{\theta} \approx -(g/l)\theta$ となり、単振動の方程式が得られます。2次の補正まで含めると $\sin\theta \approx \theta – \theta^3/6$ です。
相対論的運動エネルギー: 特殊相対性理論での全エネルギーは $E = \gamma mc^2$($\gamma = 1/\sqrt{1 – v^2/c^2}$)です。$v/c \ll 1$ のとき、$\gamma = (1 – v^2/c^2)^{-1/2}$ を二項級数で展開すると
$$ \gamma \approx 1 + \frac{1}{2}\frac{v^2}{c^2} + \frac{3}{8}\frac{v^4}{c^4} + \cdots $$
運動エネルギー $K = E – mc^2 = (\gamma – 1)mc^2$ は $K \approx \frac{1}{2}mv^2$(ニュートン力学の運動エネルギー)に一致します。
こうした応用を実感するために、次にPythonでテイラー展開の振る舞いを可視化してみましょう。
Pythonでの実装と可視化
テイラー多項式の次数による近似精度
まず、$\sin x$ のテイラー多項式を様々な次数で描画し、近似の改善を確認します。
import numpy as np
import matplotlib.pyplot as plt
from math import factorial
# sin(x) のマクローリン展開(n次まで)
def taylor_sin(x, n_terms):
result = np.zeros_like(x)
for k in range(n_terms):
result += ((-1)**k / factorial(2*k + 1)) * x**(2*k + 1)
return result
# 描画
x = np.linspace(-4 * np.pi, 4 * np.pi, 1000)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# (a) 様々な次数のテイラー多項式
ax = axes[0]
ax.plot(x, np.sin(x), 'k-', linewidth=2.5, label='sin(x)', zorder=10)
colors = ['#e74c3c', '#e67e22', '#2ecc71', '#3498db', '#9b59b6']
terms_list = [1, 2, 3, 5, 8]
for n_terms, color in zip(terms_list, colors):
n_order = 2 * n_terms - 1 # 最高次の次数
y_taylor = taylor_sin(x, n_terms)
y_taylor = np.clip(y_taylor, -5, 5)
ax.plot(x, y_taylor, color=color, linewidth=1.5, alpha=0.8,
label=f'Order {n_order} ({n_terms} terms)')
ax.set_xlim(-4 * np.pi, 4 * np.pi)
ax.set_ylim(-5, 5)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_title('Taylor Polynomials of sin(x)', fontsize=13)
ax.legend(fontsize=9, loc='upper right')
ax.grid(True, alpha=0.3)
ax.axhline(0, color='gray', linewidth=0.5)
# (b) 剰余項(誤差)の大きさ
ax = axes[1]
x_pos = np.linspace(0.01, 3 * np.pi, 500)
for n_terms, color in zip(terms_list, colors):
n_order = 2 * n_terms - 1
error = np.abs(np.sin(x_pos) - taylor_sin(x_pos, n_terms))
error = np.maximum(error, 1e-16) # log対応
ax.semilogy(x_pos, error, color=color, linewidth=1.5,
label=f'Order {n_order}')
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('|Error|', fontsize=12)
ax.set_title('Approximation Error (log scale)', fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3, which='both')
plt.tight_layout()
plt.savefig('taylor_sin.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、テイラー展開の重要な性質が読み取れます。
-
左図(テイラー多項式): 展開の次数を上げるほど、$\sin x$ との一致範囲が広がっています。1次($x$のみ)は原点付近の短い範囲しか近似できませんが、15次(8項)では $\pm 4\pi$ 近くまで良い近似を与えています。これは、展開次数を増やすことで「懐中電灯の光が遠くまで届く」ようになるイメージに対応します。
-
右図(誤差の対数プロット): 原点から離れるほど誤差が増大し、次数が上がるほど誤差が急激に減少します。誤差の対数が直線的に増加していることは、$|R_{n+1}| \sim |x|^{n+1}/(n+1)!$ という理論的予測と一致しています。
収束半径の可視化
次に、収束半径を持つ関数 $\ln(1+x)$ のテイラー展開を可視化します。
import numpy as np
import matplotlib.pyplot as plt
from math import factorial
# ln(1+x) のマクローリン展開
def taylor_ln1px(x, n_terms):
result = np.zeros_like(x, dtype=float)
for k in range(1, n_terms + 1):
result += ((-1)**(k-1) / k) * x**k
return result
x = np.linspace(-0.99, 2.5, 1000)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# (a) 収束半径の可視化
ax = axes[0]
# 真の関数
mask = x > -1
ax.plot(x[mask], np.log(1 + x[mask]), 'k-', linewidth=2.5, label='ln(1+x)', zorder=10)
# 収束半径の領域
ax.axvspan(-1, 1, alpha=0.1, color='green', label='Convergence region |x| < 1')
ax.axvline(1, color='green', linestyle='--', alpha=0.5)
ax.axvline(-1, color='red', linestyle='--', alpha=0.5)
terms_list = [2, 5, 10, 20, 50]
colors = ['#e74c3c', '#e67e22', '#2ecc71', '#3498db', '#9b59b6']
for n_terms, color in zip(terms_list, colors):
y_taylor = taylor_ln1px(x, n_terms)
y_taylor = np.clip(y_taylor, -5, 5)
ax.plot(x, y_taylor, color=color, linewidth=1.2, alpha=0.8,
label=f'{n_terms} terms')
ax.set_xlim(-1.5, 2.5)
ax.set_ylim(-5, 3)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_title('Taylor Series of ln(1+x) — Convergence Radius', fontsize=13)
ax.legend(fontsize=8, loc='lower right')
ax.grid(True, alpha=0.3)
# (b) 部分和の振る舞い(x=0.9 と x=1.5)
ax = axes[1]
n_max = 80
n_array = np.arange(1, n_max + 1)
for x_val, color, ls in [(0.5, '#2ecc71', '-'), (0.9, '#3498db', '-'),
(1.0, '#e67e22', '--'), (1.5, '#e74c3c', '--')]:
partial_sums = np.array([taylor_ln1px(np.array([x_val]), k)[0]
for k in n_array])
true_val = np.log(1 + x_val) if x_val > -1 else np.nan
ax.plot(n_array, partial_sums, color=color, linewidth=1.5,
linestyle=ls, label=f'x = {x_val}')
if np.isfinite(true_val):
ax.axhline(true_val, color=color, linewidth=0.8, alpha=0.3)
ax.set_xlabel('Number of terms', fontsize=12)
ax.set_ylabel('Partial sum', fontsize=12)
ax.set_title('Partial Sums at Different x Values', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_ylim(-5, 5)
plt.tight_layout()
plt.savefig('taylor_convergence.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、収束半径の意味が視覚的に確認できます。
-
左図(テイラー多項式と収束領域): 緑色の帯で示した $|x| < 1$ の領域内では、項数を増やすほど $\ln(1+x)$ に収束していきます。一方、$x > 1$ の領域ではテイラー多項式が激しく振動し、発散していきます。$x = -1$ では対数関数が $-\infty$ に発散するため、ここが収束の「壁」になっています。
-
右図(部分和の挙動): $x = 0.5$(収束半径の内側)では部分和が速やかに真値 $\ln 1.5 \approx 0.405$ に収束しています。$x = 0.9$ でも収束しますが速度はやや遅くなります。$x = 1$(境界)では $\ln 2 \approx 0.693$ に収束しますが非常にゆっくりです。$x = 1.5$(収束半径の外側)では部分和が発散し、収束しません。
誤差評価の実験
最後に、剰余項の理論的な上界と実際の誤差を比較します。
import numpy as np
import matplotlib.pyplot as plt
from math import factorial
# e^x のテイラー展開で x = 1 での誤差を評価
x_val = 1.0
true_val = np.exp(x_val)
n_max = 20
n_array = np.arange(1, n_max + 1)
actual_error = np.zeros(n_max)
lagrange_bound = np.zeros(n_max)
for n in n_array:
# n次テイラー多項式の値
taylor_val = sum(x_val**k / factorial(k) for k in range(n + 1))
actual_error[n-1] = abs(true_val - taylor_val)
# ラグランジュの剰余項の上界: e^c / (n+1)! * |x|^{n+1}, c in [0,1] なので e^c <= e^1
lagrange_bound[n-1] = np.exp(x_val) / factorial(n + 1) * abs(x_val)**(n + 1)
fig, ax = plt.subplots(figsize=(10, 6))
ax.semilogy(n_array, actual_error, 'bo-', markersize=6, linewidth=1.5,
label='Actual error')
ax.semilogy(n_array, lagrange_bound, 'r^--', markersize=6, linewidth=1.5,
label='Lagrange bound')
ax.set_xlabel('Taylor polynomial order n', fontsize=12)
ax.set_ylabel('Error', fontsize=12)
ax.set_title(r'Error of Taylor polynomial for $e^x$ at $x=1$', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3, which='both')
ax.set_xlim(0.5, n_max + 0.5)
plt.tight_layout()
plt.savefig('taylor_error_bound.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、ラグランジュの剰余項による誤差評価の有用性が確認できます。実際の誤差(青い丸)は常にラグランジュの上界(赤い三角)以下にあり、理論的な保証が正しく機能しています。両者は同じオーダーで減少しており、ラグランジュの評価がそれほど緩くないことがわかります。$n = 10$ で誤差は $10^{-8}$ 以下、$n = 15$ で $10^{-13}$ 以下と、急速に減少しています。これが「$n!$ は $x^n$ よりはるかに速く増大する」ことの具体的な表れです。
テイラー展開の注意点と発展
多変数関数への拡張
テイラー展開は多変数関数にも拡張できます。2変数関数 $f(x, y)$ の $(a, b)$ まわりの2次テイラー展開は
$$ f(x,y) \approx f(a,b) + f_x(a,b)(x-a) + f_y(a,b)(y-b) + \frac{1}{2}\left[f_{xx}(a,b)(x-a)^2 + 2f_{xy}(a,b)(x-a)(y-b) + f_{yy}(a,b)(y-b)^2\right] $$
これをベクトル・行列で書くと、勾配ベクトル $\nabla f$ とヘッセ行列 $\bm{H}$ を用いて
$$ f(\bm{x}) \approx f(\bm{a}) + \nabla f(\bm{a})^\top (\bm{x} – \bm{a}) + \frac{1}{2}(\bm{x} – \bm{a})^\top \bm{H}(\bm{a})(\bm{x} – \bm{a}) $$
と表されます。この表現は、機械学習の最適化アルゴリズム(ニュートン法)で直接使われます。
漸近展開との違い
テイラー展開は $x \to a$ のときの近似ですが、$x \to \infty$ の場合の近似(漸近展開)とは性質が異なります。漸近展開は一般に収束しない(発散する)ことがありますが、有限項で打ち切った近似は十分高い精度を持つことがあります。スターリングの近似 $n! \approx \sqrt{2\pi n}(n/e)^n$ は漸近展開の代表例です。
まとめ
本記事では、テイラー展開の理論と応用について解説しました。
- テイラー展開は、関数をある点における微分の情報を使って多項式で表す方法である。$n$ 次テイラー多項式は $P_n(x) = \sum_{k=0}^{n} \frac{f^{(k)}(a)}{k!}(x-a)^k$
- 剰余項は近似誤差を定量的に評価する道具であり、ラグランジュの剰余項 $R_{n+1} = \frac{f^{(n+1)}(c)}{(n+1)!}(x-a)^{n+1}$ が最もよく使われる
- 収束半径はテイラー級数が収束する範囲を決定し、複素平面上の最も近い特異点までの距離に等しい
- 指数関数、三角関数は全実数で収束するが、$\ln(1+x)$ は $|x| \leq 1$ でしか収束しない
- テイラー展開は数値計算、物理の近似、極限の計算、機械学習の最適化など幅広い分野で使われる
次のステップとして、以下の記事も参考にしてください。
- 多変数関数の微分と偏微分の基礎 — 多変数テイラー展開の前提
- べき級数の収束半径と性質 — 収束に関するより詳しい理論
- ヘッセ行列と多変数の極値問題 — 2次のテイラー展開の応用