第 13 章 空間向量與立體幾何¶

(適用:台灣高中~大一;目標:用 SageMath 操作三維向量、內積與叉積,處理直線/平面/距離/角度,並用 3D 圖形建立空間直覺)

13.1 本章地圖:三維向量把立體幾何「代數化」¶

在空間幾何裡,你常會遇到:

  • 空間中的點、向量、距離、角度
  • 直線與平面:參數式、一般式
  • 垂直與平行:用內積/叉積判斷
  • 距離:點到平面、點到直線、兩歪斜線距離
  • 體積與面積:用叉積與混合積(triple product)

SageMath 能幫你:

  • 快速算內積、叉積、距離、體積
  • 解聯立方程找交點/投影點
  • 畫 3D 圖形(建立空間直覺)

13.2 三維向量:建立、長度、內積¶

向量用 vector([x,y,z])。

In [1]:
u = vector([1, 2, -1])
v = vector([3, -1, 4])

u, v, u+v, 2*u
Out[1]:
\(\displaystyle \left(\left(1,\,2,\,-1\right), \left(3,\,-1,\,4\right), \left(4,\,1,\,3\right), \left(2,\,4,\,-2\right)\right)\)
In [2]:
# 長度(模)與內積
u_norm = u.norm()
v_norm = v.norm()
u_dot_v = u.dot_product(v)

u_norm, v_norm, u_dot_v
Out[2]:
\(\displaystyle \left(\sqrt{6}, \sqrt{26}, -3\right)\)

夾角¶

$ \cos\theta = \frac{u\cdot v}{\|u\|\|v\|} $

In [3]:
var('x')
cos_theta = u.dot_product(v)/(u.norm()*v.norm())
theta = arccos(cos_theta)
N(theta), N(theta*180/pi)
Out[3]:
\(\displaystyle \left(1.81336020089038, 103.897886248014\right)\)

13.3 叉積(cross product):面積與垂直方向¶

對三維向量 u,v,叉積 $u imes v$ 具有:

  • 方向:垂直於 u 與 v 所張成的平面
  • 長度:$\|u \times v\| = \|u\|\|v\|\sin \theta$
  • 幾何意義:平行四邊形面積

Sage:u.cross_product(v)

In [4]:
u = vector([1, 2, -1])
v = vector([3, -1, 4])

uxv = u.cross_product(v)
uxv, uxv.norm(), N(uxv.norm())
Out[4]:
\(\displaystyle \left(\left(7,\,-7,\,-7\right), 7 \, \sqrt{3}, 12.1243556529821\right)\)

面積¶

  • 平行四邊形面積:$\|u\times v\|$
  • 三角形面積:$\frac12\|u\times v\|$
In [5]:
area_par = uxv.norm()
area_tri = area_par/2
area_par, area_tri
Out[5]:
\(\displaystyle \left(7 \, \sqrt{3}, \frac{7}{2} \, \sqrt{3}\right)\)

13.4 混合積(scalar triple product):體積¶

$$ [u,v,w] = u\cdot (v \times w) $$ 其絕對值是由 u,v,w 張成的平行六面體體積。

例:w=(2,1,0)。

In [6]:
u = vector([1, 2, -1])
v = vector([3, -1, 4])
w = vector([2, 1, 0])

triple = u.dot_product(v.cross_product(w))
triple, abs(triple)
Out[6]:
\(\displaystyle \left(7, 7\right)\)

若想要「四面體」體積(由三條邊向量 u,v,w 形成),則是 $|[u,v,w]|/6$。

In [7]:
tetra_vol = abs(triple)/6
tetra_vol
Out[7]:
\(\displaystyle \frac{7}{6}\)

13.5 空間中的直線:參數式(向量式)¶

過點 P,方向向量 d: $ \ell(t)=P+t\,d $

例:P=(1,0,2),d=(2,-1,1)。

In [8]:
var('t')
P = vector([1, 0, 2])
d = vector([2, -1, 1])

