連続関数の定義と性質を徹底解説

「連続」という概念は、直感的には「グラフが途切れない関数」を意味します。しかし、数学ではこの直感を厳密に定義する必要があります。連続性の概念は微積分学の根幹であり、中間値の定理や最大値定理といった強力な定理の基盤となります。

連続関数の理論は、方程式の解の存在証明、最適化問題、数値解析など、理工学のあらゆる分野で活用されます。本記事では、連続性のε-δ定義から始めて、不連続点の分類、そして連続関数が持つ重要な性質を丁寧に解説します。

本記事の内容

  • 連続性の直感的な意味とε-δ定義
  • 不連続点の分類(除去可能・跳躍・本質的)
  • 連続関数の基本性質(和・積・合成の連続性)
  • 中間値の定理と最大値定理
  • Pythonでの可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

連続関数とは

大雑把に言うと、連続関数とは 「グラフをペンを紙から離さずに描ける関数」 です。もう少し正確に言えば、入力を少しだけ変えたとき、出力も少しだけしか変わらない関数のことです。

たとえば $f(x) = x^2$ は連続です。$x = 2$ の近くで $x$ を少しだけ動かしても、$f(x)$ は $4$ の近くにとどまります。一方、次のような関数は $x = 0$ で不連続です:

$$ g(x) = \begin{cases} 0 & (x < 0) \\ 1 & (x \geq 0) \end{cases} $$

$x$ が $0$ より少しだけ負の側にあるとき $g(x) = 0$ ですが、$x = 0$ では $g(x) = 1$ と「跳ぶ」からです。

連続性のε-δ定義

1点での連続性

関数 $f$ が点 $x = a$ で 連続 であるとは、次が成り立つことです。

$$ \begin{equation} \forall \varepsilon > 0, \quad \exists \delta > 0 \quad \text{s.t.} \quad |x – a| < \delta \implies |f(x) - f(a)| < \varepsilon \end{equation} $$

極限の定義(ε-δ論法)と比較すると、2つの違いがあります:

  1. $0 < |x - a|$ ではなく $|x - a|$:$x = a$ の場合も含む(当然 $|f(a) – f(a)| = 0 < \varepsilon$ なので問題ない)
  2. $L$ の代わりに $f(a)$:極限値が関数値と一致する

つまり、連続性は次の3条件と同値です:

  1. $f(a)$ が定義されている
  2. $\lim_{x \to a} f(x)$ が存在する
  3. $\lim_{x \to a} f(x) = f(a)$

区間での連続性

$f$ が区間 $I$ 上で 連続 であるとは、$I$ 上のすべての点で連続であることです。閉区間 $[a, b]$ の端点では、片側連続性を考えます:

  • $x = a$ では右連続: $\lim_{x \to a^+} f(x) = f(a)$
  • $x = b$ では左連続: $\lim_{x \to b^-} f(x) = f(b)$

連続性の証明例

例1: $f(x) = 3x – 2$ は $x = 1$ で連続

証明: 任意の $\varepsilon > 0$ に対して $\delta = \varepsilon/3$ とおく。$|x – 1| < \delta$ のとき:

$$ \begin{align} |f(x) – f(1)| &= |(3x – 2) – 1| \\ &= |3x – 3| = 3|x – 1| \\ &< 3\delta = 3 \cdot \frac{\varepsilon}{3} = \varepsilon \end{align} $$

$\square$

例2: $f(x) = x^2$ は任意の $a \in \mathbb{R}$ で連続

証明: 任意の $\varepsilon > 0$ に対して $\delta = \min\left(1, \frac{\varepsilon}{2|a| + 1}\right)$ とおく。

$|x – a| < \delta \leq 1$ より $|x| < |a| + 1$ なので:

$$ \begin{align} |x^2 – a^2| &= |x – a| \cdot |x + a| \\ &\leq |x – a| \cdot (|x| + |a|) \\ &< \delta \cdot (|a| + 1 + |a|) \\ &= \delta(2|a| + 1) \\ &\leq \frac{\varepsilon}{2|a| + 1} \cdot (2|a| + 1) = \varepsilon \end{align} $$

$\square$

不連続点の分類

関数が点 $a$ で連続でないとき、不連続の種類を分類できます。

除去可能不連続(Removable discontinuity)

$\lim_{x \to a} f(x)$ は存在するが、$f(a)$ が未定義、または $f(a) \neq \lim_{x \to a} f(x)$ の場合。

: $f(x) = \frac{x^2 – 1}{x – 1}$($x \neq 1$)。極限は $\lim_{x \to 1} \frac{(x-1)(x+1)}{x-1} = 2$ だが、$f(1)$ は未定義。$f(1) = 2$ と定義し直せば連続にできるので「除去可能」と呼ばれます。

跳躍不連続(Jump discontinuity)

左側極限と右側極限はともに存在するが、一致しない場合。

