跳轉到

3.2 向量與內積:從費馬到格拉斯曼(1844 年)#

學習動機#

座標幾何(3.1 節)把點變成數,但平面上還有一類極有用處的物件被擱在一旁:從一點指向另一點的位移。位移這種東西不只有「長度」,還有「方向」——把 \((0,0)\) 平移到 \((3,4)\) ,與把 \((3,4)\) 平移到 \((3,4)\) 的起點不同但位移相同。這種「有方向的可計算量」就是向量(vector)。向量要能運算(相加、伸縮、度量長度與角度),才成為真正的代數物件;這條從費馬的位移術語、經 19 世紀力學與四元數之爭、到格拉斯曼 1844 年《延量論》(Ausdehnungslehre)中提出一般向量空間與內積的道路,正是本章的故事。學完之後,你將理解為什麼幾何學家說「向量空間是笛卡兒座標的現代成熟形態」。

一、向量觀念的前史#

1.1 笛卡兒座標裡已經埋下的種子#

3.1 節的參數化

\[ P(t) = A + t\,(B - A) \]

其實已經把「向量」推到檯面上但沒有命名:記號 \(B - A\) 恰是「從 \(A\) 指向 \(B\) 的位移」, \(t\,(B - A)\) 是「長度 \(t\) 倍的位移」( \(0 \le t \le 1\) ),而 \(A + u\) 是「把位移 \(u\) 加到點 \(A\) 上」。早期解析幾何學家就用這種直白的方式談位移,卻沒有把它形式化。

1.2 力學的推動:平行四邊形法則#

18 世紀,物理學的需求(合力、速度合成、力矩)催生了一套正式的「有向量操作法則」:

\[ \vec{u} + \vec{v} = \text{對角線} \qquad (\text{平行四邊形法則}) \]

這在座標語言下就是分量相加: \(\vec{u} = (u_1, u_2)\) 、 \(\vec{v} = (v_1, v_2)\) ,則 \(\vec{u} + \vec{v} = (u_1 + v_1,\ u_2 + v_2)\) 。物理量的合成第一次變成了率的加法。

1.3 哈密頓的四元數的中介角色#

1843 年,哈密頓(William Rowan Hamilton)發明四元數(quaternion):一個數搭配三個虛單位 \(i, j, k\) ,以乘法 \(i^2 = j^2 = k^2 = ijk = -1\) 運算。他把四元數的「向量部分」當成一種推廣複數的技巧。四元數乘積裡埋著兩種量:

  • 純量部分(scalar part):與現代點積(內積)密切相關;
  • 向量部分(vector part):與現代叉積(外積)密切相關。

重要的是:內積與外積,最早是從四元數乘法中「拆」出來的。吉布斯(Josiah Willard Gibbs)與亥維賽(Oliver Heaviside)在 1880 年代推銷的概念——把「純量積」與「向量積」從四元數獨立出來——奠定了今天的向量分析。這場「四元數之爭」是向量概念史的關鍵一幕。

1.4 格拉斯曼 1844:先知而無人聞問#

故事主角其實是更早也更深遠的:格拉斯曼(Hermann Grassmann)。1844 年他出版《延量論》(Die lineale Ausdehnungslehre),提出了一般化的代數體系:

  • 任意「長的 \(n\) 」個獨立單位,構成一個 \(n\) 維空間(他叫它 n-stelliges Grösse,即 \(n\) 位量);
  • 「加、減、乘」(他叫「延量」運算)服從特定公理;
  • 點積二則(我們叫內積)與他研究的「乘積」結構共存。

格拉斯曼是把向量空間當公理化的代數結構來研究的第一人,比「向量空間」這個詞早了幾十年。可惜他的書難讀、畢業於德國角落的小學校長,終其一生幾乎無人理會;直到 20 世紀,皮亞諾於 1888 年才將向量空間的公理以現代形式提出,而格拉斯曼的名譽才被追封。這是數學史上「超前時代而 Describe 湮沒」的著名例案,與阿波羅尼奧斯某程度上相似。

二、向量的形式理論#

2.1 向量的本質#

一個向量 \(\vec{v} = (v_1, v_2)\) 有兩個幾何資訊:

  • 大小(長度、模): \(|\vec{v}| = \sqrt{v_1^2 + v_2^2}\)
  • 方向

在形式上,向量服從「向量空間」的公理(加法交換結合、純量乘法分配等)。我們不在此展開全部公理——但仍列出內積的核心公理:

若 \(\langle \cdot, \cdot \rangle\) 是一個內積,則它滿足:

  1. \(\langle u, v \rangle = \langle v, u \rangle\) (對稱性)
  2. \(\langle au + bw, v \rangle = a\langle u, v \rangle + b\langle w, v \rangle\) (第一參數線性)
  3. \(\langle v, v \rangle \ge 0\) 且 \(\langle v, v \rangle = 0 \iff v = 0\) (正定性)