line = P + t*d
line
Out[8]:
\(\displaystyle \left(2 \, t + 1,\,-t,\,t + 2\right)\)

可寫成座標形式: $ x=1+2t,\ y=0-t,\ z=2+t $

In [9]:
x_t, y_t, z_t = line[0], line[1], line[2]
x_t, y_t, z_t
Out[9]:
\(\displaystyle \left(2 \, t + 1, -t, t + 2\right)\)

13.6 平面:一般式與參數式¶

(A) 一般式¶

$ Ax+By+Cz+D=0 $ 其中 n=(A,B,C) 是法向量。

(B) 三點決定一平面¶

給三點 A,B,C,令 $ n = (B-A) \times (C-A) $ 即可得到法向量。

例:A=(1,0,0), B=(0,1,0), C=(0,0,1)(坐標軸截距平面)。

In [10]:
A = vector([1, 0, 0])
B = vector([0, 1, 0])
C = vector([0, 0, 1])

n = (B - A).cross_product(C - A)
n
Out[10]:
\(\displaystyle \left(1,\,1,\,1\right)\)
In [11]:
var('x y z')
# 平面方程:n·(X-A)=0
eq_plane_expr = expand(n.dot_product(vector([x, y, z]) - A))
eq_plane_expr
Out[11]:
\(\displaystyle x + y + z - 1\)

這個平面其實是 $x+y+z=1$(可從展開式看出)。

In [12]:
# 驗證:把 (x+y+z-1) 與 eq_plane_expr 比較是否成比例/相等
simplify(eq_plane_expr - (x + y + z - 1))
Out[12]:
\(\displaystyle 0\)

13.7 點到平面距離¶

平面:$Ax+By+Cz+D=0$,點 $P(x_0,y_0,z_0)$: $$ d=\frac{|Ax_0+By_0+Cz_0+D|}{\sqrt{A^2+B^2+C^2}} $$

例:點 P=(2,2,0) 到平面 x+y+z=1 的距離。

In [13]:
P = vector([2, 2, 0])

Acoef, Bcoef, Ccoef, Dcoef = 1, 1, 1, -1  # x+y+z-1=0
dist = abs(Acoef*P[0] + Bcoef*P[1] + Ccoef*P[2] + Dcoef)/sqrt(Acoef^2 + Bcoef^2 + Ccoef^2)
dist, N(dist)
Out[13]:
\(\displaystyle \left(\sqrt{3}, 1.73205080756888\right)\)

垂足(投影點)¶

垂足 H 在平面上,且 PH 與法向量 n 平行。 可寫: $ H = P - \lambda n $ 解 $\lambda$ 使 H 在平面上。

下面對平面 x+y+z=1 做。

In [14]:
var('lam')
nvec = vector([1, 1, 1])
H = P - lam*nvec
eq = H[0] + H[1] + H[2] == 1
lam_val = solve(eq, lam)[0].rhs()
lam_val
Out[14]:
\(\displaystyle 1\)
In [15]:
H_point = H.subs(lam=lam_val)
H_point
Out[15]:
\(\displaystyle \left(1,\,1,\,-1\right)\)
In [16]:
# 驗算 H 在平面上
H_point[0] + H_point[1] + H_point[2]
Out[16]:
\(\displaystyle 1\)

13.8 直線與平面的關係:平行、垂直、交點¶

直線方向 d 與平面法向 n:

  • 直線平行平面:$d\cdot n = 0$
  • 直線垂直平面:d 與 n 平行(叉積=0 或成比例)
  • 求交點:把直線參數式代入平面方程解 t

例:直線 $\ell(t)= (1,0,2)+t(2,-1,1)$ 與平面 x+y+z=1 的交點。

In [17]:
var('t')
P0 = vector([1, 0, 2])
d = vector([2, -1, 1])
X = P0 + t*d

