第 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 表示三維向量:

In [1]:
import sympy as sp
sp.init_printing()

v = sp.Matrix([1, 2, 3])
w = sp.Matrix([-1, 0, 4])
v, w
Out[1]:
$\displaystyle \left( \left[\begin{matrix}1\\2\\3\end{matrix}\right], \ \left[\begin{matrix}-1\\0\\4\end{matrix}\right]\right)$

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 中:

In [2]:
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
Out[2]:
$\displaystyle \left( \left[\begin{matrix}0\\2\\7\end{matrix}\right], \ \left[\begin{matrix}2\\4\\6\end{matrix}\right]\right)$

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)):

In [3]:
v = sp.Matrix([2, -1, 2])
length_v = v.norm()
unit_v = v / length_v
length_v, unit_v, unit_v.norm()
Out[3]:
$\displaystyle \left( 3, \ \left[\begin{matrix}\frac{2}{3}\\- \frac{1}{3}\\\frac{2}{3}\end{matrix}\right], \ 1\right)$

你可以看到單位向量的長度為 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():

In [4]:
v = sp.Matrix([1, 2, 3])
w = sp.Matrix([4, -1, 2])
dot_vw = v.dot(w)
dot_vw
Out[4]:
$\displaystyle 8$

計算夾角:

In [5]:
theta = sp.acos(dot_vw / (v.norm()*w.norm()))
sp.N(theta, 5)
Out[5]:
$\displaystyle 1.0854$

若內積為 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():

In [6]:
v = sp.Matrix([1, 0, 0])
w = sp.Matrix([0, 1, 0])
cross_vw = v.cross(w)
cross_vw, cross_vw.norm()
Out[6]:
$\displaystyle \left( \left[\begin{matrix}0\\0\\1\end{matrix}\right], \ 1\right)$

這代表:

  • $\vec{i} \times \vec{j} = \vec{k}$。
  • 平行四邊形的面積為 1(與直觀相符)。

再試一組一般的向量:

In [7]:
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
Out[7]:
$\displaystyle \left( \left[\begin{matrix}-1\\-1\\1\end{matrix}\right], \ \sqrt{3}\right)$

13.6 用叉積求平面法向量與面積¶

給定同一平面上的三點 $P_0, P_1, P_2$, 我們可以:

  1. 先構造兩個向量:$\vec{v} = \overrightarrow{P_0P_1}$,$\vec{w} = \overrightarrow{P_0P_2}$。
  2. 計算 $\vec{v} \times \vec{w}$ 得到法向量。
  3. 它的長度的一半就是三角形 $P_0P_1P_2$ 的面積。

例:三點 $P_0=(0,0,0)$,$P_1=(1,0,0)$,$P_2=(0,1,0)$。

In [8]:
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
Out[8]:
$\displaystyle \left( \left[\begin{matrix}0\\0\\1\end{matrix}\right], \ \frac{1}{2}\right)$

結果顯示法向量為 $(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)$。

In [9]:
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
Out[9]:
$\displaystyle \left[\begin{matrix}2 t + 1\\2 - t\\t + 3\end{matrix}\right]$

隨著 $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)$ 的平面方程。

In [10]:
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)
Out[10]:
$\displaystyle \left( x + 2 y + 3 z = 1, \ x + 2 y + 3 z - 1\right)$

13.9 判斷直線與平面、兩平面之間的關係¶

  1. 直線與平面:
  • 若直線方向向量 $\vec{d}$ 與平面法向量 $\vec{n}$ 垂直($\vec{d}\cdot \vec{n}=0$),則直線平行於平面。
  • 若 $\vec{d}$ 不平行於平面(內積非零),直線通常與平面有唯一交點,可以把直線參數式代入平面方程解 $t$。
  1. 兩平面:
  • 若兩平面的法向量平行,則兩平面平行或重合。
  • 若不平行,兩平面交於一直線,可透過聯立兩個平面方程求解。

我們用一個簡單例子示範「直線與平面交點」。

  • 直線:$\vec{r}(t) = (0,0,0) + t(1,1,1)$。
  • 平面:$x + 2y + 3z - 6 = 0$。
In [11]:
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
Out[11]:
$\displaystyle \left[ 1\right]$

代回求交點座標:

In [12]:
t_val = sol_t[0]
intersection_point = r_t.subs(t, t_val)
intersection_point
Out[12]:
$\displaystyle \left[\begin{matrix}1\\1\\1\end{matrix}\right]$

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 中可以寫成小工具函數:

In [13]:
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 的距離
Out[13]:
$\displaystyle 1.60356745147455$

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$。

In [14]:
F1 = sp.Matrix([5, 0, 8])
F2 = sp.Matrix([-3, 4, 2])
W  = sp.Matrix([0, 0, -10])

F3 = -(F1 + F2 + W)
F3
Out[14]:
$\displaystyle \left[\begin{matrix}-2\\-4\\0\end{matrix}\right]$

結果 $\vec{F}_3$ 的向量告訴我們第三條繩子的拉力方向與大小。