: $g(x) = \begin{cases} 0 & (x < 0) \\ 1 & (x \geq 0) \end{cases}$ は $x = 0$ で跳躍不連続。$\lim_{x \to 0^-} g(x) = 0$、$\lim_{x \to 0^+} g(x) = 1$。

本質的不連続(Essential discontinuity)

左側極限または右側極限の少なくとも一方が存在しない場合。

: $h(x) = \sin(1/x)$ は $x = 0$ で本質的不連続。$x \to 0$ で $\sin(1/x)$ は $-1$ と $1$ の間を無限に振動し、極限が存在しません。

連続関数の基本性質

四則演算の保存

$f, g$ が点 $a$ で連続ならば、以下も $a$ で連続です:

  1. : $f + g$
  2. : $f – g$
  3. スカラー倍: $cf$($c$ は定数)
  4. : $fg$
  5. : $f/g$($g(a) \neq 0$ のとき)

合成関数の連続性

$g$ が $a$ で連続、$f$ が $g(a)$ で連続ならば、合成関数 $f \circ g$ も $a$ で連続です。

証明のスケッチ: 任意の $\varepsilon > 0$ に対して、$f$ の連続性から $|y – g(a)| < \delta_1 \implies |f(y) - f(g(a))| < \varepsilon$ なる $\delta_1$ が存在する。$g$ の連続性から $|x - a| < \delta \implies |g(x) - g(a)| < \delta_1$ なる $\delta$ が存在する。よって $|x - a| < \delta \implies |f(g(x)) - f(g(a))| < \varepsilon$。$\square$

中間値の定理

定理の主張

$f$ が閉区間 $[a, b]$ 上で連続で、$f(a) \neq f(b)$ ならば、$f(a)$ と $f(b)$ の間の任意の値 $c$ に対して、$f(\xi) = c$ となる $\xi \in (a, b)$ が存在する。

$$ \begin{equation} f(a) < c < f(b) \implies \exists \xi \in (a, b) \text{ s.t. } f(\xi) = c \end{equation} $$

直感的な意味

連続関数のグラフは「途切れない」ので、$f(a)$ から $f(b)$ への移動中に、その間のすべての値を必ず通過します。

応用: 方程式の解の存在

$f(x) = x^3 – x – 1$ とすると、$f(1) = -1 < 0$、$f(2) = 5 > 0$ です。$f$ は連続なので、中間値の定理より $f(\xi) = 0$ となる $\xi \in (1, 2)$ が存在します。これにより、解の存在 を直接的に証明できます。

証明(二分法を使った構成的証明)

$f(a) < 0 < f(b)$ の場合を考えます($f(a) > 0 > f(b)$ の場合は $-f$ で議論)。

区間 $[a_0, b_0] = [a, b]$ から出発し、中点 $m = (a_n + b_n)/2$ を計算します。

  • $f(m) = 0$ なら $\xi = m$ で完了
  • $f(m) < 0$ なら $[a_{n+1}, b_{n+1}] = [m, b_n]$
  • $f(m) > 0$ なら $[a_{n+1}, b_{n+1}] = [a_n, m]$

この操作を繰り返すと、$a_n$ は単調増加、$b_n$ は単調減少で、$b_n – a_n = (b-a)/2^n \to 0$ です。完備性より $a_n, b_n$ は同一の極限 $\xi$ に収束し、$f$ の連続性と $f(a_n) \leq 0 \leq f(b_n)$ から $f(\xi) = 0$ が得られます。$\square$

最大値定理(ワイエルシュトラスの定理)

定理の主張

$f$ が閉区間 $[a, b]$ 上で連続ならば、$f$ は $[a, b]$ 上で最大値と最小値を持つ。すなわち:

$$ \exists x_M, x_m \in [a, b] \text{ s.t. } f(x_m) \leq f(x) \leq f(x_M) \quad \forall x \in [a, b] $$

重要性

この定理が成り立つには、閉区間連続性 の両方が必要です。

  • 開区間 $(0, 1)$ 上の $f(x) = x$ は最大値を持たない($1$ に近づくが到達しない)
  • 閉区間 $[0, 1]$ 上の不連続関数 $f(x) = \begin{cases} x & (x < 1) \\ 0 & (x = 1) \end{cases}$ も最大値を持たない

Pythonでの実装

不連続点の分類の可視化

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# 1. 除去可能不連続: f(x) = (x^2 - 1) / (x - 1)
x = np.linspace(-1, 3, 1000)
x_plot = x[np.abs(x - 1) > 0.01]
y_plot = (x_plot**2 - 1) / (x_plot - 1)

axes[0].plot(x_plot, y_plot, 'b-', linewidth=2)
axes[0].plot(1, 2, 'wo', markersize=10, markeredgecolor='blue', markeredgewidth=2)
axes[0].set_title('除去可能不連続', fontsize=14)
axes[0].set_xlabel('x', fontsize=12)
axes[0].set_ylabel('f(x)', fontsize=12)
axes[0].grid(True, alpha=0.3)
axes[0].annotate(r'$f(x) = \frac{x^2-1}{x-1}$', xy=(0.5, 3), fontsize=12)

