第 3 章 一元方程與聯立方程¶

(適用:台灣高中~大一;目標:把「解題流程」寫成可驗算、可延伸的 Sage notebook)

3.1 本章學習地圖¶

你在高中到大一會遇到的「解方程」大致分成:

  • 一元方程:一次、二次、多項式、高次、含參數
  • 分式/根式方程:容易出現增根,需檢查定義域
  • 聯立方程:二元一次、二元二次、混合(代換、消去)
  • 數值解:無法漂亮因式分解時,用近似法找根

SageMath 能做三件事:

  1. 符號解:solve、solve([..],[..])
  2. 數值解:find_root、nsolve(版本/環境可能不同)
  3. 驗算與篩選:把解代回原方程,檢查條件(定義域、增根)

本章重點:你要會「用 Sage 幫你驗算」,而不是盲信輸出。


3.2 方程的基本輸入方式:==、solve¶

在 Sage 裡,方程一定要用 ==(雙等號)表示。

In [34]:
var('x')
eq = x^2 - 5*x + 6 == 0
eq
Out[34]:
In [35]:
solve(eq, x)
Out[35]:

solve 的輸出通常是「一組解的列表」,每個元素像 x == 2 這樣的等式。

要拿出右邊的值:用 .rhs()(right-hand side)。

In [36]:
sol = solve(x^2 - 5*x + 6 == 0, x)
[r.rhs() for r in sol]
Out[36]:

3.3 一元一次與二次方程:快速模板¶

(A) 一元一次¶

例:解 $3x-7=5$。

In [37]:
var('x')
solve(3*x - 7 == 5, x)
Out[37]:

(B) 二次方程¶

例:解 $2x^2-3x-2=0$,並用 Vieta(韋達)檢查:

  • 根和 = $-\frac{b}{a}$
  • 根積 = $\frac{c}{a}$
In [38]:
var('x')
sol = solve(2*x^2 - 3*x - 2 == 0, x)
roots = [s.rhs() for s in sol]
roots
Out[38]:
In [39]:
# 韋達驗算
a, b, c = 2, -3, -2
sum(roots), -b/a, prod(roots), c/a
Out[39]:

3.4 高次多項式方程:因式分解 + solve¶

高中常見技巧:先把多項式因式分解,再用零乘積性質。

例:解 $x^3-3x^2-x+3=0$。

In [40]:
var('x')
P = x^3 - 3*x^2 - x + 3
factor(P)
Out[40]:
In [41]:
solve(P == 0, x)
Out[41]:

小提醒:solve 不一定給你「完全分解」的漂亮答案¶

有些多項式不可用有理根分解,或分解很複雜。
你可以:

  • 先 factor(P) 看是否有簡單因子
  • 再視情況做數值近似(後面 3.8 節)

3.5 分式方程:定義域 + 增根檢查(非常重要)¶

例題:解 $$ \frac{x+1}{x-1}=2 $$ 定義域:$x\ne 1$

手算:交叉相乘得 $x+1=2x-2 \Rightarrow x=3$,符合定義域。

用 Sage 解並檢查:

In [42]:
var('x')
eq = (x+1)/(x-1) == 2
sol = solve(eq, x)
sol
Out[42]:
In [43]:
# 取出解並檢查是否滿足原式(以及定義域)
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]
Out[43]:

上面那行比較「硬」,因為我們混用了符號與布林判斷。
更通用的做法是:把候選解代回原式,化簡差是否為 0。

In [44]:
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]
Out[44]:

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 做「候選解 + 檢查」。

In [45]:
var('x')
eq = sqrt(x+1) == x-1
sol = solve(eq, x)
sol
Out[45]:
In [46]:
candidates = [s.rhs() for s in sol]
candidates
Out[46]:
In [47]:
# 檢查:定義域 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]
Out[47]:

3.7 聯立方程(兩元):代換、消去、幾何意義¶

