第 6 章 函數基本觀念與圖形¶
本章重點:
- 重新理解「函數」的觀念:從「公式」到「對應關係」。
- 認識定義域(domain)、值域(range/codomain)的意義。
- 用 Python / SymPy 定義函數並計算函數值。
- 使用 SymPy 繪製常見函數圖形(一次、二次、指數、對數、三角)。
- 觀察圖形特徵:截距、單調性、對稱性、奇偶性。
- 以函數圖形來理解實際情境(速度-時間、成本-產量等)。
函數是高中與大學數學的核心概念之一,微積分、機率統計、線性代數都可以用函數的觀點來看待。 本章透過 SymPy 的符號運算與繪圖功能,幫助你建立更具體的函數直覺。
6.1 函數的觀念:從規則到對應¶
在高中課本中,我們常見到:
$y = f(x) = x^2 + 1$。
這可以理解為「輸入一個數 $x$,經過規則 $x \mapsto x^2 + 1$,輸出一個數 $y$。」
在 Python 中,我們可以用 def 來定義一個函數:
def f(x):
return x**2 + 1
print(f(0))
print(f(2))
print(f(-3))
1 5 10
這裡我們暫時把 x 當成「實數」來看待。稍後會用 SymPy 的符號變數來處理函數的解析形式與圖形。
6.2 定義域與值域¶
- 定義域(domain):允許作為輸入的 $x$ 的集合。
- 值域(range):函數實際輸出的所有可能值集合。
例如:
- $f(x) = x^2$ 若視為實數函數,定義域通常取全體實數 $\mathbb{R}$,值域為 $[0, \infty)$。
- $g(x) = \dfrac{1}{x-1}$ 的定義域為 $\mathbb{R} \setminus \{1\}$,因為分母不可為 0。
在 SymPy 中,我們可以利用 sp.Function 或 Lambda 表示函數,
但定義域與值域仍須由我們從數學上判斷(SymPy 目前不會自動幫你全部想完)。
6.3 用 SymPy 定義函數:Lambda¶
SymPy 提供 Lambda 來表示「符號函數」,例如 $f(x) = x^2 + 1$:
import sympy as sp
sp.init_printing()
x = sp.symbols('x', real=True)
f = sp.Lambda(x, x**2 + 1)
f
代入具體數值或符號:
f_2 = f(2)
f_y = f(y := sp.symbols('y')) # 讓 y 成為另一個符號
f_2, f_y
6.4 常見基本函數¶
以下列出幾個常見函數的解析式與簡單性質:
- 一次函數:$f(x) = mx + b$,圖形為直線。
- 二次函數:$f(x) = ax^2 + bx + c$,圖形為拋物線。
- 指數函數:$f(x) = a^x$($a>0, a \ne 1$)。
- 對數函數:$f(x) = \log_a x$($a>0, a \ne 1$)。
- 三角函數:$f(x) = \sin x, \cos x, \dots$。
我們可以用 SymPy 同時表示這些函數,並在之後繪圖觀察。
m, b, a = sp.symbols('m b a')
f_line = m*x + b
f_quad = x**2 - 2*x - 3
f_exp = sp.exp(x) # 以 e 為底的指數函數
f_log = sp.log(x) # 以 e 為底的自然對數
f_sin = sp.sin(x)
f_line, f_quad, f_exp, f_log, f_sin
sp.plot(x**2 - 2*x - 3, (x, -4, 4), title='y = x^2 - 2x - 3')
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0249143a10>
也可以同時畫出多個函數,例如比較 $y = x^2$ 與 $y = x^3$:
sp.plot(x**2, x**3, (x, -2, 2), legend=True, title='y = x^2 and y = x^3')
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0246e3a210>
注意:在某些線上環境中,繪圖可能無法顯示或需要額外設定; 如果看不到圖,請嘗試在本機安裝 Jupyter Notebook。
f = x**2 - 2*x - 3
x_intercepts = sp.solve(sp.Eq(f, 0), x)
y_intercept = f.subs(x, 0)
x_intercepts, y_intercept
6.6.2 頂點位置¶
對拋物線 $y = ax^2 + bx + c$,頂點的 $x$ 座標為 $-\dfrac{b}{2a}$。 我們可以讓 SymPy 幫忙計算:
a = 1
b = -2
c = -3
x_vertex = -b / (2*a)
y_vertex = f.subs(x, x_vertex)
x_vertex, y_vertex
這些圖形特徵在解方程、不等式以及應用問題(最大最小值)中都很重要。
6.7 奇函數與偶函數¶
- 若對所有 $x$,有 $f(-x) = -f(x)$,稱 $f$ 為奇函數,例如 $f(x) = x^3, \sin x$。
- 若對所有 $x$,有 $f(-x) = f(x)$,稱 $f$ 為偶函數,例如 $f(x) = x^2, \cos x$。
在 SymPy 中可以直接檢查這些關係:
f_odd = x**3
f_even = x**2
check_odd = sp.simplify(f_odd.subs(x, -x) + f_odd) # 若為 0 則為奇函數
check_even = sp.simplify(f_even.subs(x, -x) - f_even) # 若為 0 則為偶函數
check_odd, check_even
你可以試著把 f_odd 或 f_even 換成其他函數(例如 $x^3 + x$、$x^4 + 1$),
觀察它們是否為奇/偶函數或都不是。
6.8 分段函數與圖形¶
許多實際情境中的函數是「分段定義」的,例如:
$f(x) = \begin{cases} x+1, & x < 0 \\ x^2, & 0 \le x \le 2 \\ 3, & x > 2 \end{cases}$
可以用 SymPy 的 Piecewise 來表示:
f_piece = sp.Piecewise(
(x + 1, x < 0),
(x**2, (x >= 0) & (x <= 2)),
(3, True)
)
f_piece
嘗試評估幾個點:
for val in [-1, 0, 1, 2, 3]:
print(f"x = {val}, f(x) = {f_piece.subs(x, val)}")
x = -1, f(x) = 0 x = 0, f(x) = 0 x = 1, f(x) = 1 x = 2, f(x) = 4 x = 3, f(x) = 3
也可以畫圖(在支援繪圖的環境下):
sp.plot(f_piece, (x, -3, 5), title='piecewise f(x)')
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0246ca8a50>
分段函數在稅率制度、交通費率、物理中的力學模型等都非常常見。
6.9 啟發性例子一:位置、速度與函數圖形¶
想像一輛車在直線道路上行駛,其位置(相對某起點)隨時間變化, 位置可以寫成函數:$s = s(t)$。
簡化情形:車以固定速度 20 m/s 直線前進,起始位置為 0, 則 $s(t) = 20t$。
我們可以用 Python 產生幾個時間點的位置:
def s(t):
return 20*t
for t in range(0, 6):
print(f"t = {t} 秒, s(t) = {s(t)} 公尺")
t = 0 秒, s(t) = 0 公尺 t = 1 秒, s(t) = 20 公尺 t = 2 秒, s(t) = 40 公尺 t = 3 秒, s(t) = 60 公尺 t = 4 秒, s(t) = 80 公尺 t = 5 秒, s(t) = 100 公尺
若改成加速度固定的情況(例如自由落體),位置函數會變成二次函數, 這些在物理課中常見的模型,其實都是「函數」的不同圖形。
6.10 啟發性例子二:成本與產量¶
在經濟學或管理科學中,我們會用函數描述「產量」與「成本」的關係,
例如:
固定成本 1000 元,每生產一個產品增加變動成本 50 元, 總成本可以寫成:$C(q) = 1000 + 50q$,其中 $q$ 為產量。
用 Python / SymPy 觀察:
q = sp.symbols('q', real=True)
C = 1000 + 50*q
C
計算不同產量下的成本:
for qty in [0, 1, 10, 20]:
print(f"產量 q = {qty}, 成本 C(q) = {C.subs(q, qty)} 元")
產量 q = 0, 成本 C(q) = 1000 元 產量 q = 1, 成本 C(q) = 1050 元 產量 q = 10, 成本 C(q) = 1500 元 產量 q = 20, 成本 C(q) = 2000 元
這個例子顯示函數不僅是抽象數學物件,也可以直接連結到現實中的決策與規劃。
6.11 啟發性例子三:反應時間與學習曲線(簡單模型)¶
心理學與教育領域中,常用函數來描述「練習次數」與「表現」之間的關係, 例如:反應時間會隨練習次數增加而下降,且下降幅度逐漸變小。
一個簡化模型是:
$T(n) = A + B r^n$,其中 $0 < r < 1$。
我們可以用程式模擬,假設 $A=0.2$ 秒(極限反應時間)、$B=0.8$、$r=0.6$:
A = 0.2
B = 0.8
r = 0.6
def T(n):
return A + B*(r**n)
for n in range(0, 11):
print(f"第 {n} 次練習, 反應時間 ≈ {T(n):.4f} 秒")
第 0 次練習, 反應時間 ≈ 1.0000 秒 第 1 次練習, 反應時間 ≈ 0.6800 秒 第 2 次練習, 反應時間 ≈ 0.4880 秒 第 3 次練習, 反應時間 ≈ 0.3728 秒 第 4 次練習, 反應時間 ≈ 0.3037 秒 第 5 次練習, 反應時間 ≈ 0.2622 秒 第 6 次練習, 反應時間 ≈ 0.2373 秒 第 7 次練習, 反應時間 ≈ 0.2224 秒 第 8 次練習, 反應時間 ≈ 0.2134 秒 第 9 次練習, 反應時間 ≈ 0.2081 秒 第 10 次練習, 反應時間 ≈ 0.2048 秒
從輸出可以看到,隨著練習次數增加,反應時間下降並漸漸接近某個下限, 這也是函數圖形中「漸近線」概念的一種應用。
6.12 本章小結¶
本章你學到了:
- 函數是一種「輸入→輸出」的對應關係,而不僅是一條公式。
- 定義域與值域的意義,以及如何在具體例子中判斷。
- 使用 Python 的
def與 SymPy 的Lambda、Piecewise來定義函數。 - 利用
sp.plot繪製常見函數圖形,觀察截距、頂點、奇偶性等特徵。 - 從位置-時間、成本-產量、學習曲線等例子,看到函數在不同領域的應用。
接下來的章節會在這些基礎上,探討函數的平移、伸縮變換以及反函數等更進一步的概念。
6.13 練習題¶
請在本 Notebook 中新增儲存格,試著完成以下練習:
基本函數評估
(a) 定義函數 $f(x) = x^2 - 4x + 1$,計算 $f(-1), f(0), f(2), f(3)$。
(b) 嘗試使用 Python 的def與 SymPy 的Lambda各寫一遍,體會差異。定義域與值域(思考題)
對下列函數,口頭說明其自然定義域與可能的值域(不必完全形式化):
(a) $g(x) = \dfrac{1}{x^2 - 1}$
(b) $h(x) = \sqrt{x+2}$
(c) $k(x) = \log(x)$(自然對數)。圖形與截距
對 $f(x) = x^2 - 4x - 5$:
(a) 使用 SymPy 解出與 $x$ 軸的交點。
(b) 計算與 $y$ 軸的交點。
(c) 使用sp.plot繪圖,驗證你的答案與圖形一致。奇偶性檢查
(a) 檢查 $f(x) = x^3 + x$ 是否為奇函數。
(b) 檢查 $g(x) = x^4 + 1$ 是否為偶函數。
(c) 對 $h(x) = x^3 + x^2$ 檢查它是奇函數、偶函數,或都不是,並說明理由。分段函數
定義函數:
$f(x) = \begin{cases} 0, & x < 0 \\ x, & 0 \le x \le 1 \\ 1, & x > 1 \end{cases}$
(a) 使用Piecewise在 SymPy 中表示這個函數。
(b) 計算 $f(-1), f(0), f(0.5), f(2)$。
(c) 在可行的情況下,用sp.plot觀察其圖形,並用文字解釋這個函數可能代表的情境(例如某種「飽和」效果)。應用題:速度-時間圖形(基本版)
假設某物體的速度為常數 3 m/s:$v(t) = 3$。
(a) 若起始位置為 0,寫出位置函數 $s(t)$。
(b) 使用 Python 計算 $t = 0,1,2,3,4,5$ 秒時的位置。
(c) 試著畫出 $s(t)$ 的圖形,並解釋為什麼是一條直線。加分題:簡單學習曲線模型
考慮函數 $E(n) = 5 \cdot (0.7)^n$,代表第 $n$ 次練習後的錯誤數量(假設一開始錯 5 題)。
(a) 用程式列出 $n = 0$ 到 $10$ 的 $E(n)$。
(b) 觀察錯誤數量如何隨練習次數而變化,並用文字寫下你對「學習成效」的直觀理解。
(c) 思考:若要讓錯誤數量降到 1 以下,大約需要幾次練習?(可以用程式試出來。)