CHAPTER 1
數與運算
所有數學的最底層都是「數」。先把它弄清楚,後面才不會卡。
1.1 數線上的位置
把所有數字想像成一條無窮長的尺。每個數字都對應到尺上的一個點。「比較大」就是「在右邊」。
definition
type Number = "無窮長尺上的某個位置"
// 例如 3 在 0 的右邊三格的位置
1.2 負數 — 尺的另一邊
把尺向左延伸,0 左邊那些位置就是「負數」。負數不是「沒有」,而是「往反方向的某個位置」 — 像欠錢、像往南走、像比海平面低。
examples
let 銀行存款
= 100 // 有 100 元
let 信用卡帳單
= -300 // 欠 300 元
let 海平面
= 0
let 海溝深度
= -10000 // 比海平面低一萬公尺
TRY IT — 兩個數字相加(可以是負的)
a + b = 2
1.3 平方與開方
把一個數乘上自己叫做「平方」。3² = 3·3 = 9。「開方」是反過來:給你 9,問你哪個數平方會得到 9?答案是 3。視覺上,平方就是「拿一條長度 x 的邊,做出一個 x×x 的正方形,看面積多大」。
syntax
function square(x) {
return x
* x
}
function sqrt(y) {
return // 那個平方後等於 y 的數
}
TRY IT — 邊長 x,看正方形面積
邊長 x = 3.0
面積 x² = 9.0
反過來:
√(9.0) = 3.0
CHAPTER 2
函數
函數是「把一個數變成另一個數的規則」。在程式裡你寫 f(x) = ...;在數學裡也是同一個東西。
2.1 函數是一台機器
把函數想像成一台機器。你從左邊塞一個數字 x 進去,機器照規則處理一下,從右邊吐出另一個數字 y。
syntax
function f(x) {
return 2 * x
+ 3 // 規則:乘 2,再加 3
}
f(
0)
= 3
f(
5)
= 13
2.2 線性函數 y = mx + b
最簡單的函數叫「線性」,因為畫出來是一條直線。m 是斜率(線往哪邊斜、斜多陡),b 是截距(線在 y 軸上交在哪)。
general form
y
= m
·x
+ b
// m 越大,線越陡
// m 為負,線往下斜
// b 控制線「上下」位置
TRY IT — 拉滑桿改 m 與 b
y = 1.0·x + 0.0
2.3 二次函數 y = ax² + bx + c
把 x 平方一下,畫出來就不是直線了 — 是一條彎曲的「拋物線」。打籃球的軌跡、噴泉的水柱、丟石頭的曲線,全都是二次函數。
general form
y
= a
·x²
+ b
·x
+ c
// a > 0 開口向上 (碗形)
// a < 0 開口向下 (山形)
// |a| 越大,曲線越窄
CHAPTER 3
座標與向量
從一維的數線升級到二維的平面。每個位置現在需要兩個數字 — 一個橫的、一個直的。
3.1 座標平面
把兩條數線交叉成「十字」,就成了座標平面。任何一個點都能用 (x, y) 兩個數字精確描述。x 是橫的、y 是直的。
type
type Point = [x:
number, y:
number]
const origin
= [
0,
0]
const p
= [
3,
2]
// 往右 3,往上 2
TRY IT — 在格線上點任意位置
點 = (3, 2)
3.2 向量是位移
「點」是位置,「向量」是位移。一個向量 (3, 2) 不代表「(3, 2) 那個點」 — 它代表「往右 3、往上 2 這個動作」。所以你可以從任何起點出發,走這個位移。它有方向、有長度,沒有固定起點。
api
interface Vector {
dx:
number // 橫向位移
dy:
number // 縱向位移
}
length(v)
= sqrt(v.dx²
+ v.dy²)
TRY IT — 拖箭頭尾端
向量 = (4, 3) ・ 長度 = 5.00
3.3 向量加法
把兩個向量加起來 = 「先走第一個位移,再從那邊接著走第二個位移」。在圖上會是一個平行四邊形,兩條對角線就是相加的結果。
rule
[a₁, a₂]
+ [b₁, b₂]
= [a₁
+b₁, a₂
+b₂]
// 例
[
3,
1]
+ [
1,
2]
= [
4,
3]
TRY IT — 拖兩個向量看相加
v₁ + v₂ = (4, 3)
CHAPTER 4
矩陣
把一群數字排成方格 = 矩陣。它是同時處理多個向量的工具,是線性代數的主角。
4.1 矩陣的長相
2×2 的矩陣有四個位置。每一「欄」(直的)代表一個基底向量被搬到哪裡。所以一個矩陣其實在告訴你「世界要怎麼變形」。
structure
M
= [ a b ]
← 第 1 列
[ c d ]
← 第 2 列
↑ ↑
i j ← 兩個基底向量的去向
4.2 矩陣 × 向量
矩陣乘向量的規則:把向量裡的數字當成「對基底各取多少份」。M·v 的結果就是「x 份新 i + y 份新 j」。
formula
[ a b ] [ x ] [ a
·x
+ b
·y ]
[ c d ]
· [ y ]
= [ c
·x
+ d
·y ]
// 第 1 列 dot 向量 = 結果第 1 個
// 第 2 列 dot 向量 = 結果第 2 個
TRY IT — 改 M 與 v,看相乘結果
step 1: 2·4 + 1·2 = 10
step 2: 0·4 + 3·2 = 6
M·v = (10, 6)
4.3 變換的視覺
把 M 想成「整個世界一起被 M 作用」 — 每個點都被搬到 M·點 的新位置。試試下面四個預設變換,看世界怎麼被捏。
TRY IT — 點按鈕看世界變形
M = [1, 0; 0, 1]
CHAPTER 5
行列式
每個方陣都對應到一個數字 — 行列式 (det)。它告訴你三件事:(1)變換把面積放大幾倍,(2)有沒有翻面,(3)矩陣是否可逆。det = 0 代表整個世界被壓扁成一條線,再也回不去。
5.1 一個數字告訴你的事
formula (2×2)
det
[ a b
] = a
·d
- b
·c
[ c d
]
// det > 0 → 面積放大 |det| 倍
// det < 0 → 同上 + 翻面
// det = 0 → 壓成一條線(不可逆)
TRY IT — 看 det 隨矩陣變化
det = 1.00
CHAPTER 6
逆矩陣
如果 M 把世界捏成某個樣子,M⁻¹(讀作「M 的逆」)就是把它捏回去的那個矩陣。M·M⁻¹ = I(單位矩陣,什麼也不做)。但 det = 0 時逆矩陣不存在 — 你不可能把壓扁的麵團還原成立體。
6.1 撤銷一個變換
formula (2×2)
M
= [ a b
] M⁻¹
= 1/det
· [ d
-b
]
[ c d
] [ -c a
]
if (det
== 0)
throw "不可逆"
TRY IT — 看 M 與 M⁻¹ 互相抵消
M⁻¹
[0.6, -0.2; -0.2, 0.4]
M · M⁻¹ =
[1, 0; 0, 1] ← 單位矩陣,剛好還原
CHAPTER 7
特徵向量
絕大多數向量被矩陣作用後,方向都會變。但通常會有幾個「特別的方向」,作用後方向不變,只變長變短。那些方向叫特徵向量,被拉伸的倍數叫特徵值 λ。它們是矩陣的「個性指紋」 — 看到它們就看懂這個矩陣的本質。
7.1 不會被轉歪的方向
definition
M
· v
= λ
· v
// v 是特徵向量、λ 是特徵值
// M 作用 v 之後,方向不變、只是拉伸了 λ 倍
// 純旋轉沒有實數特徵向量(任何方向都會被轉歪)
TRY IT — 紫色就是不會被轉歪的方向
特徵值 λ₁ = 2.00, λ₂ = 1.00
CHAPTER 8
線性方程組
「兩個未知數、兩條方程式」幾何上就是「兩條直線在哪裡相交」。寫成矩陣是 Ax = b,解就是 x = A⁻¹b。整個工程、經濟、AI 都建立在「解線性方程組」之上 — 規模從 2 個未知數到上億個。
8.1 兩條線的交點
system
a₁
·x
+ b₁
·y
= c₁
// 第一條方程式(一條線)
a₂
·x
+ b₂
·y
= c₂
// 第二條方程式(另一條線)
// 寫成矩陣:
[ a₁ b₁
] [ x
] [ c₁
]
[ a₂ b₂
] [ y
] = [ c₂
]
TRY IT — 拉滑桿改方程式,看交點
解:(x, y) = (1.67, 0.67)
CHAPTER 9
三維世界
從 (x, y) 變成 (x, y, z),每個點多一個座標。線性代數的所有東西照樣成立,只是矩陣從 2×2 變 3×3、向量從兩個分量變三個。但「方向」突然多得多 — 旋轉不再只是「轉幾度」,而是「繞哪個軸轉幾度」。
9.1 多一個維度
3d rotation matrices
// 繞 X 軸轉 θ
Rx
= [ 1 0 0 ]
[ 0 cos θ
-sin θ
]
[ 0 sin θ cos θ
]
// 繞 Y、Z 軸的旋轉矩陣形狀類似
CHAPTER 10
4×4 與齊次座標
3×3 旋轉矩陣搬不動原點,所以平移搞不定。圖學界的小聰明:把每個 3D 點偷偷加一個 1,變成 (x, y, z, 1)。這樣矩陣多出來的那一欄就能塞平移量,平移就能跟旋轉、縮放一起用矩陣相乘做完。
10.1 為什麼要 4×4
structure
M
= [ R₁₁ R₁₂ R₁₃
| Tx
] // 藍:旋轉+縮放
[ R₂₁ R₂₂ R₂₃
| Ty
] // 橘:平移
[ R₃₁ R₃₂ R₃₃
| Tz
]
[ 0 0 0 | 1 ] // 灰:齊次列,不會動
TRY IT — 改平移與旋轉,看矩陣對應位置
[...]
CHAPTER 11
鏡頭與投影
3D 場景最後要顯示在 2D 螢幕上。每個頂點要經過三次矩陣相乘:Model(物體在世界裡的位置)→ View(鏡頭在哪、看哪邊)→ Projection(透視投影到螢幕)。整個遊戲、3D 動畫的鏡頭都靠這條 MVP pipeline。
11.1 把 3D 投到螢幕
pipeline
螢幕座標
= P
· V
· M
· 頂點
P
= projection
// 透視(遠的東西看起來小)
V
= view
// 鏡頭位置與朝向
M
= model
// 物體在世界裡的位置
CHAPTER 12
神經網路一層
把第 4 章的「矩陣 × 向量」換個包裝,就是 AI 的核心。每一層神經網路做的事是 y = Wx + b:把輸入向量 x 用權重矩陣 W 變換、加上偏置 b。整個 ChatGPT、Claude、Stable Diffusion 都是上百層這種運算疊起來。
12.1 y = Wx + b
one layer
function forward(x) {
return activate(W
· x
+ b)
}
// W: 權重矩陣(訓練時學出來的)
// b: 偏置向量
// activate: 非線性函數(ReLU / sigmoid 等)
CHAPTER 13
三角函數
把一個半徑 1 的圓放在原點,從 (1, 0) 開始逆時針走 θ 角度,會停在某個點。那個點的 x 座標就是 cos θ,y 座標就是 sin θ。所有跟「角度、旋轉、波」有關的事都從這裡開始。
13.1 sin、cos 與單位圓
definition
const unitCircle = { x: cos θ, y: sin θ }
cos(
0°)
= 1 sin(
0°)
= 0
cos(
90°)
= 0 sin(
90°)
= 1
cos(
180°)
= -1 sin(
180°)
= 0
// 永遠:sin² θ + cos² θ = 1
TRY IT — 拉角度,看單位圓上的點
cos θ = 0.71
sin θ = 0.71
tan θ = 1.00
CHAPTER 14
指數與對數
指數是「重複乘」 — 2³ = 2·2·2 = 8。它增長的速度比線性快得多,是「複利」、「人口爆炸」、「電腦容量」的數學形狀。對數是它的反問題:「2 的幾次方等於 8?」答案是 3,寫作 log₂(8) = 3。
14.1 爆炸性成長
comparison
linear(x)
= 10 · x
// 慢而穩
exponential(x)
= 2^x
// 慢起步、後來爆炸
log(x)
= log₂(x)
// 反過來:先快後慢
// 一張紙對折 42 次的厚度 ≈ 月球距離
TRY IT — 比較線性、指數、對數
線性 = 50
指數 2ˣ = 32
log₂ = 2.32
CHAPTER 15
微積分入門
微積分有兩個主角:微分(某一點的「變化率」 = 切線斜率)和積分(一段範圍下的「累積量」 = 曲線下面積)。AI 的訓練本質就是在做微分 — 算出「我把參數調一點點,誤差會變多少」,然後往對的方向調。
15.1 變化率與面積
two ideas
// 微分:在某一點,函數變化得多快?
f
'(x)
= slope at x
// 積分:從 a 到 b,曲線下總共有多少?
∫f(x) dx
= area under curve
// 兩者互為反運算(微積分基本定理)
TRY IT — 拉 x,看切線斜率與面積
f(x) = x²/2
切線斜率 f'(x) = 2.00
面積 ∫₀ˣ = 1.33
CHAPTER 16
機率
機率把「不確定」量化成 0 到 1 之間的數字。0 = 不可能,1 = 一定發生。期望值是「每次平均能拿到多少」 — 賭博、保險、投資、AI 預測背後都靠這個概念決定行為是否值得。
16.1 期望值
formula
E[X]
= Σ (機率 × 結果)
// 例:擲一顆骰子,期望點數
E
= 1/6·1 + 1/6·2 + 1/6·3 + 1/6·4 + 1/6·5 + 1/6·6 = 3.5
TRY IT — 擲骰子,看實際平均逼近期望值
擲了 0 次
實際平均 = —
期望值 = 3.50