2.2 標準內積與畢氏定理的重新發明#

在座標平面,標準(歐氏)內積定義為

\[ \langle u, v \rangle = u_1 v_1 + u_2 v_2 \]

根據這個定義,向量長度成為內積的特例:

\[ |\vec{v}| = \sqrt{\langle \vec{v},\, \vec{v} \rangle} \]

這就是畢氏定理的向量形式:幾何的度量,現在完全由內積來編碼。換句話說:

一個空間的幾何,由它的內積決定。改內積,就改幾何。

這一思路後來直接通達 6.2 節的黎曼幾何:黎曼的度量張量,就是「每個點可變化的內積」。

2.3 內積的兩大幾何定理#

定理 3.2.1(內積與長度) \(|\vec{v}| = \sqrt{\langle \vec{v}, \vec{v} \rangle}\) 。

定理 3.2.2(柯西–舒瓦茲不等式) \(|\langle u, v \rangle| \le |u|\,|v|\) ,等號成立當且僅當 \(u, v\) 線性相關。

有了柯西–舒瓦茲,我們就能用內積定義角度。設 \(\theta\) 為 \(\vec{u}, \vec{v}\) 在座標意義下的夾角,則:

\[ \cos\theta = \frac{\langle u, v \rangle}{|u|\,|v|} \]

由柯西–舒瓦茲可證右端必在 \([-1, 1]\) 之間,這保證了 \(\theta\) 的存在。角度——這個純幾何概念——第一次純代數化。

2.4 垂直:內積的零集合#

有了角度,垂直就被化為一個代數條件:

\[ u \perp v \iff \langle u, v \rangle = 0 \]

這個「零內積即垂直」是解析幾何最有力的翻譯之一:所有「垂直族群」的問題(垂直平分線、法線、投影),都化為解方程 \(\langle u, v \rangle = 0\) 。你會在下節 3.3 的 SymPy 程式裡看到大量這種做法。

2.5 正交投影:向量幾何的解剖刀#

給定不垂直的 \(\vec{u}, \vec{v}\) , \(u\) 在 \(v\) 方向的正交投影為:

\[ \mathrm{proj}_{\vec{v}}\vec{u} = \frac{\langle u, v \rangle}{\langle v, v \rangle}\,\vec{v} \]

其幾何意義:「 \(u\) 沿 \(v\) 方向的分向量」。投影的殘差 \(\vec{u} - \mathrm{proj}_{\vec{v}}\vec{u}\) 必垂直於 \(\vec{v}\) ——這是「最短距離」的初步象徵。這個概念將把 3.3 節的「點到直線 最短距離公式」從「套公式」進化為「能推導」。

三、外積與幾何的「面積」#

3.1 外積定義與性質#

對平面向量 \((u_1, u_2)\) 、 \((v_1, v_2)\) ,定義其外積的純量值(即 \(z\) 分量,也稱二維叉積或 \(2\times 2\) 行列式):

\[ u \times v = u_1 v_2 - u_2 v_1 = \begin{vmatrix} u_1 & u_2 \\ v_1 & v_2 \end{vmatrix} \]

核心幾何事實:

\[ |u \times v| = |u|\,|v|\,\sin\theta = \text{平行四邊形 } ABCD\text{ 的面積} \]

也就是說:外積是「面積的代數」。3.1 節的鞋帶公式 \(\frac{1}{2}|x_A(y_B - y_C) + \cdots|\) ,本質就是半個外積。而在三維, \(u \times v\) 本身是向量,方向由右手定則決定、同時垂直於 \(u, v\) ;其大小恰是平行四邊形面積。這是 3.4 節線性變換面積理論的先導。

3.2 面積是有方向的量(給格拉斯曼的訊息)#

注意: \(u \times v = - v \times u\) ——外積是反交換的。這意味着「面積」本身可能是有符號的:以 \(\vec{u}\) 為第一邊、 \(\vec{v}\) 為第二邊(右手系),面積為正;反過來為負。這就是格拉斯曼「延量」思想的核心洞見:幾何量可以帶方向——有向線段、有向面積、乃至高維的「有向體積」。今天的計算幾何(第 8 章)裡判斷點在線的哪一側、曲線的定向等,都是用這個「有符號面積」。

四、SymPy 的向量計算#

SymPy 本身沒有專屬的 Vector 幾何類型(帶運算的向量分析另有 sympy.diffgeom 等),但 Matrix 完全勝任微小的向量代數:

from sympy import Matrix, sqrt

u = Matrix([3, 4])
v = Matrix([1, 7])

# 1. 向量加法與純量乘
print(u + v)
# Matrix([[4], [11]])

# 2. 向量長度
print(sqrt(u.dot(u)))
# 5

