07.1 數列與級數#
本節目標#
- 認識數列(sequence)與級數(series)的數學概念,理解 \(\sum\) 符號的意義。
- 學會用 SymPy 的
summation()計算有限和與無窮級數。 - 驗證經典公式: \(\sum_{k=1}^n k = \frac{n(n+1)}{2}\) 與 \(\sum_{k=1}^n k^2 = \frac{n(n+1)(2n+1)}{6}\) 。
- 判斷無窮級數的收斂與發散,動手實驗用級數逼近 \(\pi\) 。
一、數列與級數的概念#
數列就是一串按規則排列的數: \(a_1, a_2, a_3, \ldots\) 。例如
把數列的項加起來就得到級數。記號
代表前 \(n\) 項之和;當 \(n \to \infty\) 時就是無窮級數。無窮級數可能收斂(有有限和)也可能發散(和無限大或不存在)。
在 SymPy 中,我們用符號變數 \(k\) 、 \(n\) 來表示,先宣告它們是正整數:
from sympy import symbols, summation, oo, simplify, Rational, pi, sqrt, limit
k, n = symbols('k n', integer=True, positive=True)
二、summation():有限和的計算#
summation(表示式, (索引變數, 下限, 上限)) 直接對應 \(\sum\) 記號:
# sum_{k=1}^{n} k
S1 = summation(k, (k, 1, n))
print(S1) # n**2/2 + n/2,也就是 n(n+1)/2
# sum_{k=1}^{n} k^2
S2 = summation(k**2, (k, 1, n))
print(simplify(S2)) # n*(n+1)*(2*n+1)/6
驗證這兩個經典公式——把 SymPy 的答案與公式相比較:
formula1 = n*(n + 1)/2
formula2 = n*(n + 1)*(2*n + 1)/6
print(simplify(S1 - formula1)) # 0,公式一成立
print(simplify(S2 - formula2)) # 0,公式二成立
也可以對一般式求和,例如 \(\sum_{k=1}^{n} k^3\) :
S3 = simplify(summation(k**3, (k, 1, n)))
print(S3) # n**2*(n + 1)**2/4
# 有趣的事實:1^3+2^3+...+n^3 = (1+2+...+n)^2
print(simplify(S3 - S1**2)) # 0
三、無窮級數:summation 帶 oo#
oo 是 SymPy 的無窮大符號。把上限設為 oo 就能算無窮級數:
# 幾何級數 sum_{k=0}^{oo} x^k = 1/(1-x),當 |x| < 1
x = symbols('x')
print(summation(x**k, (k, 0, oo))) # 1/(1 - x)(會附帶收斂條件說明)
# 代入 x = 1/2:1 + 1/2 + 1/4 + ... = 2
print(summation(Rational(1, 2)**k, (k, 0, oo))) # 2
# 巴塞爾問題:sum 1/k^2 = pi^2/6
print(summation(1/k**2, (k, 1, oo))) # pi**2/6
幾何級數的一般驗證:首項 \(a\) 、公比 \(r\) ( \(|r|<1\) )時,和為 \(\frac{a}{1-r}\) :
a, r = symbols('a r', positive=True)
geo = summation(a*r**k, (k, 0, oo))
print(simplify(geo - a/(1 - r))) # 0(在 |r|<1 時成立)
四、調和級數發散的驗證#
調和級數 \(\sum_{k=1}^{\infty} \frac{1}{k}\) 的項越來越小,但總和卻發散。SymPy 直接算會報告它發散:
h = summation(1/k, (k, 1, oo))
print(h) # oo
更直觀的實驗:計算部分和 \(H_n = \sum_{k=1}^{n} 1/k\) 隨 \(n\) 增大的趨勢。理論上 \(H_n \approx \ln n + \gamma\) ( \(\gamma\) 是 Euler–Mascheroni 常數):
from sympy import log, N
H = summation(1/k, (k, 1, n))
for Nn in [10, 100, 1000, 10**6]:
val = H.subs(n, Nn).evalf()
print(f"n = {Nn:>8}, H_n ≈ {val:.6f}, ln(n) ≈ {log(Nn).evalf():.6f}")
# 可以看到 H_n 與 ln(n) 同步緩慢成長 -> 發散
也可以看「項的極限」:若一般項不趨近 0,級數必發散:
from sympy import limit_seq
print(limit_seq(1/k, k)) # 0(極限是 0,但級數仍發散,是必要條件非充分條件)
print(limit_seq(k/(k + 1), k)) # 1,不為 0 -> 級數必發散
五、比值判別法實驗#
比值判別法(ratio test):對正項級數 \(\sum a_k\) ,計算
- \(L < 1\) :絕對收斂
- \(L > 1\) :發散
- \(L = 1\) :無法判定
用 SymPy 做幾個實驗:
from sympy import Limit, Abs
def ratio_test(a_k):
L = Limit(Abs((k + 1).subs(k, k) and a_k.subs(k, k + 1) / a_k), k, oo).doit()
return simplify(L)
# 指數型級數 sum 1/2^k:比值 = 1/2 -> 收斂
print(ratio_test(Rational(1, 2)**k)) # 1/2
# 階乘型級數 sum k!/k^k(直覺上收斂):比值 = (1+1/k)^k -> 1/e < 1
from sympy import factorial, E
print(ratio_test(factorial(k)/k**k)) # E**(-1)
# 調和級數的比值恆為 1 -> 無法由比值判別
print(ratio_test(1/k)) # 1
注意: \(L=1\) 時判別法失效,調和級數(發散)與 \(\sum 1/k^2\) (收斂)比值都是 1,需要別的方法(如積分判別或 p 級數結論)。
六、動手實驗:算 π 的各種級數#
實驗 1:巴塞爾級數 \(\pi = \sqrt{6 \sum_{k=1}^{\infty} 1/k^2}\) :
def pi_basel(terms):
s = summation(1/k**2, (k, 1, terms))
return sqrt(6 * s).evalf()
print(pi_basel(100)) # 3.1320...
print(pi_basel(1000)) # 3.1406...(收斂很慢)
實驗 2:Leibniz 級數 \(\frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \cdots\) :
def pi_leibniz(terms):
s = summation((-1)**k / (2*k + 1), (k, 0, terms))
return (4 * s).evalf()
print(pi_leibniz(100)) # 3.1315...
print(pi_leibniz(10000)) # 收斂更慢
實驗 3:Ramanujan 型的快速級數(對照上面兩個的龜速):
def pi_ramanujan(terms):
s = summation(factorial(4*k) * (1103 + 26390*k)
/ (factorial(k)**4 * 396**(4*k)), (k, 0, terms))
return (9801 / (2 * sqrt(2) * s)).evalf(50)
print(pi_ramanujan(1)) # 精準到小數點後 7 位以上
print(pi_ramanujan(2)) # 已達數十位精度
實驗 4:比較各方法逼近速度:
from sympy import Abs
for m in [5, 10, 20]:
e1 = Abs(pi_basel(m) - pi.evalf())
e2 = Abs(pi_leibniz(m) - pi.evalf())
print(f"項數 {m:>3}: Basel 誤差 {float(e1):.2e}, Leibniz 誤差 {float(e2):.2e}")
觀察重點: 1. 同樣項數下,各級數誤差差距可以非常大。 2. summation 對有限項求和時,有些級數能給出封閉形式,有些只能算數值。 3. 數學上「收斂」與「收斂得快」是兩回事——這正是數值分析的起點。
小結與練習#
本節我們學會了: - 用 summation() 表達 \(\sum\) ,計算有限和與無窮級數。 - 驗證了 \(\sum_{k=1}^n k = \frac{n(n+1)}{2}\) 、 \(\sum_{k=1}^n k^2 = \frac{n(n+1)(2n+1)}{6}\) 。 - 幾何級數收斂於 \(\frac{a}{1-r}\) ( \(|r|<1\) ),調和級數雖然項趨近 0 仍發散。 - 比值判別法 \(L<1\) 收斂、 \(L>1\) 發散、 \(L=1\) 無法判定。
練習: 1. 用 summation 求 \(\sum_{k=1}^{n} (2k-1)\) ,並說明它等於 \(n^2\) (奇數和公式)。 2. 求 \(\sum_{k=1}^{\infty} \frac{1}{k(k+1)}\) 的值,並用部分分式解釋為什麼結果是 1。 3. 對 \(\sum_{k=1}^{\infty} \frac{k^2}{2^k}\) 先用比值判別法確認收斂,再用 summation 求出精確值(答案是 6)。 4. 用巴塞爾級數估計 \(\pi\) ,至少需要多少項才能讓誤差小於 \(10^{-6}\) ?寫迴圈找出答案。