# 2. 跳躍不連続: ヘヴィサイドの階段関数
x = np.linspace(-2, 2, 1000)
y_neg = np.zeros_like(x[x < 0])
y_pos = np.ones_like(x[x >= 0])

axes[1].plot(x[x < 0], y_neg, 'b-', linewidth=2)
axes[1].plot(x[x >= 0], y_pos, 'b-', linewidth=2)
axes[1].plot(0, 0, 'wo', markersize=10, markeredgecolor='blue', markeredgewidth=2)
axes[1].plot(0, 1, 'bo', markersize=10)
axes[1].vlines(0, 0, 1, colors='blue', linestyles='dashed', alpha=0.5)
axes[1].set_title('跳躍不連続', fontsize=14)
axes[1].set_xlabel('x', fontsize=12)
axes[1].set_ylabel('g(x)', fontsize=12)
axes[1].grid(True, alpha=0.3)
axes[1].set_ylim(-0.5, 1.5)

# 3. 本質的不連続: sin(1/x)
x_pos = np.linspace(0.005, 2, 5000)
x_neg = np.linspace(-2, -0.005, 5000)
x_all = np.concatenate([x_neg, x_pos])
y_all = np.sin(1 / x_all)

axes[2].plot(x_all, y_all, 'b-', linewidth=0.5, alpha=0.7)
axes[2].set_title('本質的不連続', fontsize=14)
axes[2].set_xlabel('x', fontsize=12)
axes[2].set_ylabel(r'$\sin(1/x)$', fontsize=12)
axes[2].grid(True, alpha=0.3)
axes[2].set_xlim(-1, 1)

plt.tight_layout()
plt.show()

中間値の定理と二分法の可視化

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x**3 - x - 1

# 二分法の実装
def bisection(f, a, b, tol=1e-10, max_iter=100):
    """二分法で f(x)=0 の根を求める"""
    history = [(a, b)]
    for _ in range(max_iter):
        m = (a + b) / 2
        if abs(f(m)) < tol or (b - a) / 2 < tol:
            return m, history
        if f(a) * f(m) < 0:
            b = m
        else:
            a = m
        history.append((a, b))
    return (a + b) / 2, history

root, history = bisection(f, 1, 2)

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

# 左: 中間値の定理の図解
x = np.linspace(0.5, 2.5, 500)
axes[0].plot(x, f(x), 'b-', linewidth=2, label=r'$f(x) = x^3 - x - 1$')
axes[0].axhline(y=0, color='k', linewidth=0.5)
axes[0].plot(1, f(1), 'ro', markersize=10, label=f'f(1) = {f(1):.1f}')
axes[0].plot(2, f(2), 'go', markersize=10, label=f'f(2) = {f(2):.1f}')
axes[0].plot(root, 0, 'k*', markersize=15, label=f'root ≈ {root:.6f}')
axes[0].fill_between(x[(x >= 1) & (x <= 2)], f(x[(x >= 1) & (x <= 2)]),
                      alpha=0.1, color='blue')
axes[0].set_xlabel('x', fontsize=12)
axes[0].set_ylabel('f(x)', fontsize=12)
axes[0].set_title('中間値の定理', fontsize=14)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)

# 右: 二分法の収束過程
for i, (a, b) in enumerate(history[:10]):
    axes[1].plot([a, b], [i, i], 'b-o', markersize=4, linewidth=2)
    axes[1].plot((a + b) / 2, i, 'r|', markersize=10, markeredgewidth=2)

axes[1].axvline(x=root, color='k', linestyle='--', alpha=0.5, label=f'root ≈ {root:.6f}')
axes[1].set_xlabel('x', fontsize=12)
axes[1].set_ylabel('反復回数', fontsize=12)
axes[1].set_title('二分法の収束過程', fontsize=14)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
axes[1].invert_yaxis()

plt.tight_layout()
plt.show()

print(f"二分法の結果: x = {root:.10f}")
print(f"f(x) = {f(root):.2e}")
print(f"反復回数: {len(history)}")

まとめ

本記事では、連続関数の定義と重要な性質について解説しました。

  • 連続性のε-δ定義: $|x – a| < \delta \implies |f(x) - f(a)| < \varepsilon$ が任意の $\varepsilon$ で成立
  • 連続性は「極限値 = 関数値」と同値
  • 不連続点は3種類: 除去可能、跳躍、本質的不連続
  • 連続関数の四則演算と合成は連続性を保存する
  • 中間値の定理: 連続関数は中間の値をすべてとる → 方程式の解の存在証明に使える
  • 最大値定理: 閉区間上の連続関数は最大値・最小値をもつ

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