# 3. 內積
print(u.dot(v))
# 31

# 4. 夾角(用 acos;結果保留符號形式)
theta = acos(u.dot(v) / (u.norm() * v.norm()))
print(theta)             # acos(31/(5*sqrt(50)))
print(simplify(theta))   # acos(31*sqrt(2)/50)

# 5. 垂直判斷:零內積
print(u.dot(Matrix([4, -3])))   # 0  → (3,4) 與 (4,-3) 互相垂直

學習提示:把上述每一個單元自己鍵入 REPL 執行,觀察輸出,比「看懂」更有效。

4.1 投影的 SymPy 實作#

from sympy import Matrix, simplify

u = Matrix([2, 3])
v = Matrix([5, 1])

# proj_v(u) = <u,v>/<v,v> * v
proj = Matrix(u.dot(v) / v.dot(v) * v)
print(simplify(proj))
# Matrix([[5/2], [1/2]])

# 殘差必垂直於 v
residual = u - proj
print(simplify(residual))                 # Matrix([[-1/2], [5/2]])
print(residual.dot(v))                    # 0   → 驗證正交

4.2 面積與有向面積#

二維情形下 SymPy 的 cross 需要 \(3\) 元向量,所以對 2D(平面)向量,通常直接用行列式(或把向量補上 \(z = 0\) 再做 cross):

from sympy import Matrix, Abs, simplify

u = Matrix([4, -1])
v = Matrix([1, 6])

# 2D 叉積(帶符號面積)
det = u[0]*v[1] - u[1]*v[0]
print(det)
# 23

# 或者用 Matrix.det()
print((Matrix([[u[0], u[1]], [v[0], v[1]]])).det())
# 23

# 平行四邊形面積 23 ;三角形面積 23/2

你看到 23,它是帶符號的:若把 \(u, v\) 交換順序,會得 \(-23\) 。這就是格拉斯曼式「有向面積」在 SymPy 中的自然呈現。

五、向量如何改寫幾何學#

5.1 一個範式轉移的例證#

用向量語言重述一些「老題目」,體會其經濟性。

例 1:三角形中線交於一點(重心定理)

設三角 A, B, C,取中點 \(M_{BC}\) 、 \(M_{CA}\) ,證明中線共點。向量證法:設重心為

\[ G = \frac{1}{3}(A + B + C) \]

則 \(G\) 顯然在三條中線上(可各自參數化驗證)。這純粹是座標與分數——從希臘「延長兩倍即顯三點共線」的巧妙構造,到一次加法與三分之一。向量證法將「構造」轉為「代數式」。

from sympy import Matrix, Rational, solve
from sympy import symbols

A = Matrix([0, 0]); B = Matrix([6, 0]); C = Matrix([2, 6])
s = symbols('s', real=True)

# 重心
G = (A + B + C) / 3
print(G)
# Matrix([[8/3], [2]])

# 檢查 G 在中線 A→M_BC 上:M_BC = (B + C)/2
M_bc = (B + C) / 2
# A + s*(M_bc - A) = G 解得 s
alpha = symbols('alpha', real=True)
print(solve(Matrix(A + (M_bc - A) * alpha - G), alpha))
# {alpha: 2/3}    G 在中線上,且 AG:GM = 2:1 → 中線共點驗證成功

例 2:垂直平分線

到 \(A\) 、 \(B\) 距離相等的點 \(P\) 滿足 \(|P - A|^2 = |P - B|^2\) ,用內積展開:

\[ \langle P, P \rangle - 2\langle P, A \rangle + \langle A, A \rangle = \langle P, P \rangle - 2\langle P, B \rangle + \langle B, B \rangle \]

即

\[ \langle P,\, A - B \rangle = \frac{\langle A, A \rangle - \langle B, B \rangle}{2} \]

這是一條直線的向量方程,其法向量恰為 \(A - B\) ——就是 3.4 節「法線式」的前譜。

5.2 格拉斯曼之後:為什麼「向量空間」是幾何的終點站?#

理想上,3.1 節的座標平原經過本章,已升級為一個公理結構:向量空間 + 內積。其最終形態有兩層意義:

  1. 公理化了幾何物件:點、向量不再依賴直觀,站得住的全是公理與定義。
  2. 開啟了內在幾何:曲面的幾何不依賴於外圍空間——只要你有一個內積(相等於度量張量),你就有幾何。這正是 6.2 節黎曼幾何與第 9 章微分幾何的底層。
  3. 矩陣呼之欲出:向量自被定義為「可離開座標、隨時可進入座標」的物件,那麼「把向量送到向量」的操作自然是「矩陣」——這是 3.4 節的主題。

六、SymPy 綜合習例#

6.1 一個稍微完整的題目#