(A) 二元一次聯立:用 solve([..],[..])¶

例: $$ \begin{cases} 2x+y=7\\ x-y=1 \end{cases} $$

In [48]:
var('x y')
sol = solve([2*x + y == 7, x - y == 1], [x, y])
sol
Out[48]:

solve 會回傳像 [[x == 8/3, y == 5/3]] 這種結構。
你可以把它當成一個「解的字典」來代回驗算。

In [49]:
solution = sol[0]
solution
Out[49]:
In [50]:
# 代回驗算(兩條方程都應該變成 True)
bool((2*x + y == 7).subs(solution)), bool((x - y == 1).subs(solution))
Out[50]:

(B) 二元非線性聯立:可能有多組解¶

例: $$ \begin{cases} x^2+y^2=5\\ x+y=1 \end{cases} $$ 幾何意義:圓與直線的交點。

In [51]:
var('x y')
sol = solve([x^2 + y^2 == 5, x + y == 1], [x, y])
sol
Out[51]:
In [52]:
# 把解整理成 (x,y) 對
pairs = [(s[0].rhs(), s[1].rhs()) for s in sol]
pairs
Out[52]:

你也可以畫出兩個方程的圖形來理解解的數量(交點數)。

Sage 可以用 implicit_plot 畫隱函數圖(等式型)。

In [53]:
# 注意: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
Out[53]:
No description has been provided for this image

3.8 需要近似解時:find_root(數值解)¶

有些方程沒有好看的符號解,或你只需要近似值(例如工程估算)。

例:解 $ \cos x = x $ 這類「超越方程」通常用數值法。

在 Sage 常用 find_root(f, a, b):在區間 [a,b] 找根。

注意:數值法需要你先提供「夾住根的區間」。
你可以先畫圖或用試算找到合理區間。

In [54]:
var('x')
f = cos(x) - x

# 先畫圖觀察根大概在哪裡
plot(f, (x, 0, 1))
Out[54]:
No description has been provided for this image
In [55]:
# 在 [0,1] 找根
r = find_root(f, 0, 1)
r, N(r)
Out[55]:

數值解也要驗算¶

把近似解代回去,看 $f(r)$ 是否接近 0。

In [56]:
N(f(x=r))
Out[56]:

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 驗算與探索。

In [57]:
var('x a')
P = x^2 - (a+1)*x + a
factor(P)
Out[57]:
In [58]:
solve(P == 0, x)
Out[58]:

接著你可以討論:

  • 當 $a=1$ 時,根重複(重根)
  • 當 $a\ne 1$ 時,兩根不同
    這會連到判別式、函數圖形、甚至微積分中的切線問題。

3.10 本章小結:你應該會的解題工作流¶

你現在應該能做到:

  • 用 solve 解一元方程與二元聯立方程
  • 把 solve 的輸出整理成可代回的形式
  • 面對分式/根式方程時,先寫定義域,再做「代回檢查」避免增根
  • 遇到難方程時,用 plot 找區間,再用 find_root 求近似解並驗算
  • 初步處理含參數方程,並用 factor/simplify 支援條件討論

練習題(附提示)¶

  1. 一元二次:解 $x^2+4x+1=0$,並求兩根的和與積驗算韋達。
    提示:solve,再算 sum(roots)、prod(roots)。

  2. 分式方程(注意定義域):
    解 $\dfrac{2}{x} + \dfrac{1}{x-1} = 1$,並排除不合法的解。
    提示:定義域 $x\ne 0,1$;用「代回檢查」篩選。

  3. 根式方程(可能有增根):
    解 $\sqrt{x+4}=2-\sqrt{x}$。
    提示:先寫定義域(兩個根號內都要 ≥0,且右邊要 ≥0),解出候選後代回。

  4. 聯立方程:
    解

$ \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 章)我們會進入「不等式與絕對值」:
解方程時的「判號」與「分段」會在那裡變得更重要。