第 5 章 數列與遞迴關係¶
(適用:台灣高中~大一;目標:用 SageMath 做「列項、求和、遞迴實驗、收斂直覺」並能回到手算推導)
# 顯式數列:a_n = 2n + 1
terms = [2*n + 1 for n in range(1, 11)]
terms
table([[n, 2*n+1] for n in range(1, 11)], header_row=['n', 'a_n'])
| n | a_n |
|---|---|
(B) 用點圖/折線圖看趨勢¶
把數列視為點 (n, a_n),你會更直覺地看到成長速度。
points = [(n, 2*n+1) for n in range(1, 21)]
list_plot(points)
a1, d = 3, 2
an = lambda n: a1 + (n-1)*d
terms = [an(n) for n in range(1, 11)]
terms, sum(terms)
# 用公式驗算
n = 10
Sn_formula = n*(a1 + an(n))/2
Sn_formula
a1, r = 5, 1/2
an = lambda n: a1*r^(n-1)
terms = [an(n) for n in range(1, 9)]
sum_terms = sum(terms)
sum_terms
n = 8
Sn_formula = a1*(1 - r^n)/(1 - r)
simplify(sum_terms - Sn_formula), Sn_formula
5.4 用 Sage 的 sum 做符號求和(高中~大一都好用)¶
Sage 的 sum(表達式, 變數, 起, 迄) 可以做符號求和。
例: $ \sum_{k=1}^{n} k,\quad \sum_{k=1}^{n} k^2,\quad \sum_{k=0}^{n} r^k $
var('k n r')
S1 = sum(k, k, 1, n)
S2 = sum(k^2, k, 1, n)
Sg = sum(r^k, k, 0, n)
S1, S2, Sg
你可以把它當成「推導後的驗算器」:
- 你手算推導出 $\frac{n(n+1)}{2}$,就用
simplify(S1 - n*(n+1)/2)看是否為 0。
simplify(S1 - n*(n+1)/2), simplify(S2 - n*(n+1)*(2*n+1)/6)
5.5 望遠鏡求和(telescoping):用列項找結構¶
望遠鏡求和常見型態: $$ \sum_{k=1}^{n}\left(\frac{1}{k}-\frac{1}{k+1} \right)=1-\frac{1}{n+1} $$
用 Sage 列出部分和會很直覺。
var('k n')
term = 1/k - 1/(k+1)
Sn = sum(term, k, 1, n)
Sn
# 列出 n=1..10 的部分和(看趨勢)
vals = [(m, N(Sn.subs(n=m))) for m in range(1, 11)]
table(vals, header_row=['n', 'S_n (numeric)'])
| n | S_n (numeric) |
|---|---|
你也可以直接化簡出閉式:
simplify(Sn)
def fib_list(N):
if N <= 0:
return []
if N == 1:
return [1]
F = [1, 1]
for _ in range(3, N+1):
F.append(F[-1] + F[-2])
return F
fib_list(12)
# 畫出前 15 項(成長很快)
points = [(n, fib_list(15)[n-1]) for n in range(1, 16)]
list_plot(points)
def recur_linear(a1, p, q, N):
a = a1
seq = [a]
for _ in range(1, N):
a = p*a + q
seq.append(a)
return seq
seq = recur_linear(a1=2, p=3, q=1, N=8)
seq
先用手算/觀察猜閉式:
這種型態通常可用「平移」變成等比:
令 $b_n = a_n + c$,希望滿足 $b_{n+1}=p b_n$。
因為
$
a_{n+1}+c = p(a_n+c) \iff a_{n+1} = p a_n + (pc-c)
$
所以要 $q = pc-c = (p-1)c \Rightarrow c = \frac{q}{p-1}$(當 $p\ne 1$)。
本題 $p=3,q=1$,所以 $c=\frac{1}{2}$。
令 $b_n=a_n+\frac12$,就有 $b_{n+1}=3b_n$,因此
$
b_n = b_1\cdot 3^{n-1} = \left(2+\frac12\right)3^{n-1}=\frac{5}{2}3^{n-1}
$
$
a_n = \frac{5}{2}3^{n-1}-\frac12
$
下面用 Sage 驗算(對前幾項檢查)。
var('n')
a_closed = (5/2)*3^(n-1) - 1/2
# 檢查 n=1..8 是否符合
check = [(m, seq[m-1], a_closed.subs(n=m)) for m in range(1, 9)]
table(check, header_row=['n', 'a_n (recur)', 'a_n (closed)'])
| n | a_n (recur) | a_n (closed) |
|---|---|---|
5.7 遞迴的收斂與極限直覺(預告第 9 章)¶
很多題目會問:若遞迴收斂到 L,求 L。
典型例: $$ a_{n+1}=\frac{1}{2}\left(a_n+\frac{2}{a_n} \right),\ a_1=2 $$ 這是牛頓法求 $\sqrt{2}$ 的版本,會收斂到 $\sqrt{2}$。
先用程式列項 + 觀察,再用「假設極限存在」求 L。
def newton_sqrt2(a1=2, N=8):
a = RR(a1) # 用實數近似型別 RR
seq = [a]
for _ in range(1, N):
a = 0.5*(a + 2/a)
seq.append(a)
return seq
seq = newton_sqrt2(2, 10)
seq
# 以表格看收斂
table([[n, seq[n-1]] for n in range(1, 11)], header_row=['n', 'a_n'])
| n | a_n |
|---|---|
# 與 sqrt(2) 比較
[s - sqrt(2).n() for s in seq]
若假設 $a_n\to L$,兩邊取極限: $ L=\frac12\left(L+\frac{2}{L}\right)\Rightarrow L=\frac{2}{L}\Rightarrow L^2=2 $ 又因為數列正值,取 $L=\sqrt{2}$。
Sage 可以幫你把這步代數整理得很乾淨。
var('L')
solve(L == 1/2*(L + 2/L), L)
5.8 常見技巧:用差分(difference)觀察規律¶
若你不確定數列是不是多項式型態,可以先看:
- 一階差分:$a_{n+1}-a_n$
- 二階差分:$(a_{n+2}-a_{n+1})-(a_{n+1}-a_n)$
例:$a_n = n^2$ 的二階差分是常數 2。
def diffs(seq):
return [seq[i+1]-seq[i] for i in range(len(seq)-1)]
seq = [n^2 for n in range(1, 11)]
d1 = diffs(seq)
d2 = diffs(d1)
seq, d1, d2
5.9 本章小結:你應該具備的能力¶
你現在應該能:
- 用 list/表格/點圖快速列出數列前 N 項並觀察
- 用
sum做符號求和,並用simplify驗算你的公式 - 對望遠鏡求和,先列項找結構,再化簡得到閉式
- 用程式處理遞迴,並用「平移變等比」等技巧猜閉式後驗算
- 用數值實驗建立收斂直覺,並能回到代數推導極限
練習題(附提示)¶
等差:$a_1=7,d=-3$,求 $a_{20}$ 與 $S_{20}$。
提示:用公式與程式列項互相驗算。等比:$a_1=2,r=3$,求 $S_{10}$。
提示:用sum(a1*r^(k-1), k, 1, n)推出一般式再代入。望遠鏡:計算
$ \sum_{k=1}^{n}\left(\frac{1}{k(k+1)}\right) $ 提示:部分分式:$\frac{1}{k(k+1)}=\frac{1}{k}-\frac{1}{k+1}$。
- 遞迴列項:$a_1=1$, $a_{n+1}=2a_n+3$,列出前 8 項並猜閉式。
提示:用本章 5.6 的平移技巧,$c=\frac{q}{p-1}$。
5.(挑戰)收斂判斷:定義
$
a_{n+1}=\frac{a_n+3}{a_n+1},\quad a_1=1
$
先列項觀察是否收斂,再假設極限存在求 L。
提示:解 $L=\frac{L+3}{L+1}$。
下一章(第 6 章)我們會進入「函數基本觀念與圖形」:
你會把數列的觀察方式(表格、圖形、趨勢)直接延伸到函數。