題目:四邊形 \(P_1(0,0), P_2(4,0), P_3(6,3), P_4(1,3)\) 。問它是什麼形?(數據可能提示平行四邊形或等腰——用向量驗證。)

from sympy import Matrix

P1 = Matrix([0, 0]); P2 = Matrix([4, 0])
P3 = Matrix([6, 3]); P4 = Matrix([1, 3])

e1 = P2 - P1     # 邊 1
e2 = P3 - P2     # 邊 2
e3 = P4 - P3     # 邊 3
e4 = P1 - P4     # 邊 4
# 平形測試(用叉積:叉積為 0 表示邊向量平行)
print(e1[0]*e3[1] - e1[1]*e3[0])      # 0 → e1 // e3(水平一組對邊平行)
print(e2[0]*e4[1] - e2[1]*e4[0])      # -3 ≠ 0 → e2、e4 不平行

一組對邊平行、另一組不平行——這是梯形,而非平行四邊形。用了向量,這類判斷從「畫圖猜測」降為「一次叉積」。再進一步,一個好用的凸四邊形面積公式:

\[ [\,四邊形\,] = \tfrac{1}{2}\, |d_1 \times d_2| \]

其中 \(d_1, d_2\) 是兩條對角線向量(外積即二維叉積/有向面積)。

from sympy import Matrix, Abs

d1 = P3 - P1        # 對角線 1
d2 = P4 - P2        # 對角線 2
print(d1.norm(), d2.norm())
# 3*sqrt(5) 3*sqrt(2)

cross2d = d1[0]*d2[1] - d1[1]*d2[0]
print(Abs(cross2d) / 2)
# 27/2

與鞋帶公式 \(\frac{1}{2}|30 - 3| = \frac{27}{2}\) 完全一致。向量把四邊形面積化成一句叉積——這是格拉斯曼思想的實用紅利。

6.2 三維外積的完整事例#

from sympy import Matrix, simplify

u = Matrix([1, 2, 3])
v = Matrix([4, 5, 6])

w = u.cross(v)
print(w)
# Matrix([[-3], [6], [-3]])

# 1. 垂直於兩者
print(u.dot(w), v.dot(w))
# 0 0

# 2. 大小 = 平行四邊形面積
print(w.norm())
# 3*sqrt(6)

七、小結#

觀念 一句話
向量 有方向、可運算的量;「點的差」
內積 把長度與角度變成代數: $
正交 平行於「零內積」,整類幾何條件方程化
外積 面積(與方向)的代數, \(\det\) 之前身
格拉斯曼 超前時代的向量空間公理化,內在幾何的先聲
四元數 內積/外積在歷史上是從四元數乘法中被「拆分」

習題#

習題 3.2-1(基礎運算) 設 \(\vec{u} = (2, -1)\) 、 \(\vec{v} = (-3, 5)\) 。用 SymPy 計算:(1) \(|u|\) 、 \(|v|\) ;(2) \(u \cdot v\) ;(3) \(u, v\) 的夾角(化為最簡形式);(4) 判斷 \(2u - v\) 是否為單位向量。

習題 3.2-2(投影) 以 \(\vec{u} = (5, 4)\) 、 \(\vec{v} = (3, 1)\) :(1) 求 \(\mathrm{proj}_{\vec{v}}\vec{u}\) ;(2) 驗證殘差與 \(v\) 正交;(3) 求 \(u\) 到「直線 \(y = x/3\) 」的最短距離,並觀察它等於殘差的長度。

習題 3.2-3(有向面積) 用二維叉積(行列式)計算三角形 \(A(0,0), B(7,1), C(2,5)\) 的面積;交換 \(B, C\) 順序再算一次,指出符號意義。並用 Polygon(A,B,C).area 驗證數值一致。

習題 3.2-4(重心的一般證明) 以符號 \(A = (a_1,a_2),\ B = (b_1,b_2),\ C = (c_1,c_2)\) ,用 SymPy 證明 \(G = \frac{A+B+C}{3}\) 滿足:沿中線 \(A \to \frac{B+C}{2}\) 的 \(\alpha\) 參數等於 \(\frac{2}{3}\) (即 \(AG:GM = 2:1\) ),對 \(B, C\) 兩條中線重複證明。

習題 3.2-5(柯西–舒瓦茲的 SymPy 觀察) 定義 \(n\) 維符號向量 \(u = (a_1, \dots, a_4)\) 、 \(v = (b_1, \dots, b_4)\) ,計算 \(Q = (\langle u, v \rangle)^2 - \langle u, u \rangle \langle v, v \rangle\) 的展開式;進一步在 SymPy 中證明: \(Q\) 等於 \(\sum_{i<j} (a_i b_j - a_j b_i)^2\) 的負號。這是柯西–舒瓦茲最深刻的代數證明之一。


下一節:3.3 用 SymPy 做解析幾何:直線、距離、交點