這種「力的平衡」與「向量和為零」在物理中是基本模型。

13.12 啟發性例子二:三角形面積與法向量的應用¶

在電腦圖學與 3D 模型中,曲面的每個小面片通常是三角形, 其法向量可用來計算光線反射與陰影。

給定三個頂點 $P_0, P_1, P_2$:

  1. 計算 $\vec{v} = P_1 - P_0$、$\vec{w} = P_2 - P_0$。
  2. 法向量 $\vec{n} = \vec{v} \times \vec{w}$。
  3. 正規化後(除以長度)得到單位法向量,用於光照計算。
  4. 面積為 $\dfrac{1}{2}\|\vec{n}\|$。

以 $P_0=(0,0,0)$,$P_1=(1,0,1)$,$P_2=(0,2,1)$ 為例:

In [15]:
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
Out[15]:
$\displaystyle \left( \left[\begin{matrix}-2\\-1\\2\end{matrix}\right], \ \left[\begin{matrix}- \frac{2}{3}\\- \frac{1}{3}\\\frac{2}{3}\end{matrix}\right], \ \frac{3}{2}\right)$

這裡 unit_n 就是該面片的單位法向量。

在 STEM 應用中,你會不斷看到叉積與法向量的身影。

13.13 啟發性例子三:兩平面的交線與視覺化想像¶

兩個不平行的平面在三維中會相交成一條直線。

例如:

  • 平面 $P_1: x + y + z = 1$。
  • 平面 $P_2: 2x - y + z = 0$。

我們可以用 SymPy 聯立方程組求交線的參數表示。

In [16]:
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
Out[16]:
$\displaystyle \left\{ y : \frac{x}{2} + \frac{1}{2}, \ z : \frac{1}{2} - \frac{3 x}{2}\right\}$

從這裡可選擇一個自由參數(例如 $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$ 作為起點。
In [17]:
n1 = sp.Matrix([1, 1, 1])
n2 = sp.Matrix([2, -1, 1])
d = n1.cross(n2)
d
Out[17]:
$\displaystyle \left[\begin{matrix}2\\1\\-3\end{matrix}\right]$

這樣就能寫出交線的向量式:$\vec{r}(t) = \vec{r}_0 + t\vec{d}$。

雖然在平面上很難畫出完整三維圖形,但透過符號運算,我們仍可掌握其幾何結構。

13.14 本章小結¶

本章你學到了:

  • 三維座標系統中的向量 $(v_1, v_2, v_3)$,以及加法、數量倍與長度。
  • 三維內積的定義與幾何意義(夾角),以及如何用內積判斷垂直。
  • 叉積提供一個垂直於兩向量的向量,其長度是平行四邊形的面積, 進而可求三角形面積與平面法向量。
  • 在三維中用向量描述直線(向量式、參數式)與平面(法向量形式)。
  • 直線與平面、兩平面之間的幾何關係可以透過向量與聯立方程分析。
  • 幾個應用場景:力的平衡、3D 模型的法向量與面積、兩平面的交線等。

13.15 練習題¶

請在本 Notebook 中新增儲存格,試著完成以下練習:

  1. 基本三維向量運算
    令 $\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 驗證你的手算結果。

  2. 長度與單位向量
    (a) 求 $\vec{u} = (2, 2, 1)$ 的長度。
    (b) 求與 $\vec{u}$ 同方向的單位向量。
    (c) 用 SymPy 檢查單位向量長度是否為 1。

  3. 內積與夾角
    令 $\vec{a} = (1, 0, 1)$,$\vec{b} = (0, 1, 1)$。
    (a) 計算 $\vec{a} \cdot \vec{b}$。
    (b) 求兩向量的夾角(用 SymPy 給出弧度近似)。
    (c) 判斷它們是否為銳角、鈍角或直角。

  4. 叉積與面積
    (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$ 的面積。

  5. 空間直線與平面
    (a) 寫出通過點 $(1,0,2)$ 且方向向量為 $(2,1,-1)$ 的直線參數式。
    (b) 寫出法向量為 $(1,-1,2)$ 且通過 $(0,1,0)$ 的平面方程。
    (c) 判斷這條直線是否平行於平面(計算方向向量與法向量的內積)。

  6. 點到平面距離
    考慮平面 $2x - y + 2z - 3 = 0$ 與點 $P=(1,1,1)$。
    (a) 使用公式手算點到平面的距離。
    (b) 使用本章撰寫的 distance_point_to_plane 函數檢查結果。

  7. 應用題:力的平衡(簡單計算)
    有一個物體同時受到三個力:
    $\vec{F}_1 = (3,0,4)$,$\vec{F}_2 = (-1,2,0)$,$\vec{F}_3$ 未知,且物體保持靜止(合力為 0)。
    (a) 用向量方程寫出平衡條件,求 $\vec{F}_3$。
    (b) 計算三個力的大小,並思考:哪一個力的大小最大?這代表什麼物理意義?

  8. 加分題:兩平面的交線
    平面 $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 驗證該參數式確實滿足兩個平面方程。

回首頁