跳轉到

10.1 專案一:重做微積分作業#

本節目標#

  • 完整走過 5 道典型微積分題:極限、導數切線、積分面積、極值應用題、旋轉體體積
  • 每題都走固定的四步流程:讀題 → 符號化 → SymPy 求解 → 解讀答案
  • 學會三種答案正確性檢查策略:代入驗證、數值對照、畫圖檢視
  • 反思 CAS 的角色:它是助理,不是代打

專案設定#

先建立一個共用的前置程式碼(之後每題都會用到):

import sympy as sp

x, t = sp.symbols('x t', real=True)
sp.init_printing()   # 讓 Jupyter 輸出漂亮的數學排版

提醒:宣告 real=True 可以避免 SymPy 把 \(x\) 當複數處理, 解方程與化簡時的行為會更貼近微積分課程的預設。


題目 1:極限#

讀題:求 \(\displaystyle\lim_{x \to 0} \frac{\sin(3x)}{x}\) 。

符號化:這是一個 \(x \to 0\) 的極限,函數是 \(\sin(3x)/x\) 。

SymPy 求解:

expr = sp.sin(3*x) / x
L = sp.limit(expr, x, 0)
print(L)   # 3

解讀答案:SymPy 回答 3,與等價無窮小 \(\sin(3x) \approx 3x\) 的直覺一致。

正確性檢查——數值對照:

for h in [0.1, 0.01, 0.001]:
    print(h, float(expr.subs(x, h)))
# 0.1 2.9552...
# 0.01 2.99955...
# 0.001 2.99999...

數值越來越靠近 3,與符號答案吻合。

畫圖檢視:

p = sp.plot(expr, (x, -2, 2), show=False)
p.show()

圖形在 \(x=0\) 附近趨近 \(y=3\) (在 \(x=0\) 處有個可去間斷點)。


題目 2:導數與切線#

讀題:求曲線 \(f(x) = x^3 - 3x + 1\) 在 \(x = 1\) 處的切線方程。

