第 12 章 二維向量與直線幾何¶

本章重點:

  • 從「位移」、「箭頭」的角度理解平面向量。
  • 向量的加法、數量倍與幾何意義。
  • 內積的代數與幾何意義(夾角、投影)。
  • 在平面上用向量描述直線:點向式、參數式、一般式等。
  • 使用 SymPy 做向量運算、判斷平行/垂直、求距離與交點。

本章把高中常見的「座標幾何」改用向量語言統一整理, 並利用 Python / SymPy 幫你做計算與驗證,是連結線性代數的第一步。

12.1 二維向量的基本觀念¶

在平面上,一個向量可以想成「有方向的位移」:

  • 既有長度(大小),也有方向。
  • 通常寫成 $\vec{v} = (v_1, v_2)$ 或列向量、行向量形式。

例如:

  • $(3, 1)$ 可以理解為「向右 3、向上 1 的位移」。
  • $(-2, 0)$ 是向左 2 的位移。

在 SymPy 中,可以使用 Matrix 或 ImmutableMatrix 來表示向量:

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

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

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 中,直接用 + 與 * 即可:

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

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 中,我們可以這樣計算:

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

你可以試著計算 unit_v 的長度,應該等於 1:

In [4]:
unit_v.norm()
Out[4]:
$\displaystyle 1$

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 方法計算內積:

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

若要計算夾角,可以用:

$$\cos \theta = \frac{\vec{v} \cdot \vec{w}}{\|\vec{v}\|\,\|\vec{w}\|}.$$

In [6]:
theta = sp.acos(dot_vw / (v.norm()*w.norm()))
theta_simplified = sp.simplify(theta)
theta_simplified
Out[6]:
$\displaystyle \operatorname{acos}{\left(\frac{11 \sqrt{5}}{25} \right)}$

你可以再用 sp.N(theta_simplified, 5) 看數值近似(弧度)。

In [7]:
sp.N(theta_simplified, 5)
Out[7]:
$\displaystyle 0.17985$

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

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

這表示當 $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)$,求其方程式。

In [9]:
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)
Out[9]:
$\displaystyle 2 x + y = 5$

我們可以把它展開成一般式 $ax+by+c=0$ 的樣子:

In [10]:
sp.expand(line_eq.lhs)
Out[10]:
$\displaystyle 2 x + y - 5$

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:

In [11]:
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
Out[11]:
$\displaystyle \left( 0, \ 0\right)$

這裡 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 中,我們可以寫一個小函數來計算:

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

12.9 兩直線交點:聯立方程與向量觀點¶

兩條直線若不平行,會有唯一交點,可透過聯立方程求解。

例:

$$\begin{cases} 2x + y - 5 = 0 \\ -x + 3y - 4 = 0 \end{cases}$$

用 SymPy 解:

In [13]:
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
Out[13]:
$\displaystyle \left\{ x : \frac{11}{7}, \ y : \frac{13}{7}\right\}$

你可以把結果視為兩條直線的交點座標。

向量觀點下,也可以把這問題視為求兩個參數式直線的交點,不過在實作上聯立方程通常較方便。

12.10 啟發性例子一:位移與淨效果¶

想像你在平面上移動:

  1. 先向右 3 單位、向上 1 單位 → 向量 $(3,1)$。
  2. 再向左 2 單位、向上 4 單位 → 向量 $(-2,4)$。

總位移是兩向量相加:$(3,1) + (-2,4) = (1,5)$。

用 Python / SymPy 可以這樣模擬:

In [14]:
v1 = sp.Matrix([3, 1])
v2 = sp.Matrix([-2, 4])
total_displacement = v1 + v2
v1, v2, total_displacement
Out[14]:
$\displaystyle \left( \left[\begin{matrix}3\\1\end{matrix}\right], \ \left[\begin{matrix}-2\\4\end{matrix}\right], \ \left[\begin{matrix}1\\5\end{matrix}\right]\right)$

