第 13 章 空間向量與立體幾何¶
本章重點:
- 從三維座標系統出發,理解空間向量(3D 向量)的概念。
- 向量加法、數量倍、長度在三維中的延伸。
- 內積與夾角、投影的三維版本。
- 叉積(向量積)的幾何意義:面積、垂直方向。
- 在空間中用向量描述直線與平面:參數式、向量式與標準形式。
- 使用 SymPy 做三維向量運算、判斷平行/垂直、求距離與交線。
與第 12 章的二維向量相比,本章將這些觀念延伸到三維, 可以應用在立體幾何、物理(力學)、甚至電磁學與電腦圖學中。
13.1 三維座標與向量¶
在三維空間中,一個點可以用 $(x, y, z)$ 表示。
對應地,一個三維向量可以寫成:
$$\vec{v} = (v_1, v_2, v_3).$$
例如:
- $(1, 0, 0)$:在 $x$ 方向長度 1。
- $(0, 1, 0)$:在 $y$ 方向長度 1。
- $(0, 0, 1)$:在 $z$ 方向長度 1。
這三個向量常記為 $\vec{i}, \vec{j}, \vec{k}$,是三維空間的「基底向量」。
在 SymPy 中同樣可以用 Matrix 表示三維向量:
import sympy as sp
sp.init_printing()
v = sp.Matrix([1, 2, 3])
w = sp.Matrix([-1, 0, 4])
v, w
13.2 三維向量加法與數量倍¶
定義與二維情況類似:
- $\vec{v} + \vec{w} = (v_1 + w_1, v_2 + w_2, v_3 + w_3)$。
- $k\vec{v} = (kv_1, kv_2, kv_3)$。
幾何上,向量仍然可以視為「箭頭」,只是箭頭現在可指向三維空間中的任意方向。
在 SymPy 中:
v = sp.Matrix([1, 2, 3])
w = sp.Matrix([-1, 0, 4])
v_plus_w = v + w
two_v = 2*v
v_plus_w, two_v
13.3 三維向量長度與單位向量¶
向量 $\vec{v} = (v_1, v_2, v_3)$ 的長度定義為:
$$\|\vec{v}\| = \sqrt{v_1^2 + v_2^2 + v_3^2}.$$
與二維情況相比,只是多了一個成分。
在 SymPy 中可以使用 .norm() 或 sp.sqrt(v.dot(v)):
v = sp.Matrix([2, -1, 2])
length_v = v.norm()
unit_v = v / length_v
length_v, unit_v, unit_v.norm()
你可以看到單位向量的長度為 1。
13.4 三維內積與夾角¶
三維內積定義為:
$$\vec{v} \cdot \vec{w} = v_1 w_1 + v_2 w_2 + v_3 w_3,$$
幾何上仍有:
$$\vec{v} \cdot \vec{w} = \|\vec{v}\|\,\|\vec{w}\| \cos \theta,$$
其中 $\theta$ 為夾角。
在 SymPy 中同樣用 .dot():
v = sp.Matrix([1, 2, 3])
w = sp.Matrix([4, -1, 2])
dot_vw = v.dot(w)
dot_vw
計算夾角:
theta = sp.acos(dot_vw / (v.norm()*w.norm()))
sp.N(theta, 5)
若內積為 0,則兩向量垂直(正交)。
13.5 叉積(向量積):面積與垂直方向¶
在三維中,兩個向量可以做叉積(cross product),記為 $\vec{v} \times \vec{w}$, 結果仍是一個向量,且滿足:
- $\vec{v} \times \vec{w}$ 垂直於 $\vec{v}$ 和 $\vec{w}$。
- $\|\vec{v} \times \vec{w}\| = \|\vec{v}\|\,\|\vec{w}\|\sin \theta$, 恰好等於以 $\vec{v}, \vec{w}$ 為邊的平行四邊形的面積。
若 $\vec{v}$ 與 $\vec{w}$ 平行,則 $\theta=0$ 或 $\pi$,叉積為零向量。
在 SymPy 中用 .cross():
v = sp.Matrix([1, 0, 0])
w = sp.Matrix([0, 1, 0])
cross_vw = v.cross(w)
cross_vw, cross_vw.norm()
這代表:
- $\vec{i} \times \vec{j} = \vec{k}$。
- 平行四邊形的面積為 1(與直觀相符)。
再試一組一般的向量:
v2 = sp.Matrix([1, 2, 3])
w2 = sp.Matrix([0, 1, 1])
cross_v2w2 = v2.cross(w2)
area_parallelogram = cross_v2w2.norm()
cross_v2w2, area_parallelogram
13.6 用叉積求平面法向量與面積¶
給定同一平面上的三點 $P_0, P_1, P_2$, 我們可以:
- 先構造兩個向量:$\vec{v} = \overrightarrow{P_0P_1}$,$\vec{w} = \overrightarrow{P_0P_2}$。
- 計算 $\vec{v} \times \vec{w}$ 得到法向量。
- 它的長度的一半就是三角形 $P_0P_1P_2$ 的面積。
例:三點 $P_0=(0,0,0)$,$P_1=(1,0,0)$,$P_2=(0,1,0)$。
P0 = sp.Matrix([0, 0, 0])
P1 = sp.Matrix([1, 0, 0])
P2 = sp.Matrix([0, 1, 0])
v = P1 - P0
w = P2 - P0
n = v.cross(w)
area_triangle = n.norm()/2
n, area_triangle
結果顯示法向量為 $(0,0,1)$,三角形面積為 $1/2$, 這與我們熟悉的直角三角形面積公式一致。
13.7 空間直線的向量式與參數式¶
在三維空間中,一條直線可以描述成:
$$\vec{r}(t) = \vec{r}_0 + t\vec{d}, \quad t \in \mathbb{R},$$
其中 $\vec{r}_0 = (x_0, y_0, z_0)$ 是直線上的一點, $\vec{d} = (d_1, d_2, d_3)$ 是方向向量。
分量形式為:
$$x = x_0 + td_1, \quad y = y_0 + td_2, \quad z = z_0 + td_3.$$
例:通過點 $(1,2,3)$,方向向量 $(2, -1, 1)$。
t = sp.symbols('t', real=True)
r0 = sp.Matrix([1, 2, 3])
d = sp.Matrix([2, -1, 1])
r_t = r0 + t*d
r_t
隨著 $t$ 改變,我們得到同一直線上的所有點。
13.8 平面的向量式與一般式¶
在三維空間中,一個平面可以用法向量 $\vec{n} = (a, b, c)$ 與平面上一點 $P_0=(x_0,y_0,z_0)$ 描述:
$$\vec{n} \cdot (\vec{r} - \vec{r}_0) = 0.$$
展開後得到:
$$a(x - x_0) + b(y - y_0) + c(z - z_0) = 0,$$
即:
$$ax + by + cz + d = 0,$$
其中 $d = -(ax_0 + by_0 + cz_0)$。
例:法向量 $\vec{n} = (1,2,3)$,通過點 $(1,0,0)$ 的平面方程。
x, y, z = sp.symbols('x y z', real=True)
a, b, c = 1, 2, 3
x0, y0, z0 = 1, 0, 0
plane_eq = sp.Eq(a*(x-x0) + b*(y-y0) + c*(z-z0), 0)
sp.simplify(plane_eq), sp.expand(plane_eq.lhs)
13.9 判斷直線與平面、兩平面之間的關係¶
- 直線與平面:
- 若直線方向向量 $\vec{d}$ 與平面法向量 $\vec{n}$ 垂直($\vec{d}\cdot \vec{n}=0$),則直線平行於平面。
- 若 $\vec{d}$ 不平行於平面(內積非零),直線通常與平面有唯一交點,可以把直線參數式代入平面方程解 $t$。
- 兩平面:
- 若兩平面的法向量平行,則兩平面平行或重合。
- 若不平行,兩平面交於一直線,可透過聯立兩個平面方程求解。
我們用一個簡單例子示範「直線與平面交點」。
- 直線:$\vec{r}(t) = (0,0,0) + t(1,1,1)$。
- 平面:$x + 2y + 3z - 6 = 0$。
t = sp.symbols('t', real=True)
r_t = sp.Matrix([0, 0, 0]) + t*sp.Matrix([1, 1, 1])
x_t, y_t, z_t = r_t
eq_plane = sp.Eq(x_t + 2*y_t + 3*z_t - 6, 0)
sol_t = sp.solve(eq_plane, t)
sol_t
代回求交點座標:
t_val = sol_t[0]
intersection_point = r_t.subs(t, t_val)
intersection_point
13.10 點到平面的距離¶
平面方程:$ax + by + cz + d = 0$,點 $P_0 = (x_0, y_0, z_0)$, 則點到平面的距離為:
$$\text{dist} = \frac{|ax_0 + by_0 + cz_0 + d|}{\sqrt{a^2 + b^2 + c^2}}.$$
這是兩維情況(點到直線距離公式)的自然延伸。
在 SymPy 中可以寫成小工具函數:
def distance_point_to_plane(a, b, c, d, x0, y0, z0):
num = abs(a*x0 + b*y0 + c*z0 + d)
den = (a**2 + b**2 + c**2)**0.5
return num/den
distance_point_to_plane(1, 2, 3, -6, 0, 0, 0) # 點 (0,0,0) 到 x+2y+3z-6=0 的距離
13.11 啟發性例子一:空間中的力平衡(簡單版)¶
想像有一個掛在天花板上的燈,繩子分成三條方向不同的拉力 $\vec{F}_1, \vec{F}_2, \vec{F}_3$, 使得燈保持靜止。靜止表示合力為零:
$$\vec{F}_1 + \vec{F}_2 + \vec{F}_3 + \vec{W} = \vec{0},$$
其中 $\vec{W}$ 是重力(向下)。
雖然真實問題可能較複雜,但我們可以看簡化版:假設重力為 $(0,0,-10)$, 且有兩條拉力已知:
$\vec{F}_1 = (5,0,8)$,$\vec{F}_2 = (-3,4,2)$,求第三條拉力 $\vec{F}_3$。
F1 = sp.Matrix([5, 0, 8])
F2 = sp.Matrix([-3, 4, 2])
W = sp.Matrix([0, 0, -10])
F3 = -(F1 + F2 + W)
F3
結果 $\vec{F}_3$ 的向量告訴我們第三條繩子的拉力方向與大小。
這種「力的平衡」與「向量和為零」在物理中是基本模型。
13.12 啟發性例子二:三角形面積與法向量的應用¶
在電腦圖學與 3D 模型中,曲面的每個小面片通常是三角形, 其法向量可用來計算光線反射與陰影。
給定三個頂點 $P_0, P_1, P_2$:
- 計算 $\vec{v} = P_1 - P_0$、$\vec{w} = P_2 - P_0$。
- 法向量 $\vec{n} = \vec{v} \times \vec{w}$。
- 正規化後(除以長度)得到單位法向量,用於光照計算。
- 面積為 $\dfrac{1}{2}\|\vec{n}\|$。
以 $P_0=(0,0,0)$,$P_1=(1,0,1)$,$P_2=(0,2,1)$ 為例:
P0 = sp.Matrix([0, 0, 0])
P1 = sp.Matrix([1, 0, 1])
P2 = sp.Matrix([0, 2, 1])
v = P1 - P0
w = P2 - P0
n = v.cross(w)
unit_n = n / n.norm()
area_triangle = n.norm()/2
n, unit_n, area_triangle
這裡 unit_n 就是該面片的單位法向量。
在 STEM 應用中,你會不斷看到叉積與法向量的身影。
13.13 啟發性例子三:兩平面的交線與視覺化想像¶
兩個不平行的平面在三維中會相交成一條直線。
例如:
- 平面 $P_1: x + y + z = 1$。
- 平面 $P_2: 2x - y + z = 0$。
我們可以用 SymPy 聯立方程組求交線的參數表示。
x, y, z, t = sp.symbols('x y z t', real=True)
eq1 = sp.Eq(x + y + z, 1)
eq2 = sp.Eq(2*x - y + z, 0)
sol = sp.solve((eq1, eq2), (y, z)) # 把 y,z 用 x 表示,或其他選擇
sol
從這裡可選擇一個自由參數(例如 $x=t$),將 y, z 寫成 t 的函數,得到交線的參數式。
更系統的方法是:
- 法向量:$\vec{n}_1 = (1,1,1)$,$\vec{n}_2 = (2,-1,1)$。
- 交線的方向向量是 $\vec{d} = \vec{n}_1 \times \vec{n}_2$。
- 再找一個同時滿足兩平面方程的點 $P_0$ 作為起點。
n1 = sp.Matrix([1, 1, 1])
n2 = sp.Matrix([2, -1, 1])
d = n1.cross(n2)
d
這樣就能寫出交線的向量式:$\vec{r}(t) = \vec{r}_0 + t\vec{d}$。
雖然在平面上很難畫出完整三維圖形,但透過符號運算,我們仍可掌握其幾何結構。
13.14 本章小結¶
本章你學到了:
- 三維座標系統中的向量 $(v_1, v_2, v_3)$,以及加法、數量倍與長度。
- 三維內積的定義與幾何意義(夾角),以及如何用內積判斷垂直。
- 叉積提供一個垂直於兩向量的向量,其長度是平行四邊形的面積, 進而可求三角形面積與平面法向量。
- 在三維中用向量描述直線(向量式、參數式)與平面(法向量形式)。
- 直線與平面、兩平面之間的幾何關係可以透過向量與聯立方程分析。
- 幾個應用場景:力的平衡、3D 模型的法向量與面積、兩平面的交線等。
13.15 練習題¶
請在本 Notebook 中新增儲存格,試著完成以下練習:
基本三維向量運算
令 $\vec{v} = (1, -2, 3)$,$\vec{w} = (2, 1, -1)$。
(a) 計算 $\vec{v} + \vec{w}$、$\vec{v} - \vec{w}$。
(b) 計算 $2\vec{v} + 3\vec{w}$。
(c) 用 SymPy 驗證你的手算結果。長度與單位向量
(a) 求 $\vec{u} = (2, 2, 1)$ 的長度。
(b) 求與 $\vec{u}$ 同方向的單位向量。
(c) 用 SymPy 檢查單位向量長度是否為 1。內積與夾角
令 $\vec{a} = (1, 0, 1)$,$\vec{b} = (0, 1, 1)$。
(a) 計算 $\vec{a} \cdot \vec{b}$。
(b) 求兩向量的夾角(用 SymPy 給出弧度近似)。
(c) 判斷它們是否為銳角、鈍角或直角。叉積與面積
(a) 對 $\vec{v} = (1,2,3)$ 和 $\vec{w} = (2,0,1)$ 計算 $\vec{v} \times \vec{w}$。
(b) 求 $\|\vec{v} \times \vec{w}\|$,並解釋它表示的平行四邊形面積。
(c) 對三點 $P_0=(0,0,0)$,$P_1=(1,2,3)$,$P_2=(2,0,1)$,求三角形 $P_0P_1P_2$ 的面積。空間直線與平面
(a) 寫出通過點 $(1,0,2)$ 且方向向量為 $(2,1,-1)$ 的直線參數式。
(b) 寫出法向量為 $(1,-1,2)$ 且通過 $(0,1,0)$ 的平面方程。
(c) 判斷這條直線是否平行於平面(計算方向向量與法向量的內積)。點到平面距離
考慮平面 $2x - y + 2z - 3 = 0$ 與點 $P=(1,1,1)$。
(a) 使用公式手算點到平面的距離。
(b) 使用本章撰寫的distance_point_to_plane函數檢查結果。應用題:力的平衡(簡單計算)
有一個物體同時受到三個力:
$\vec{F}_1 = (3,0,4)$,$\vec{F}_2 = (-1,2,0)$,$\vec{F}_3$ 未知,且物體保持靜止(合力為 0)。
(a) 用向量方程寫出平衡條件,求 $\vec{F}_3$。
(b) 計算三個力的大小,並思考:哪一個力的大小最大?這代表什麼物理意義?加分題:兩平面的交線
平面 $P_1: x + y + z = 2$,平面 $P_2: 2x - y + z = 1$。
(a) 求兩平面的法向量 $\vec{n}_1, \vec{n}_2$,並計算交線的方向向量 $\vec{d} = \vec{n}_1 \times \vec{n}_2$。
(b) 找出一個同時位於兩平面上的點 $P_0$(可以令某個變數為參數後代入)。
(c) 寫出交線的參數式 $\vec{r}(t) = \vec{r}_0 + t\vec{d}$,並用 SymPy 驗證該參數式確實滿足兩個平面方程。