第 12 章 二維向量與直線幾何¶
(適用:台灣高中~大一;目標:用 SageMath 把向量、內積、距離、投影與直線方程串起來,並用圖形驗證幾何直覺)
12.1 本章地圖:你要會的幾件事¶
二維向量與直線幾何常見任務:
- 向量表示、加減、倍乘、長度(模)
- 內積:夾角、垂直判斷、投影
- 點到點距離、點到直線距離
- 直線的多種表示:兩點式、點斜式、一般式、參數式
- 交點、平行、垂直、垂足(投影點)
SageMath 能幫你:
- 快速算向量與內積、解方程找交點
- 用
plot把幾何畫出來(建立直覺與驗算)
本章把「代數」與「幾何」連起來:每個幾何結論都能用計算驗證。
12.2 二維向量的建立:vector¶
在 Sage 裡常用:
vector([a,b])建立向量u + v,u - v,c*uu.norm()或sqrt(u*u)(內積)
先建立兩個向量: $ u=(2,-1),\ v=(-3,4) $
u = vector([2, -1])
v = vector([-3, 4])
u, v, u+v, u-v, 2*u
u_norm = u.norm()
v_norm = v.norm()
u_dot_v = u.dot_product(v)
u_norm, v_norm, u_dot_v
import math
cos_theta = u.dot_product(v)/(u.norm()*v.norm())
theta = arccos(cos_theta)
N(theta), N(theta*180/pi)
注意:arccos 輸出是弧度;乘 180/pi 才是度數。
12.4 投影(projection):把向量「投到」另一個向量方向上¶
向量 u 在 v 上的投影(向量形式): $ \operatorname{proj}_v(u)=\frac{u\cdot v}{v\cdot v}\,v $
(前提:v ≠ 0)
proj_v_u = (u.dot_product(v)/v.dot_product(v))*v
proj_v_u
投影的幾何意義:
- proj_v(u) 與 v 平行
- u - proj_v(u) 與 v 垂直
用內積驗證第二點。
w = u - proj_v_u
w.dot_product(v) # 應該是 0(或非常接近 0)
P = vector([1, 2])
Q = vector([-2, 5])
dist_PQ = (Q - P).norm()
dist_PQ, N(dist_PQ)
var('t')
P = vector([1, 2])
Q = vector([-2, 5])
d = Q - P
P, Q, d
# 參數式:x(t), y(t)
x_t = P[0] + t*d[0]
y_t = P[1] + t*d[1]
x_t, y_t
要轉成一般式:把 t 消去。
方向向量 d=(dx,dy) 的法向量可取 n=(dy,-dx)。
直線過 P,則一般式可寫成:
$
n\cdot (X-P)=0
$
其中 X=(x,y)。
下面用 Sage 做。
var('x y')
dx, dy = d[0], d[1]
n = vector([dy, -dx]) # 一個法向量
eq_line = n.dot_product(vector([x, y]) - P) == 0
eq_line
# 展開成 Ax+By+C=0 的形式
expand(n.dot_product(vector([x, y]) - P))
var('x y')
# L1 一般式(用上一節算到的式子)
L1 = expand(n.dot_product(vector([x, y]) - P)) == 0
# L2:y = x
L2 = y == x
sol = solve([L1, L2], [x, y])
sol
也可以畫出兩條直線看交點是否合理。
(為了簡單,直接用 y=mx+b 形式畫線段。)
# 先把 L1 解成 y = mx + b(若斜率存在)
# 由 L1 解 y
sol_y = solve(L1, y)[0].rhs()
sol_y
p = plot(sol_y, (x, -4, 4)) + plot(x, (x, -4, 4))
# 標出交點
ix = sol[0][0].rhs()
iy = sol[0][1].rhs()
p + point((ix, iy), size=50)
var('x y')
R = vector([2, 0])
# 取 L1 的一般式 Ax+By+C
expr_L1 = expand(n.dot_product(vector([x, y]) - P)) # =0
expr_L1
# 讀出 A,B,C
A = expr_L1.coefficient(x)
B = expr_L1.coefficient(y)
C = expr_L1.subs({x:0, y:0})
A, B, C
x0, y0 = R[0], R[1]
dist = abs(A*x0 + B*y0 + C)/sqrt(A^2 + B^2)
dist, N(dist)
垂足(投影點)也能算:用「沿法向量走到線上」¶
若直線法向量為 n,點 R 到直線的垂足 H 可寫成: $ H = R - \lambda n $ 選 $\lambda$ 讓 H 落在直線上即可。
下面用 Sage 解 $\lambda$。
var('lam')
nvec = vector([A, B]) # 其實就是 n 的比例
H = R - lam*nvec
# H 在 L1 上:A*Hx + B*Hy + C = 0
eq = A*H[0] + B*H[1] + C == 0
sol_lam = solve(eq, lam)[0].rhs()
sol_lam
H_point = H.subs(lam=sol_lam)
H_point
# 驗算 RH 向量是否與直線方向 d 垂直(內積為 0)
RH = H_point - R
RH.dot_product(d)
畫圖看點、直線、垂線與垂足:
var('x')
# L1: y = sol_y
p = plot(sol_y, (x, -4, 4))
p += point((R[0], R[1]), size=50) + point((H_point[0], H_point[1]), size=50)
# 畫出 R 到 H 的線段
p += line([(R[0], R[1]), (H_point[0], H_point[1])])
p
12.9 平行與垂直:方向向量與內積¶
兩條直線:
- 平行:方向向量平行(成比例)
- 垂直:方向向量內積為 0
例:
- L2:y = x,方向向量 (1,1)
- 要找一條過點 (2,0) 且垂直於 L2 的直線
因為 (1,1) 的法向量就是 (1,-1),所以垂直線方向向量可取 (1,-1) 的垂直?
更直接:與 (1,1) 垂直的方向向量可取 (1,-1)(內積 0)。
因此直線參數式: (2,0) + t(1,-1)。
var('t x y')
P0 = vector([2, 0])
d_perp = vector([1, -1])
x_t = P0[0] + t*d_perp[0]
y_t = P0[1] + t*d_perp[1]
x_t, y_t
# 轉成一般式:用法向量 n = (dy, -dx) = (-1, -1)(或任意比例)
n2 = vector([d_perp[1], -d_perp[0]])
eq = expand(n2.dot_product(vector([x, y]) - P0)) == 0
eq
# 解出 y=mx+b 看看
solve(eq, y)[0].rhs()
12.10 本章小結:用向量統一處理幾何¶
你現在應該能:
- 用
vector做加減、倍乘、長度、內積與夾角 - 用投影理解「垂直分解」與點到直線距離
- 以參數式/向量式建立直線,並能轉成一般式
- 解聯立方程找直線交點,並用圖形驗證
- 算點到直線距離與垂足,並驗算垂直性
練習題(附提示)¶
向量與夾角:給 u=(1,2), v=(2,-1),算 u·v、|u|、|v|、夾角(度)。
提示:dot_product、norm()、arccos。投影:把 u=(3,4) 投影到 v=(1,0) 上,解釋結果。
提示:v=(1,0) 是 x 軸方向。直線方程:求過 A=(1,-1)、B=(4,2) 的直線一般式。
提示:方向 d=B-A,法向 n=(dy,-dx)。交點:求直線 y=2x+1 與 x+y=4 的交點,並畫圖驗證。
提示:solve([y==2*x+1, x+y==4],[x,y])。
5.(挑戰)點到直線距離:求點 (1,2) 到直線 3x-4y+5=0 的距離,並找垂足。
提示:距離公式 + 用 H=(x0,y0)-λ(A,B) 解 λ。
下一章(第 13 章)我們會把向量擴展到三維:
空間向量、平面、叉積、距離與立體幾何會變得更系統。