這表示,無論你實際路線多彎曲,只要總位移向量是 $(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 計算功:

In [15]:
F_vec = sp.Matrix([10, 0])
d_vec = sp.Matrix([3, 4])
W = F_vec.dot(d_vec)
W
Out[15]:
$\displaystyle 30$

此處 $W = 30$,可以理解為力在位移方向上的投影長度乘上位移大小。

若力改成垂直方向,例如 $\vec{F'} = (0,10)$,則:

In [16]:
F2_vec = sp.Matrix([0, 10])
W2 = F2_vec.dot(d_vec)
W2
Out[16]:
$\displaystyle 40$

得到 0,表示力與位移垂直,不做功。

12.12 啟發性例子三:資料點最佳擬合線的向量觀點(概念性)¶

在統計和資料科學中,我們常常要用一條直線來近似多個資料點, 例如線性回歸(linear regression)。

雖然完整理論需要線性代數與最小平方法,但在二維情況下, 可以直觀地理解為:

  • 資料點 $(x_i, y_i)$ 提供了一堆「位置向量」。
  • 我們想找一條直線,使得垂直距離的平方和最小。

距離計算會用到「點到直線距離公式」, 而把這些距離平方加總再最小化,背後就是內積與向量長度的概念。

這個例子主要是提醒:

  • 你現在學的向量與直線幾何,將來會出現在資料分析與機器學習中。

12.13 本章小結¶

本章你學到了:

  • 二維向量可以視為「平面上的位移」,用座標 $(v_1, v_2)$ 表示。
  • 向量加法與數量倍的幾何意義與 SymPy 實作方式。
  • 內積的代數與幾何詮釋(夾角、投影),及用內積判斷垂直。
  • 使用向量描述直線:點向式/參數式以及一般式 $ax+by+c=0$, 並理解法向量與方向向量的角色。
  • 利用向量工具判斷直線平行與垂直、計算點到直線距離與兩線交點。
  • 一些實際情境:位移的淨效果、力與位移做功、資料擬合的直線幾何直觀。

12.14 練習題¶

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

  1. 基本向量運算
    令 $\vec{v} = (2, -1)$,$\vec{w} = (-3, 4)$。
    (a) 計算 $\vec{v} + \vec{w}$ 與 $2\vec{v} - \vec{w}$。
    (b) 用 SymPy 檢查你的手算結果。

  2. 長度與單位向量
    (a) 求 $\vec{u} = (1, \sqrt{3})$ 的長度。
    (b) 求與 $\vec{u}$ 同方向的單位向量。
    (c) 用 SymPy 計算其長度,確認為 1。

  3. 內積與夾角
    令 $\vec{a} = (1,2)$,$\vec{b} = (2,-1)$。
    (a) 手算 $\vec{a} \cdot \vec{b}$。
    (b) 用內積公式與向量長度計算兩向量夾角 $\theta$ 的餘弦值,並用 SymPy 求其數值近似。
    (c) 判斷兩向量是否銳角、鈍角或正交。

  4. 直線的向量式與一般式
    考慮通過點 $(1,2)$ 且方向向量為 $(2,3)$ 的直線。
    (a) 寫出其參數式(向量式)。
    (b) 求其法向量,並寫成一般式 $ax+by+c=0$。
    (c) 使用 SymPy 檢查某點(例如 $(3,5)$)是否在此直線上(代入方程)。

  5. 平行與垂直
    (a) 判斷直線 $L_1: x - 2y + 1 = 0$ 與 $L_2: 2x - 4y - 3 = 0$ 是否平行或重合。
    (b) 找出一條與 $L_1$ 垂直且通過原點的直線方程式。
    (c) 用 SymPy 畫出這些直線(若環境支援)以輔助理解。

  6. 點到直線距離
    (a) 使用公式計算點 $(1,2)$ 到直線 $3x + 4y - 10 = 0$ 的距離。
    (b) 用你在本章寫的 distance_point_to_line 函數檢查結果。

  7. 應用題:力與位移作功
    假設一個力 $\vec{F} = (5, 12)$ 作用在物體上,物體的位移為 $\vec{d} = (3, 4)$。
    (a) 計算此力所做的功 $W = \vec{F} \cdot \vec{d}$。
    (b) 計算力的大小和位移的大小,以及兩者的夾角。
    (c) 用文字說明:如果夾角變大(例如換成另一個位移向量),功會如何改變?

  8. 加分題:兩直線交點與向量幾何
    直線 $L_1$ 通過 $(0,1)$,方向向量為 $(1,1)$;直線 $L_2$ 通過 $(2,0)$,方向向量為 $(-1,2)$。
    (a) 寫出兩條直線的參數式。
    (b) 利用 SymPy 把兩個參數式改寫成聯立方程,解出交點座標。
    (c) 嘗試在紙上畫出這兩條線及交點,並用幾何直覺檢查你的答案是否合理。

回首頁