5.1 極限#
本節目標#
- 建立「極限是趨近、不是抵達」的直覺
- 學會用
limit()計算極限,包括單側極限 - 親手做經典實驗: \(\dfrac{\sin x}{x} \to 1\) ,體驗
subs為什麼會失敗 - 觀察極限不存在的兩種典型樣貌
極限的直覺:趨近,但不抵達#
考慮函數 \(f(x) = \dfrac{x^2 - 1}{x - 1}\) 。在 \(x = 1\) 這一點,分母為零,函數沒有定義。但我們可以問一個更細膩的問題:
當 \(x\) 非常非常接近 \(1\) (但不到達 \(1\) )時, \(f(x)\) 的值會非常接近什麼?
先化簡:當 \(x \ne 1\) 時, \(f(x) = \dfrac{(x-1)(x+1)}{x-1} = x + 1\) 。所以答案顯然是 \(2\) 。
注意重點:我們從來沒有把 \(x = 1\) 代進去,而是問「無限趨近時的落點」。這就是極限的核心思想——
極限描述的是 \(a\) 附近的行為,與 \(f(a)\) 本身是否存在、等於多少,完全無關。
SymPy 的 limit()#
from sympy import symbols, limit, sin, cos, exp, oo
x = symbols('x')
# 化簡前的原式:在 x=1 沒有定義,但極限存在
limit((x**2 - 1) / (x - 1), x, 1) # 結果:2
limit(expr, x, a) 回傳 \(\lim_{x \to a} \text{expr}\) ,而且 SymPy 會做精確的符號運算,不是數值逼近。
用 subs 會失敗的地方,limit 能給答案#
「直接代入」和「取極限」是兩件事。subs 是代入,遇到 \(\frac{0}{0}\) 時就束手無策:
expr = sin(x) / x
expr.subs(x, 0) # 結果:nan(0/0,未定義!)
limit(expr, x, 0) # 結果:1(極限存在!)
這正是下一節實驗的主角。
動手實驗:經典極限 \(\dfrac{\sin x}{x} \to 1\)#
這是微積分史上最重要的極限之一(微分公式 \((\sin x)' = \cos x\) 全靠它)。我們用三個步驟完整體驗。
第一步:直接代入,失敗。
from sympy import symbols, sin, limit
import numpy as np
import matplotlib.pyplot as plt
x = symbols('x')
f = sin(x) / x
print(f.subs(x, 0)) # nan —— 0/0,代入失敗
第二步:數值表格,觀察趨勢。
for v in [0.5, 0.1, 0.01, 0.001, -0.001]:
print(f"x = {v:>7}, sin(x)/x = {float(f.subs(x, v)):.10f}")
輸出會顯示 \(x\) 越接近 \(0\) , \(\frac{\sin x}{x}\) 越接近 \(1\) (從兩側都是)。
第三步:符號極限 + 畫圖確認。
print(limit(f, x, 0)) # 1
xs = np.linspace(-10, 10, 400)
ys = np.sin(xs) / xs
plt.plot(xs, ys)
plt.scatter([0], [1], color='red', zorder=3, label='lim = 1')
plt.axhline(1, ls='--', color='gray')
plt.title('$\\sin(x)/x$, x=0 處其實沒有定義')
plt.legend()
plt.show()
畫出來會發現:曲線在 \(x=0\) 處被挖掉一個點,但兩側曲線平滑地「會合」在高度 \(1\) 。極限就是這個會合點。
單側極限與極限存在的條件#
\(x\) 趨近 \(a\) 有兩個方向:從左邊(小於 \(a\) )或從右邊(大於 \(a\) )。limit() 用 dir 參數控制方向:
# dir='+' 表示從右側趨近(預設)
# dir='-' 表示從左側趨近
limit(1/x, x, 0, dir='+') # oo (從右邊趨近 0,跑到 +∞)
limit(1/x, x, 0, dir='-') # -oo (從左邊趨近 0,跑到 -∞)
極限存在的條件:左極限與右極限都存在且相等。
經典例子——階躍函數:
from sympy import Abs, sign
# |x|/x 在 x<0 是 -1,在 x>0 是 1
limit(Abs(x)/x, x, 0, dir='-') # -1
limit(Abs(x)/x, x, 0, dir='+') # 1
# 左右極限不等 → 極限不存在
畫圖看很清楚:這是一個「斷崖」,左右兩半各自水平,中間對不起來。
更多例子: \(\lim_{x\to0}\dfrac{e^x-1-x}{x^2}\)#
這一題代入是 \(\frac{0}{0}\) ,而且不容易肉眼看出答案:
expr2 = (exp(x) - 1 - x) / x**2
expr2.subs(x, 0) # nan
limit(expr2, x, 0) # 1/2
答案 \(\frac{1}{2}\) 其實正是泰勒展開(見 5.4 節) \(e^x = 1 + x + \frac{x^2}{2} + \cdots\) 的係數線索:分子主項是 \(\frac{x^2}{2}\) ,除以 \(x^2\) 就是 \(\frac{1}{2}\) 。
再試幾個:
limit((cos(x) - 1) / x, x, 0) # 0
limit((1 + 1/x)**x, x, oo) # E ← e 的定義!
limit((x**3 - 8) / (x - 2), x, 2) # 12(因式分解型)
極限不存在的觀察#
極限不存在至少有兩種典型樣貌,值得親眼看看。
樣貌一:發散到無窮大—— \(f(x) = \dfrac{1}{x^2}\) , \(x \to 0\) :
limit(1/x**2, x, 0, dir='+') # oo
limit(1/x**2, x, 0, dir='-') # oo(兩側都爆)
雖然兩側一致,但「極限是 \(\infty\) 」的正式說法是極限不存在(發散)—— \(f(x)\) 沒有接近任何一個有限的數 \(L\) 。
樣貌二:無限震盪—— \(f(x) = \sin(1/x)\) , \(x \to 0\) :
limit(sin(1/x), x, 0) # 不收斂,SymPy 回傳 sin(1/x) 或拋出提示
畫圖最有感覺:
xs = np.linspace(0.001, 0.2, 2000)
plt.plot(xs, np.sin(1/xs))
plt.title('$\\sin(1/x)$ 靠近 0 時無限震盪')
plt.show()
越靠近 \(0\) ,曲線震盪得越快、越密,永遠停不下來——它不趨近任何值。畫圖時甚至會因為取樣不足而出現「假圖樣」(aliasing),這本身就說明了震盪有多瘋狂。
小結與練習#
- 極限描述「無限趨近時的落點」,與函數在該點是否有定義無關。
subs是代入、limit是取極限;遇到 \(\frac{0}{0}\) 時只有後者有用。dir='-'/dir='+'控制單側極限;左右極限相等極限才存在。- 極限不存在的兩種樣貌:發散到無窮( \(1/x^2\) )、無限震盪( \(\sin(1/x)\) )。
練習
- 用數值表格與
limit各自驗證 \(\lim_{x \to 0} \dfrac{\tan x}{x} = 1\) 。 - 計算 \(\lim_{x \to \infty} \left( \sqrt{x^2 + x} - x \right)\) (提示:答案不是 \(0\) )。
- 定義 \(f(x) = \dfrac{x^3 - 1}{x - 1}\) ,用
limit求 \(x \to 1\) 的極限,並畫圖觀察可去斷點。 - 嘗試 \(\lim_{x \to 0} \cos(1/x)\) ,判斷極限是否存在,並畫圖佐證。