第 3 章 一元方程與聯立方程¶
(適用:台灣高中~大一;目標:把「解題流程」寫成可驗算、可延伸的 Sage notebook)
3.1 本章學習地圖¶
你在高中到大一會遇到的「解方程」大致分成:
- 一元方程:一次、二次、多項式、高次、含參數
- 分式/根式方程:容易出現增根,需檢查定義域
- 聯立方程:二元一次、二元二次、混合(代換、消去)
- 數值解:無法漂亮因式分解時,用近似法找根
SageMath 能做三件事:
- 符號解:
solve、solve([..],[..]) - 數值解:
find_root、nsolve(版本/環境可能不同) - 驗算與篩選:把解代回原方程,檢查條件(定義域、增根)
本章重點:你要會「用 Sage 幫你驗算」,而不是盲信輸出。
3.2 方程的基本輸入方式:==、solve¶
在 Sage 裡,方程一定要用 ==(雙等號)表示。
var('x')
eq = x^2 - 5*x + 6 == 0
eq
solve(eq, x)
solve 的輸出通常是「一組解的列表」,每個元素像 x == 2 這樣的等式。
要拿出右邊的值:用 .rhs()(right-hand side)。
sol = solve(x^2 - 5*x + 6 == 0, x)
[r.rhs() for r in sol]
var('x')
solve(3*x - 7 == 5, x)
var('x')
sol = solve(2*x^2 - 3*x - 2 == 0, x)
roots = [s.rhs() for s in sol]
roots
# 韋達驗算
a, b, c = 2, -3, -2
sum(roots), -b/a, prod(roots), c/a
var('x')
P = x^3 - 3*x^2 - x + 3
factor(P)
solve(P == 0, x)
var('x')
eq = (x+1)/(x-1) == 2
sol = solve(eq, x)
sol
# 取出解並檢查是否滿足原式(以及定義域)
candidates = sol
candidates = [sol.rhs() for sol in candidates]
[c for c in candidates
if c != 1 and ((x+1)/(x-1)).subs(x=c) == 2]
上面那行比較「硬」,因為我們混用了符號與布林判斷。
更通用的做法是:把候選解代回原式,化簡差是否為 0。
var('x')
A = (x+1)/(x-1)
B = 2
def check_solution(candidate):
# 回傳:是否符合定義域 + 是否讓 A-B=0
if candidate == 1:
return False
return simplify(A.subs(x=candidate) - B) == 0
[(c, check_solution(c)) for c in candidates]
3.6 根式方程:平方兩邊可能產生增根¶
例題:解 $$ \sqrt{x+1}=x-1 $$ 首先定義域:
- $x+1\ge 0 \Rightarrow x\ge -1$
- 右邊也要 $\ge 0$ 才可能等於左邊:$x-1\ge 0 \Rightarrow x\ge 1$
手算:平方得 $x+1=(x-1)^2=x^2-2x+1$
整理:$x^2-3x=0 \Rightarrow x=0$ 或 $x=3$
但要回去檢查原式:$x=0$ 不符合 $x\ge 1$,所以是增根;只剩 $x=3$。
下面用 Sage 做「候選解 + 檢查」。
var('x')
eq = sqrt(x+1) == x-1
sol = solve(eq, x)
sol
candidates = [s.rhs() for s in sol]
candidates
# 檢查:定義域 x>=1 + 代回原式
def ok_root_eq(c):
if c < 1:
return False
return simplify(sqrt(x+1).subs(x=c) - (x-1).subs(x=c)) == 0
[(c, ok_root_eq(c)) for c in candidates]
var('x y')
sol = solve([2*x + y == 7, x - y == 1], [x, y])
sol
solve 會回傳像 [[x == 8/3, y == 5/3]] 這種結構。
你可以把它當成一個「解的字典」來代回驗算。
solution = sol[0]
solution
# 代回驗算(兩條方程都應該變成 True)
bool((2*x + y == 7).subs(solution)), bool((x - y == 1).subs(solution))
(B) 二元非線性聯立:可能有多組解¶
例: $$ \begin{cases} x^2+y^2=5\\ x+y=1 \end{cases} $$ 幾何意義:圓與直線的交點。
var('x y')
sol = solve([x^2 + y^2 == 5, x + y == 1], [x, y])
sol
# 把解整理成 (x,y) 對
pairs = [(s[0].rhs(), s[1].rhs()) for s in sol]
pairs
你也可以畫出兩個方程的圖形來理解解的數量(交點數)。
Sage 可以用 implicit_plot 畫隱函數圖(等式型)。
# 注意:implicit_plot 在部分環境可能較慢,但概念很重要
var('x y')
p1 = implicit_plot(x^2 + y^2 == 5, (x, -3, 3), (y, -3, 3))
p2 = implicit_plot(x + y == 1, (x, -3, 3), (y, -3, 3))
p1 + p2
3.8 需要近似解時:find_root(數值解)¶
有些方程沒有好看的符號解,或你只需要近似值(例如工程估算)。
例:解 $ \cos x = x $ 這類「超越方程」通常用數值法。
在 Sage 常用 find_root(f, a, b):在區間 [a,b] 找根。
注意:數值法需要你先提供「夾住根的區間」。
你可以先畫圖或用試算找到合理區間。
var('x')
f = cos(x) - x
# 先畫圖觀察根大概在哪裡
plot(f, (x, 0, 1))
# 在 [0,1] 找根
r = find_root(f, 0, 1)
r, N(r)
數值解也要驗算¶
把近似解代回去,看 $f(r)$ 是否接近 0。
N(f(x=r))
3.9 含參數方程:用 solve + 條件討論的起點¶
例:解方程 $$ x^2-(a+1)x+a=0 $$ 並觀察它是否可以因式分解。
手算常見:嘗試寫成 $(x-1)(x-a)$
展開:$x^2-(a+1)x+a$,確實成立,所以根就是 $x=1$ 與 $x=a$。
用 Sage 驗算與探索。
var('x a')
P = x^2 - (a+1)*x + a
factor(P)
solve(P == 0, x)
接著你可以討論:
- 當 $a=1$ 時,根重複(重根)
- 當 $a\ne 1$ 時,兩根不同
這會連到判別式、函數圖形、甚至微積分中的切線問題。
3.10 本章小結:你應該會的解題工作流¶
你現在應該能做到:
- 用
solve解一元方程與二元聯立方程 - 把
solve的輸出整理成可代回的形式 - 面對分式/根式方程時,先寫定義域,再做「代回檢查」避免增根
- 遇到難方程時,用
plot找區間,再用find_root求近似解並驗算 - 初步處理含參數方程,並用
factor/simplify支援條件討論
練習題(附提示)¶
一元二次:解 $x^2+4x+1=0$,並求兩根的和與積驗算韋達。
提示:solve,再算sum(roots)、prod(roots)。分式方程(注意定義域):
解 $\dfrac{2}{x} + \dfrac{1}{x-1} = 1$,並排除不合法的解。
提示:定義域 $x\ne 0,1$;用「代回檢查」篩選。根式方程(可能有增根):
解 $\sqrt{x+4}=2-\sqrt{x}$。
提示:先寫定義域(兩個根號內都要 ≥0,且右邊要 ≥0),解出候選後代回。聯立方程:
解
$
\begin{cases}
x^2-y=1\\
x+y=2
\end{cases}
$
並用 implicit_plot 畫出兩條曲線觀察交點。
5.(挑戰)數值解:
用 find_root 找出 $x^3=2x+2$ 在區間 [1,2] 的根(小數近似),並驗算。
提示:改寫成 $x^3-2x-2=0$。
下一章(第 4 章)我們會進入「不等式與絕對值」:
解方程時的「判號」與「分段」會在那裡變得更重要。