数列の極限:離散データの収束性を分析
数列とは、自然数 \( n = 1, 2, 3, \ldots \) を用いて定義される順序付きデータ列であり、一般項 \( a_n = f(n) \) によって第 \( n \) 項が表現される。たとえば、次の数列を考える:
- \( a_n = \frac{n}{n+1} \)
- \( b_n = \left(-1\right)^{n+1} \)
- \( c_n = \frac{1}{2^n} \)
これらの数列はそれぞれ異なる振る舞いを示す。特に、\( \frac{n}{n+1} \) は \( n \) が大きくなるにつれて1に近づく傾向がある。これを視覚的に確認するために、Matplotlib を用いてプロットを行う。
import numpy as np
import matplotlib.pyplot as plt
def generate_sequence(func, n_max):
n_vals = np.arange(1, n_max + 1)
return n_vals, func(n_vals)
# 数列 an = n / (n + 1)
n, a_n = generate_sequence(lambda n: n / (n + 1), 100)
plt.figure(figsize=(10, 6))
plt.plot(n, a_n, label=r'$a_n = \frac{n}{n+1}$', color='blue', marker='o', markersize=3)
plt.axhline(y=1, color='red', linestyle='--', label='Limit: 1')
plt.xlabel('n')
plt.ylabel(r'$a_n$')
plt.title('Sequence Convergence to 1')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
図から明らかなように、\( n \) が増加するにつれて \( a_n \) は急速に1に近づき、極限が存在することが予想される。この極限値は、記号計算ライブラリ SymPy を使って厳密に求めることができる。
from sympy import symbols, limit, oo
n_sym = symbols('n')
expr = n_sym / (n_sym + 1)
limit_value = limit(expr, n_sym, oo)
print(limit_value) # 出力: 1
一方、振動する数列 \( (-1)^{n+1} \) については、以下のコードで可視化できる。
n, b_n = generate_sequence(lambda n: (-1)**(n+1), 30)
plt.stem(n, b_n, use_line_collection=True)
plt.axhline(y=0, color='k', linewidth=0.5)
plt.ylim(-1.5, 1.5)
plt.title(r'Oscillating Sequence $b_n = (-1)^{n+1}$')
plt.ylabel(r'$b_n$')
plt.xlabel('n')
plt.show()
この数列は特定の値に収束せず、常に -1 と 1 の間で振動するため、極限は存在しない(発散)。
関数の極限:連続変数における近似挙動
関数の極限は、変数 \( x \) が特定の点 \( x_0 \) に近づくとき、または \( |x| \to \infty \) のときに、関数値 \( f(x) \) がどのように振る舞うかを調べるものである。まず、\( x \to x_0 \) のケースを考える。
例として、\( f(x) = \frac{1}{x} \) において \( x \to 0.4 \) のときの極限を考察する。この場合、関数は \( x = 0.4 \) で定義されており、連続であるため極限値は \( f(0.4) = 2.5 \) となる。
def plot_function_limit(f, x0, epsilon=0.8):
x = np.linspace(0.1, 1.0, 500)
y = f(x)
A = f(x0)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label=r'$f(x) = 1/x$', color='blue')
# 極限線 A
plt.axhline(y=A, color='red', linestyle='-', label=f'Limit A = {A}')
# ε範囲
plt.axhline(y=A + epsilon, color='orange', linestyle='--', label=f'A + ε')
plt.axhline(y=A - epsilon, color='orange', linestyle='--', label=f'A - ε')
# δ領域の計算(交点に基づく)
idx_upper = np.where(np.abs(y - (A + epsilon)) < 0.05)[0]
idx_lower = np.where(np.abs(y - (A - epsilon)) < 0.05)[0]
if len(idx_upper) > 0 and len(idx_lower) > 0:
x_left = x[min(idx_upper[0], idx_lower[0])]
x_right = x[max(idx_upper[-1], idx_lower[-1])]
# 去心近傍(x0 を除く)
delta_region = (x >= x_left) & (x <= x_right) & (np.abs(x - x0) > 0.01)
plt.fill_between(x[delta_region], A - epsilon, A + epsilon, color='lightgreen', alpha=0.5, label=r'Deleted $\delta$-neighborhood')
plt.scatter([x0], [A], color='red', zorder=5)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title(r'Limit of $f(x)$ as $x \to x_0$')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
plot_function_limit(lambda x: 1/x, 0.4, 0.8)
図中、緑色の領域は \( |f(x) - A| < \varepsilon \) を満たす \( x \) の範囲を表しており、これは数学的な極限の定義「任意の \( \varepsilon > 0 \) に対してある \( \delta > 0 \) が存在し、\( 0 < |x - x_0| < \delta \) ならば \( |f(x) - A| < \varepsilon \)」に対応している。
左右からの極限も重要である。左極限 \( \lim_{x \to x_0^-} f(x) \) と右極限 \( \lim_{x \to x_0^+} f(x) \) が一致するときのみ、\( x \to x_0 \) の極限が存在する。
無限大への極限
変数が無限遠に近づく場合、例えば \( x \to \infty \) や \( x \to -\infty \) の極限も同様に考えられる。たとえば \( f(x) = \frac{x}{x+1} \) は \( x \to \infty \) で1に収束する。
expr_infinite = symbols('x') / (symbols('x') + 1)
inf_limit = limit(expr_infinite, symbols('x'), oo)
print(inf_limit) # 出力: 1
このような解析は、数列の極限と密接に関連しており、関数の漸近的挙動を理解する上で不可欠である。