# 代入平面 x+y+z=1
eq = X[0] + X[1] + X[2] == 1
t_sol = solve(eq, t)[0].rhs()
t_sol
Out[17]:
\(\displaystyle -1\)
In [18]:
intersection = X.subs(t=t_sol)
intersection
Out[18]:
\(\displaystyle \left(-1,\,1,\,1\right)\)

13.9 點到直線距離:用叉積(很常用)¶

點 P 到直線(過點 A,方向 d)的距離: $$ d=\frac{\|(P-A) \times d\|}{\|d\|} $$

例:點 P=(2,2,0) 到直線 $\ell(t)=(1,0,2)+t(2,-1,1)$ 的距離。

In [19]:
P = vector([2, 2, 0])
A0 = vector([1, 0, 2])
d = vector([2, -1, 1])

dist = (P - A0).cross_product(d).norm()/d.norm()
dist, N(dist)
Out[19]:
\(\displaystyle \left(\frac{5}{6} \, \sqrt{6} \sqrt{2}, 2.88675134594813\right)\)

(進階直覺)為什麼是叉積?¶

$\|(P-A)\times d\|$ 是由 (P-A) 與 d 張成的平行四邊形面積, 除以底邊 $\|d\|$ 得到高度,也就是最短距離。


13.10 3D 圖形(簡介):畫點、線、平面¶

3D 圖形在不同 Sage/Jupyter 環境呈現方式會略有差異,但概念一致:

  • point3d, line3d, plane(或用 parametric_plot3d)
  • 可以旋轉視角來建立空間直覺

下面示範:畫直線與平面(x+y+z=1),並標出交點。

In [20]:
# 3D 視覺化(若你的環境支援互動 3D,會很有感),可以用滑鼠或手把下方圖形旋轉,放大,縮小
var('t')
P0 = vector([1, 0, 2])
d = vector([2, -1, 1])
X = P0 + t*d

# 直線(取 t 在 [-2,2] 畫線段)
L = parametric_plot3d((X[0], X[1], X[2]), (t, -2, 2))

# 平面 x+y+z=1 可參數化:令 x=s, y=u, z=1-s-u
var('s u')
PL = parametric_plot3d((s, u, 1 - s - u), (s, -1, 2), (u, -1, 2), opacity=0.4)

# 交點
t_sol = solve(X[0] + X[1] + X[2] == 1, t)[0].rhs()
I = X.subs(t=t_sol)
Pnt = point3d((I[0], I[1], I[2]), size=30)

PL + L + Pnt
Out[20]:

13.11 本章小結:用向量工具箱解立體幾何¶

你現在應該能:

  • 建立 3D 向量,算長度、內積、夾角
  • 用叉積算面積、判斷垂直方向
  • 用混合積算體積
  • 用向量式寫直線、用法向量寫平面並由三點求平面
  • 算點到平面距離、點到直線距離,並找交點/投影點
  • 用 3D 圖形輔助理解(若環境支援)

練習題(附提示)¶

  1. 叉積面積:給 u=(1,0,2), v=(2,1,0),求平行四邊形面積與三角形面積。
    提示:u.cross_product(v).norm()。

  2. 平面方程:過 A=(1,1,0), B=(2,0,1), C=(0,2,1) 的平面一般式。
    提示:n=(B-A)×(C-A),再寫 n·(X-A)=0。

  3. 點到平面距離:點 P=(1,0,3) 到平面 2x-y+2z-4=0 的距離。
    提示:距離公式。

  4. 直線與平面交點:直線 (0,1,2)+t(1,1,-1) 與平面 x+y+z=3 的交點。
    提示:代入平面方程解 t。

5.(挑戰)點到直線距離:點 P=(3,0,0) 到直線 (1,1,1)+t(2,-1,0) 的距離。
提示:$\|(P-A)\times d\|/\|d\|$。

下一章(第 14 章)我們會進入「排列組合與機率」:
你會用 Sage 做計數、列舉、模擬(Monte Carlo),把抽象的機率概念變得可操作。