第 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 來定義一個函數:

In [1]:
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):函數實際輸出的所有可能值集合。

例如:

  1. $f(x) = x^2$ 若視為實數函數,定義域通常取全體實數 $\mathbb{R}$,值域為 $[0, \infty)$。
  2. $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$:

In [2]:
import sympy as sp
sp.init_printing()

x = sp.symbols('x', real=True)
f = sp.Lambda(x, x**2 + 1)
f
Out[2]:
$\displaystyle \left( x \mapsto x^{2} + 1 \right)$

代入具體數值或符號:

In [3]:
f_2 = f(2)
f_y = f(y := sp.symbols('y'))  # 讓 y 成為另一個符號
f_2, f_y
Out[3]:
$\displaystyle \left( 5, \ y^{2} + 1\right)$

6.4 常見基本函數¶

以下列出幾個常見函數的解析式與簡單性質:

  1. 一次函數:$f(x) = mx + b$,圖形為直線。
  2. 二次函數:$f(x) = ax^2 + bx + c$,圖形為拋物線。
  3. 指數函數:$f(x) = a^x$($a>0, a \ne 1$)。
  4. 對數函數:$f(x) = \log_a x$($a>0, a \ne 1$)。
  5. 三角函數:$f(x) = \sin x, \cos x, \dots$。

我們可以用 SymPy 同時表示這些函數,並在之後繪圖觀察。

In [4]:
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
Out[4]:
$\displaystyle \left( b + m x, \ x^{2} - 2 x - 3, \ e^{x}, \ \log{\left(x \right)}, \ \sin{\left(x \right)}\right)$

6.5 使用 SymPy 繪圖:plot¶

在 Jupyter Notebook 中,sp.plot 可以幫我們快速畫出函數圖形。

例如,畫出 $y = x^2 - 2x - 3$:

In [5]:
sp.plot(x**2 - 2*x - 3, (x, -4, 4), title='y = x^2 - 2x - 3')
No description has been provided for this image
Out[5]:
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0249143a10>

也可以同時畫出多個函數,例如比較 $y = x^2$ 與 $y = x^3$:

In [6]:
sp.plot(x**2, x**3, (x, -2, 2), legend=True, title='y = x^2 and y = x^3')
No description has been provided for this image
Out[6]:
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0246e3a210>

注意:在某些線上環境中,繪圖可能無法顯示或需要額外設定; 如果看不到圖,請嘗試在本機安裝 Jupyter Notebook。

6.6 圖形特徵:截距、頂點、對稱性¶

以二次函數 $f(x) = x^2 - 2x - 3$ 為例,我們可以用 SymPy 找出:

  • 與 $x$ 軸的交點(解方程 $f(x) = 0$)。
  • 與 $y$ 軸的交點(代入 $x=0$)。
  • 拋物線的頂點位置。

6.6.1 與座標軸的交點¶

In [7]:
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
Out[7]:
$\displaystyle \left( \left[ -1, \ 3\right], \ -3\right)$

6.6.2 頂點位置¶

對拋物線 $y = ax^2 + bx + c$,頂點的 $x$ 座標為 $-\dfrac{b}{2a}$。 我們可以讓 SymPy 幫忙計算:

In [8]:
a = 1
b = -2
c = -3

x_vertex = -b / (2*a)
y_vertex = f.subs(x, x_vertex)
x_vertex, y_vertex
Out[8]:
$\displaystyle \left( 1.0, \ -4.0\right)$

這些圖形特徵在解方程、不等式以及應用問題(最大最小值)中都很重要。

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 中可以直接檢查這些關係:

In [9]:
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
Out[9]:
$\displaystyle \left( 0, \ 0\right)$

你可以試著把 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 來表示:

In [10]:
f_piece = sp.Piecewise(
    (x + 1, x < 0),
    (x**2, (x >= 0) & (x <= 2)),
    (3, True)
)
f_piece
Out[10]:
$\displaystyle \begin{cases} x + 1 & \text{for}\: x < 0 \\x^{2} & \text{for}\: x \leq 2 \\3 & \text{otherwise} \end{cases}$

嘗試評估幾個點:

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

也可以畫圖(在支援繪圖的環境下):

In [12]:
sp.plot(f_piece, (x, -3, 5), title='piecewise f(x)')
No description has been provided for this image
Out[12]:
<sympy.plotting.backends.matplotlibbackend.matplotlib.MatplotlibBackend at 0x7f0246ca8a50>

分段函數在稅率制度、交通費率、物理中的力學模型等都非常常見。

6.9 啟發性例子一:位置、速度與函數圖形¶

想像一輛車在直線道路上行駛,其位置(相對某起點)隨時間變化, 位置可以寫成函數:$s = s(t)$。

簡化情形:車以固定速度 20 m/s 直線前進,起始位置為 0, 則 $s(t) = 20t$。

我們可以用 Python 產生幾個時間點的位置:

In [13]:
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 觀察:

In [14]:
q = sp.symbols('q', real=True)
C = 1000 + 50*q
C
Out[14]:
$\displaystyle 50 q + 1000$

計算不同產量下的成本:

In [15]:
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$:

In [16]:
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 中新增儲存格,試著完成以下練習:

  1. 基本函數評估
    (a) 定義函數 $f(x) = x^2 - 4x + 1$,計算 $f(-1), f(0), f(2), f(3)$。
    (b) 嘗試使用 Python 的 def 與 SymPy 的 Lambda 各寫一遍,體會差異。

  2. 定義域與值域(思考題)
    對下列函數,口頭說明其自然定義域與可能的值域(不必完全形式化):
    (a) $g(x) = \dfrac{1}{x^2 - 1}$
    (b) $h(x) = \sqrt{x+2}$
    (c) $k(x) = \log(x)$(自然對數)。

  3. 圖形與截距
    對 $f(x) = x^2 - 4x - 5$:
    (a) 使用 SymPy 解出與 $x$ 軸的交點。
    (b) 計算與 $y$ 軸的交點。
    (c) 使用 sp.plot 繪圖,驗證你的答案與圖形一致。

  4. 奇偶性檢查
    (a) 檢查 $f(x) = x^3 + x$ 是否為奇函數。
    (b) 檢查 $g(x) = x^4 + 1$ 是否為偶函數。
    (c) 對 $h(x) = x^3 + x^2$ 檢查它是奇函數、偶函數,或都不是,並說明理由。

  5. 分段函數
    定義函數:
    $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 觀察其圖形,並用文字解釋這個函數可能代表的情境(例如某種「飽和」效果)。

  6. 應用題:速度-時間圖形(基本版)
    假設某物體的速度為常數 3 m/s:$v(t) = 3$。
    (a) 若起始位置為 0,寫出位置函數 $s(t)$。
    (b) 使用 Python 計算 $t = 0,1,2,3,4,5$ 秒時的位置。
    (c) 試著畫出 $s(t)$ 的圖形,並解釋為什麼是一條直線。

  7. 加分題:簡單學習曲線模型
    考慮函數 $E(n) = 5 \cdot (0.7)^n$,代表第 $n$ 次練習後的錯誤數量(假設一開始錯 5 題)。
    (a) 用程式列出 $n = 0$ 到 $10$ 的 $E(n)$。
    (b) 觀察錯誤數量如何隨練習次數而變化,並用文字寫下你對「學習成效」的直觀理解。
    (c) 思考:若要讓錯誤數量降到 1 以下,大約需要幾次練習?(可以用程式試出來。)

回首頁