第 5 章 數列與遞迴關係¶

(適用:台灣高中~大一;目標:用 SageMath 做「列項、求和、遞迴實驗、收斂直覺」並能回到手算推導)

5.1 本章為什麼重要?¶

數列與遞迴關係是高中數學的重點,也會一路延伸到大一:

  • 微積分中的極限與收斂
  • 離散數學與演算法中的遞迴
  • 機率與統計中的期望與遞推

手算常見困難:

  • 看到遞迴很難想像「長相」
  • 求和公式容易記錯或推導很長
  • 收斂/發散靠直覺,但直覺有時不可靠

SageMath 能幫你:

  • 快速列出前幾項、畫出趨勢
  • 自動計算求和(符號或數值)
  • 用數值實驗猜想公式,再回去證明

5.2 基本概念:用 list 寫出數列前 N 項¶

數列可以用「明確公式」或「遞迴」定義。

(A) 明確公式(顯式)¶

例:$a_n = 2n+1$,列出 $n=1\sim 10$。

In [22]:
# 顯式數列:a_n = 2n + 1
terms = [2*n + 1 for n in range(1, 11)]
terms
Out[22]:
In [23]:
table([[n, 2*n+1] for n in range(1, 11)], header_row=['n', 'a_n'])
Out[23]:
n a_n

(B) 用點圖/折線圖看趨勢¶

把數列視為點 (n, a_n),你會更直覺地看到成長速度。

In [24]:
points = [(n, 2*n+1) for n in range(1, 21)]
list_plot(points)
Out[24]:
No description has been provided for this image

5.3 等差數列與等比數列:列項 + 求和 + 驗算¶

(A) 等差數列¶

$ a_n = a_1 + (n-1)d $ 和: $ S_n = rac{n(a_1+a_n)}{2} $

例:$a_1=3,d=2$,求前 10 項與 $S_{10}$。

In [25]:
a1, d = 3, 2
an = lambda n: a1 + (n-1)*d

terms = [an(n) for n in range(1, 11)]
terms, sum(terms)
Out[25]:
In [26]:
# 用公式驗算
n = 10
Sn_formula = n*(a1 + an(n))/2
Sn_formula
Out[26]:

(B) 等比數列¶

$ a_n = a_1 r^{n-1},\quad S_n=a_1 rac{1-r^n}{1-r}\ (r e 1) $

例:$a_1=5,r=\frac12$,求 $S_{8}$。

In [27]:
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
Out[27]:
In [28]:
n = 8
Sn_formula = a1*(1 - r^n)/(1 - r)
simplify(sum_terms - Sn_formula), Sn_formula
Out[28]:

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 $

In [29]:
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
Out[29]:

你可以把它當成「推導後的驗算器」:

  • 你手算推導出 $\frac{n(n+1)}{2}$,就用 simplify(S1 - n*(n+1)/2) 看是否為 0。
In [30]:
simplify(S1 - n*(n+1)/2), simplify(S2 - n*(n+1)*(2*n+1)/6)
Out[30]:

5.5 望遠鏡求和(telescoping):用列項找結構¶

望遠鏡求和常見型態: $$ \sum_{k=1}^{n}\left(\frac{1}{k}-\frac{1}{k+1} \right)=1-\frac{1}{n+1} $$

用 Sage 列出部分和會很直覺。

In [31]:
var('k n')
term = 1/k - 1/(k+1)
Sn = sum(term, k, 1, n)
Sn
Out[31]:
In [32]:
# 列出 n=1..10 的部分和(看趨勢)
vals = [(m, N(Sn.subs(n=m))) for m in range(1, 11)]
table(vals, header_row=['n', 'S_n (numeric)'])
Out[32]:
n S_n (numeric)

你也可以直接化簡出閉式:

In [33]:
simplify(Sn)
Out[33]:

5.6 遞迴關係:用程式生成前 N 項(建立直覺)¶

(A) 最基本模板:for 迴圈¶

例:Fibonacci 數列 $ F_1=1,\ F_2=1,\ F_{n}=F_{n-1}+F_{n-2} $

In [34]:
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)
Out[34]:
In [35]:
# 畫出前 15 項(成長很快)
points = [(n, fib_list(15)[n-1]) for n in range(1, 16)]
list_plot(points)
Out[35]:
No description has been provided for this image

(B) 一階線性遞迴:常見在高中題¶

$ a_{n+1} = p a_n + q $ 例:$a_1=2$, $a_{n+1}=3a_n+1$。

我們用程式列項,再猜閉式,再用 simplify 驗算。

In [36]:
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
Out[36]:

先用手算/觀察猜閉式:
這種型態通常可用「平移」變成等比:

令 $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 驗算(對前幾項檢查)。

In [37]:
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)'])
Out[37]:
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。

In [38]:
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
Out[38]:
In [39]:
# 以表格看收斂
table([[n, seq[n-1]] for n in range(1, 11)], header_row=['n', 'a_n'])
Out[39]:
n a_n
In [40]:
# 與 sqrt(2) 比較
[s - sqrt(2).n() for s in seq]
Out[40]:

若假設 $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 可以幫你把這步代數整理得很乾淨。

In [41]:
var('L')
solve(L == 1/2*(L + 2/L), L)
Out[41]:

5.8 常見技巧:用差分(difference)觀察規律¶

若你不確定數列是不是多項式型態,可以先看:

  • 一階差分:$a_{n+1}-a_n$
  • 二階差分:$(a_{n+2}-a_{n+1})-(a_{n+1}-a_n)$

例:$a_n = n^2$ 的二階差分是常數 2。

In [42]:
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
Out[42]:

5.9 本章小結:你應該具備的能力¶

你現在應該能:

  • 用 list/表格/點圖快速列出數列前 N 項並觀察
  • 用 sum 做符號求和,並用 simplify 驗算你的公式
  • 對望遠鏡求和,先列項找結構,再化簡得到閉式
  • 用程式處理遞迴,並用「平移變等比」等技巧猜閉式後驗算
  • 用數值實驗建立收斂直覺,並能回到代數推導極限

練習題(附提示)¶

  1. 等差:$a_1=7,d=-3$,求 $a_{20}$ 與 $S_{20}$。
    提示:用公式與程式列項互相驗算。

  2. 等比:$a_1=2,r=3$,求 $S_{10}$。
    提示:用 sum(a1*r^(k-1), k, 1, n) 推出一般式再代入。

  3. 望遠鏡:計算

$ \sum_{k=1}^{n}\left(\frac{1}{k(k+1)}\right) $ 提示:部分分式:$\frac{1}{k(k+1)}=\frac{1}{k}-\frac{1}{k+1}$。

  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 章)我們會進入「函數基本觀念與圖形」:
你會把數列的觀察方式(表格、圖形、趨勢)直接延伸到函數。