第 12 章 二維向量與直線幾何¶
本章重點:
- 從「位移」、「箭頭」的角度理解平面向量。
- 向量的加法、數量倍與幾何意義。
- 內積的代數與幾何意義(夾角、投影)。
- 在平面上用向量描述直線:點向式、參數式、一般式等。
- 使用 SymPy 做向量運算、判斷平行/垂直、求距離與交點。
本章把高中常見的「座標幾何」改用向量語言統一整理, 並利用 Python / SymPy 幫你做計算與驗證,是連結線性代數的第一步。
12.1 二維向量的基本觀念¶
在平面上,一個向量可以想成「有方向的位移」:
- 既有長度(大小),也有方向。
- 通常寫成 $\vec{v} = (v_1, v_2)$ 或列向量、行向量形式。
例如:
- $(3, 1)$ 可以理解為「向右 3、向上 1 的位移」。
- $(-2, 0)$ 是向左 2 的位移。
在 SymPy 中,可以使用 Matrix 或 ImmutableMatrix 來表示向量:
import sympy as sp
sp.init_printing()
v = sp.Matrix([3, 1])
w = sp.Matrix([-2, 4])
v, w
12.2 向量加法與數量倍¶
如果 $\vec{v} = (v_1, v_2)$、$\vec{w} = (w_1, w_2)$,則:
- 加法:$\vec{v} + \vec{w} = (v_1 + w_1, v_2 + w_2)$。
- 數量倍:$k\vec{v} = (kv_1, kv_2)$。
幾何上:
- 向量加法可視為「首尾相接」,結果是從起點到終點的向量。
- 數量倍則是改變向量的長度與方向(若 $k<0$ 會反向)。
在 SymPy 中,直接用 + 與 * 即可:
v = sp.Matrix([3, 1])
w = sp.Matrix([-2, 4])
v_plus_w = v + w
two_v = 2*v
minus_w = -w
v_plus_w, two_v, minus_w
12.3 向量長度與單位向量¶
向量 $\vec{v} = (v_1, v_2)$ 的長度(或稱模)定義為:
$$\|\vec{v}\| = \sqrt{v_1^2 + v_2^2}.$$
若一個向量長度為 1,稱為單位向量。
給定非零向量 $\vec{v}$,其方向的單位向量為:
$$\hat{v} = \frac{\vec{v}}{\|\vec{v}\|}.$$
在 SymPy 中,我們可以這樣計算:
v = sp.Matrix([3, 4]) # 典型 3-4-5 三角形
length_v = sp.sqrt(v.dot(v)) # 或 v.norm()
unit_v = v / length_v
length_v, unit_v
你可以試著計算 unit_v 的長度,應該等於 1:
unit_v.norm()
12.4 內積與夾角¶
二維向量 $\vec{v} = (v_1, v_2)$ 與 $\vec{w} = (w_1, w_2)$ 的內積(dot product)定義為:
$$\vec{v} \cdot \vec{w} = v_1 w_1 + v_2 w_2.$$
幾何上有重要關係:
$$\vec{v} \cdot \vec{w} = \|\vec{v}\|\,\|\vec{w}\| \cos \theta,$$
其中 $\theta$ 是兩向量的夾角($0 \le \theta \le \pi$)。
- 若 $\vec{v} \cdot \vec{w} > 0$,夾角小於 90°。
- 若 $\vec{v} \cdot \vec{w} = 0$,夾角為 90°(向量互相垂直)。
- 若 $\vec{v} \cdot \vec{w} < 0$,夾角大於 90°。
在 SymPy 中,可以用 dot 方法計算內積:
v = sp.Matrix([1, 2])
w = sp.Matrix([3, 4])
dot_vw = v.dot(w)
dot_vw
若要計算夾角,可以用:
$$\cos \theta = \frac{\vec{v} \cdot \vec{w}}{\|\vec{v}\|\,\|\vec{w}\|}.$$
theta = sp.acos(dot_vw / (v.norm()*w.norm()))
theta_simplified = sp.simplify(theta)
theta_simplified
你可以再用 sp.N(theta_simplified, 5) 看數值近似(弧度)。
sp.N(theta_simplified, 5)
12.5 向量與直線:方向向量、點向式¶
在平面上,一條直線可以看成所有「從某點出發,沿著某個方向向量走」所到達的點。
假設方向向量是 $\vec{d} = (d_1, d_2)$,直線上有一個已知點 $P_0 = (x_0, y_0)$, 則直線上任一點 $P=(x,y)$ 可以寫成:
$$\begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} x_0 \\ y_0 \end{pmatrix} + t \begin{pmatrix} d_1 \\ d_2 \end{pmatrix}, \quad t \in \mathbb{R}.$$
這稱為參數式或向量式。
如果我們把分量拆開,就是:
$$x = x_0 + td_1, \quad y = y_0 + td_2.$$
例:$P_0 = (1,2)$,方向向量 $\vec{d} = (3, -1)$。
t = sp.symbols('t', real=True)
x0, y0 = 1, 2
d = sp.Matrix([3, -1])
point_on_line = sp.Matrix([x0, y0]) + t*d
point_on_line
這表示當 $t$ 改變時,我們得到同一直線上的所有點。
12.6 直線的一般式與法向量¶
平面上另一種常見的直線表示方式是:
$$ax + by + c = 0.$$
可以把 $\vec{n} = (a, b)$ 理解為直線的法向量(垂直於直線)。
如果已知法向量 $\vec{n} = (a, b)$ 和直線上的一點 $P_0 = (x_0, y_0)$, 則直線方程可以寫成:
$$a(x - x_0) + b(y - y_0) = 0.$$
例:已知一條直線的法向量為 $(2,1)$,且通過點 $(1,3)$,求其方程式。
a, b = 2, 1
x0, y0 = 1, 3
x, y = sp.symbols('x y', real=True)
line_eq = sp.Eq(a*(x - x0) + b*(y - y0), 0)
sp.simplify(line_eq)
我們可以把它展開成一般式 $ax+by+c=0$ 的樣子:
sp.expand(line_eq.lhs)
12.7 判斷直線平行與垂直:向量觀點¶
兩條直線平行 ⇔ 它們的方向向量平行(成比例)。
兩條直線垂直 ⇔ 一條的方向向量與另一條的法向量平行,或兩個方向向量內積為 0。
例:
- 直線 $L_1$:通過 $(0,0)$,方向向量 $\vec{d}_1 = (1,2)$。
- 直線 $L_2$:通過 $(1,0)$,方向向量 $\vec{d}_2 = (2,4)$。
因為 $\vec{d}_2 = 2\vec{d}_1$,所以兩線平行。
在 SymPy 中可以透過判定向量是否成比例或內積是否為 0:
d1 = sp.Matrix([1, 2])
d2 = sp.Matrix([2, 4])
d3 = sp.Matrix([2, -1]) # 嘗試與 d1 比較
det_parallel = sp.Matrix.hstack(d1, d2).det() # 若為 0 則平行
dot_perp = d1.dot(d3) # 若為 0 則垂直
det_parallel, dot_perp
這裡 det_parallel = 0 表示 d1, d2 線性相關(平行或同一直線),
而 dot_perp = 0 則代表 d1 與 d3 垂直。
12.8 點到直線的距離¶
若直線方程為 $ax + by + c = 0$,點為 $(x_0, y_0)$, 則點到直線的距離為:
$$\text{dist} = \frac{|ax_0 + b y_0 + c|}{\sqrt{a^2 + b^2}}.$$
理由:
- 分母是法向量 $\vec{n} = (a,b)$ 的長度。
- 分子是「代入直線方程後的值」的絕對值,可以看成在法向量方向上的投影長度。
在 SymPy 中,我們可以寫一個小函數來計算:
def distance_point_to_line(a, b, c, x0, y0):
num = abs(a*x0 + b*y0 + c)
den = (a**2 + b**2)**0.5
return num/den
distance_point_to_line(2, 1, -5, 0, 0) # 點 (0,0) 到 2x + y - 5 = 0 的距離
12.9 兩直線交點:聯立方程與向量觀點¶
兩條直線若不平行,會有唯一交點,可透過聯立方程求解。
例:
$$\begin{cases} 2x + y - 5 = 0 \\ -x + 3y - 4 = 0 \end{cases}$$
用 SymPy 解:
x, y = sp.symbols('x y', real=True)
eq1 = sp.Eq(2*x + y - 5, 0)
eq2 = sp.Eq(-x + 3*y - 4, 0)
solution = sp.solve((eq1, eq2), (x, y))
solution
你可以把結果視為兩條直線的交點座標。
向量觀點下,也可以把這問題視為求兩個參數式直線的交點,不過在實作上聯立方程通常較方便。
12.10 啟發性例子一:位移與淨效果¶
想像你在平面上移動:
- 先向右 3 單位、向上 1 單位 → 向量 $(3,1)$。
- 再向左 2 單位、向上 4 單位 → 向量 $(-2,4)$。
總位移是兩向量相加:$(3,1) + (-2,4) = (1,5)$。
用 Python / SymPy 可以這樣模擬:
v1 = sp.Matrix([3, 1])
v2 = sp.Matrix([-2, 4])
total_displacement = v1 + v2
v1, v2, total_displacement
這表示,無論你實際路線多彎曲,只要總位移向量是 $(1,5)$, 你的起點與終點相對位置就完全一樣。
這也是物理中區分「位移」與「路程」的重要概念: 位移只在乎起點與終點,而路程則取決於走的路徑。
12.11 啟發性例子二:投影與功¶
物理中的「功」(work)可以寫成力與位移的內積:
$$W = \vec{F} \cdot \vec{d} = \|\vec{F}\|\,\|\vec{d}\|\cos \theta,$$
其中 $\theta$ 是力與位移的夾角。
- 若力與位移方向一致(夾角小),做功較大。
- 若力與位移垂直(夾角 90°),則不做功。
例:
- 力 $\vec{F} = (10, 0)$(向右 10N)。
- 位移 $\vec{d} = (3, 4)$(向右 3、向上 4)。
用 SymPy 計算功:
F_vec = sp.Matrix([10, 0])
d_vec = sp.Matrix([3, 4])
W = F_vec.dot(d_vec)
W
此處 $W = 30$,可以理解為力在位移方向上的投影長度乘上位移大小。
若力改成垂直方向,例如 $\vec{F'} = (0,10)$,則:
F2_vec = sp.Matrix([0, 10])
W2 = F2_vec.dot(d_vec)
W2
得到 0,表示力與位移垂直,不做功。
12.12 啟發性例子三:資料點最佳擬合線的向量觀點(概念性)¶
在統計和資料科學中,我們常常要用一條直線來近似多個資料點, 例如線性回歸(linear regression)。
雖然完整理論需要線性代數與最小平方法,但在二維情況下, 可以直觀地理解為:
- 資料點 $(x_i, y_i)$ 提供了一堆「位置向量」。
- 我們想找一條直線,使得垂直距離的平方和最小。
距離計算會用到「點到直線距離公式」, 而把這些距離平方加總再最小化,背後就是內積與向量長度的概念。
這個例子主要是提醒:
- 你現在學的向量與直線幾何,將來會出現在資料分析與機器學習中。
12.13 本章小結¶
本章你學到了:
- 二維向量可以視為「平面上的位移」,用座標 $(v_1, v_2)$ 表示。
- 向量加法與數量倍的幾何意義與 SymPy 實作方式。
- 內積的代數與幾何詮釋(夾角、投影),及用內積判斷垂直。
- 使用向量描述直線:點向式/參數式以及一般式 $ax+by+c=0$, 並理解法向量與方向向量的角色。
- 利用向量工具判斷直線平行與垂直、計算點到直線距離與兩線交點。
- 一些實際情境:位移的淨效果、力與位移做功、資料擬合的直線幾何直觀。
12.14 練習題¶
請在本 Notebook 中新增儲存格,試著完成以下練習:
基本向量運算
令 $\vec{v} = (2, -1)$,$\vec{w} = (-3, 4)$。
(a) 計算 $\vec{v} + \vec{w}$ 與 $2\vec{v} - \vec{w}$。
(b) 用 SymPy 檢查你的手算結果。長度與單位向量
(a) 求 $\vec{u} = (1, \sqrt{3})$ 的長度。
(b) 求與 $\vec{u}$ 同方向的單位向量。
(c) 用 SymPy 計算其長度,確認為 1。內積與夾角
令 $\vec{a} = (1,2)$,$\vec{b} = (2,-1)$。
(a) 手算 $\vec{a} \cdot \vec{b}$。
(b) 用內積公式與向量長度計算兩向量夾角 $\theta$ 的餘弦值,並用 SymPy 求其數值近似。
(c) 判斷兩向量是否銳角、鈍角或正交。直線的向量式與一般式
考慮通過點 $(1,2)$ 且方向向量為 $(2,3)$ 的直線。
(a) 寫出其參數式(向量式)。
(b) 求其法向量,並寫成一般式 $ax+by+c=0$。
(c) 使用 SymPy 檢查某點(例如 $(3,5)$)是否在此直線上(代入方程)。平行與垂直
(a) 判斷直線 $L_1: x - 2y + 1 = 0$ 與 $L_2: 2x - 4y - 3 = 0$ 是否平行或重合。
(b) 找出一條與 $L_1$ 垂直且通過原點的直線方程式。
(c) 用 SymPy 畫出這些直線(若環境支援)以輔助理解。點到直線距離
(a) 使用公式計算點 $(1,2)$ 到直線 $3x + 4y - 10 = 0$ 的距離。
(b) 用你在本章寫的distance_point_to_line函數檢查結果。應用題:力與位移作功
假設一個力 $\vec{F} = (5, 12)$ 作用在物體上,物體的位移為 $\vec{d} = (3, 4)$。
(a) 計算此力所做的功 $W = \vec{F} \cdot \vec{d}$。
(b) 計算力的大小和位移的大小,以及兩者的夾角。
(c) 用文字說明:如果夾角變大(例如換成另一個位移向量),功會如何改變?加分題:兩直線交點與向量幾何
直線 $L_1$ 通過 $(0,1)$,方向向量為 $(1,1)$;直線 $L_2$ 通過 $(2,0)$,方向向量為 $(-1,2)$。
(a) 寫出兩條直線的參數式。
(b) 利用 SymPy 把兩個參數式改寫成聯立方程,解出交點座標。
(c) 嘗試在紙上畫出這兩條線及交點,並用幾何直覺檢查你的答案是否合理。