符號化:切線 \(y = f(1) + f'(1)(x - 1)\) 。

SymPy 求解:

f = x**3 - 3*x + 1
fp = sp.diff(f, x)
m = fp.subs(x, 1)        # 斜率 f'(1) = 0
y0 = f.subs(x, 1)        # f(1) = -1
tangent = y0 + m*(x - 1)
print(sp.simplify(tangent))   # -1

解讀答案:切線是 \(y = -1\) ,一條水平線——因為 \(x=1\) 恰好是極值點。

正確性檢查——代入驗證:

# 切線必須通過 (1, f(1))
assert tangent.subs(x, 1) == f.subs(x, 1)
# 切線斜率必須等於 f'(1)
assert sp.diff(tangent, x).subs(x, 1) == fp.subs(x, 1)
print("驗證通過")

兩個條件都通過,答案可信。

畫圖檢視:

p = sp.plot(f, tangent, (x, -2.5, 2.5), show=False)
p[0].line_color = 'blue'
p[1].line_color = 'red'
p.show()

紅色水平線與藍色曲線在極值點相切,視覺確認。


題目 3:定積分與面積#

讀題:求 \(y = x^2\) 與 \(y = x\) 所圍區域的面積。

符號化:兩曲線交於 \(x = 0\) 與 \(x = 1\) ,面積為 \(\displaystyle A = \int_0^1 (x - x^2)\,dx\) 。

SymPy 求解:

pts = sp.solve(x**2 - x, x)          # 交點 [0, 1]
A = sp.integrate(x - x**2, (x, 0, 1))
print(A)   # 1/6

解讀答案:面積是 \(\dfrac{1}{6}\) 。

正確性檢查——兩招並用:

# 招式一:數值對照(SymPy 內建數值積分)
print(A.evalf())                    # 0.16666...
print(sp.N(sp.Integral(x - x**2, (x, 0, 1))))   # 0.16666...

# 招式二:先確認「誰在上面」
print(sp.integrate(x**2 - x, (x, 0, 1)))   # -1/6

如果我們不小心把上下顛倒,積分會給負值——面積問題出現負答案就是警訊。


題目 4:極值應用題#

讀題:用 40 公尺的籬笆靠牆圍一個長方形菜園(牆那一邊不用籬笆),求最大面積。

符號化:設垂直於牆的邊長為 \(x\) ,則平行牆的邊長為 \(40 - 2x\) , 面積 \(A(x) = x(40 - 2x)\) ,定義域 \(0 < x < 20\) 。

SymPy 求解:

A = x*(40 - 2*x)
crit = sp.solve(sp.diff(A, x), x)   # 臨界點
print(crit)                          # [10]
print(A.subs(x, 10))                 # 200

# 二階導數確認是極大
print(sp.diff(A, x, 2).subs(x, 10))  # -4 < 0 → 極大

解讀答案:邊長 \(10 \times 20\) 公尺,最大面積 200 平方公尺。

正確性檢查——數值對照:

import numpy as np
A_num = sp.lambdify(x, A, 'numpy')
xs = np.linspace(0.1, 19.9, 1000)
print(A_num(xs).max())   # 約 200.0

在定義域上取一千個點找最大值,得到的數值極大與符號答案一致。


題目 5:旋轉體體積#

讀題:把 \(y = \sqrt{x}\) 在 \([0, 4]\) 之間的區域繞 \(x\) 軸旋轉,求體積。

符號化:圓盤法, \(\displaystyle V = \pi \int_0^4 (\sqrt{x})^2\,dx = \pi \int_0^4 x\,dx\) 。

SymPy 求解:

V = sp.pi * sp.integrate(sp.sqrt(x)**2, (x, 0, 4))
print(sp.simplify(V))   # 8*pi

解讀答案: \(V = 8\pi \approx 25.13\) 。

正確性檢查——三招全上:

# 1. 手算對照:∫₀⁴ x dx = x²/2 |₀⁴ = 8,乘 π = 8π ✓
# 2. 數值對照
print(V.evalf())   # 25.1327412287183
# 3. 合理性檢查:包住曲線的圓柱體積是 π·r²·h = π·16·2 ≈ 100,
#    旋轉體比它小、比圓錐(π·16·2/3≈33.5)... 等等,圓錐半徑是 2 不是 4。
#    保守檢查:0 < 8π < 圓柱體積 32π ✓
print(float(V.evalf()) < 32*sp.pi.evalf())

量綱與大小範圍的「常識檢查」往往能攔下符號計算的筆誤。


正確性檢查策略總結#

策略 做法 適用時機
代入驗證 把解代回原方程/原條件 方程、切線、極值
數值對照 evalf、lambdify + NumPy 取樣 極限、積分、極值
畫圖檢視 sp.plot 看交點、相切、面積形狀 幾何意義明顯的題目
符號合理性 檢查正負號、量綱、上下界 面積、體積、物理量

鐵律:CAS 給出的答案,至少用一種獨立方法交叉檢查後才寫進作業。


反思:CAS 是助理,不是代打#

用 SymPy 重做作業時,請遵守三條紀律:

  1. 先自己想再問:動手前先在紙上寫下你預期的答案形式與數量級, CAS 的答案偏離預期時,正好是學習的機會。
  2. 看懂每一步的數學:solve 回傳的清單裡哪些是增根? integrate 的結果為什麼帶絕對值?這些判讀能力才是微積分要教你的東西。
  3. 考試沒有 SymPy:練習的目的是建立自己的直覺, CAS 用來驗證與加速,不能用來取代推導。

把 SymPy 想成一位不會累、不會算錯、但也不會替你思考的助教—— 問它問題之前,你得先知道要問什麼。


小結與練習#

本節用五道微積分經典題完整演練了「讀題 → 符號化 → SymPy 求解 → 解讀答案」的 工作流程,並建立了代入驗證、數值對照、畫圖檢視三層檢查網。

練習

  1. 求 \(\displaystyle\lim_{x \to \infty} \left(\sqrt{x^2 + x} - x\right)\) , 先猜答案,再用 limit 驗證,最後用大數值代入對照。
  2. 求曲線 \(y = \ln x\) 在 \(x = 1\) 處的切線,並畫圖確認相切。
  3. 求 \(y = e^{-x}\) 與 \(x\) 軸、 \(y\) 軸在 \([0, 1]\) 圍成的面積, 用 Integral(...).evalf() 做數值交叉檢查。
  4. 一個無蓋方盒由邊長 30 公分的正方形四角剪去小方塊摺成, 用 SymPy 求最大容積的剪角邊長(提示:三次多項式求極值)。
  5. 把 \(y = x^2\) 在 \([0, 1]\) 的區域繞 \(y\) 軸旋轉, 分別用「圓柱殼法」寫出積分式讓 SymPy 計算,並與課本答案對照。