3.2 萊布尼茲的微分記號與導數運算法則(1675 年)#
學習動機#
3.1 節結尾提到:費馬已經有了極值法與切線法,卻缺一樣東西——記號。
他的公式是「掛在某條具體曲線上的」: \(x^{p/q}\) 有自己的規則, \(y^2 = 4ax\) 有自己的公式。每換一個函數,都要重新推一遍。費馬把這套推導寫在紙上,卻沒有把它們壓縮成一個可重複使用的符號系統。
1675 年,萊布尼茲(Gottfried Wilhelm Leibniz, 1646–1716)在手稿中寫下了 \(\mathrm{d}x\) 這個記號。十年後,1684 年他在《學者記事》(Acta Eruditorum)發表《新方法》(Nova Methodus),同年完成、1686 年出版《論符號的分析》(De analysi notarum)——中文教材常把這批論文的核心理念概括為《論極限的意義》:極限不再只是「趨近於無窮小」,而是「無窮小之比」,而記號本身就能告訴我們該怎麼算。
本節要回答:
- \(\mathrm{d}x\) 這個記號到底「記」了什麼?它和 \(\Delta x\) 有什麼不同?
- \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 為什麼會比牛頓的點記號 \(\dot{y}\) 更有生命力?
- 「可攜性」(portability)是什麼意思,為什麼它讓萊布尼茲的記號最終勝出?
- 對數與「反對數」的發明怎麼把指數函數拉進了微積分的舞台?
- 歐拉(Euler)為什麼對這套記號讚不絕口?
而技術上,我們要用 SymPy 把 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 當成物件來操作:sp.Derivative 可以未求值、可以代入、可以延遲求值——這正是萊布尼茲記號「可攜」的現代版。
3.2.1 從 \(\Delta x\) 到 \(\mathrm{d}x\) :一個記號的演化#
要理解 \(\mathrm{d}x\) ,先要看它「取代」了什麼。
希臘人寫 \(\Delta x\) 表示確定的增量(finite increment)——從 \(x\) 到 \(x + \Delta x\) 的距離。費馬的增量論證裡, \(\Delta x\) 是一個真實但可以任意小的量。
萊布尼茲的關鍵改動是:把 \(\Delta x\) 換成 \(\mathrm{d}x\) ,並賦予它一個「差」的意義,但同時允許它作為獨立的符號對象參與運算。在 1675 年 10 月的手稿裡,萊布尼茲寫下:
「由於 \(x\) 與 \(y\) 是變量, \(\mathrm{d}x\) 與 \(\mathrm{d}y\) 就是它們的差(difference);而在運算中, \(\mathrm{d}x\) 與 \(\mathrm{d}y\) 就像數一樣被加、被減、被乘。」
這句話包含了整個設計:
- \(\mathrm{d}x\) 是 \(\Delta x\) (difference)——保留了費馬的增量直覺;
- \(\mathrm{d}x\) 像數一樣可以被運算——這是新的。
我們在 SymPy 裡把這件事做一遍:把 \(\mathrm{d}x\) 當成一個獨立符號,讓它出現在乘法裡:
import sympy as sp
x = sp.Symbol('x', real=True)
# 萊布尼茲的微分記號:dy = f'(x) dx
dx = sp.Symbol('dx', positive=True)
for f in [x**3, sp.sin(x), sp.exp(x), sp.log(x)]:
dy = sp.diff(f, x) * dx
print(f"f(x) = {f} -> dy = {dy}")
print()
# 「dy/dx」作為一個整體:微分符號的「可攜性」
g = sp.Function('g')
print("未求值的導數物件:", sp.Derivative(sp.sin(x), x))
print("求值後:", sp.Derivative(sp.sin(x), x).doit())
print("未求值但可代入:", sp.Derivative(sp.sin(x), x).subs(x, sp.pi/2).doit())
預期輸出:
f(x) = x**3 -> dy = 3*dx*x**2
f(x) = sin(x) -> dy = dx*cos(x)
f(x) = exp(x) -> dy = dx*exp(x)
f(x) = log(x) -> dy = dx/x
未求值的導數物件: Derivative(sin(x), x)
求值後: cos(x)
未求值但可代入: 0
注意 dy 的形式:永遠是「(函數的導數)× \(\mathrm{d}x\) 」。這個「導數 × 微分」的形狀,就是萊布尼茲所謂的一階微分形式(differential form)。它使得 \(u\,\mathrm{d}v\) 這類量有明確意義: \(u\,\mathrm{d}v\) 是「 \(u\) 乘以 \(v\) 的微分」,在幾何上就是以 \(\mathrm{d}v\) 為寬、 \(u\) 為高的「矩形面積」的極限近似——這正是微積分基本定理的種子(見 4.2 節)。
3.2.2 為什麼是分式: \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 的可攜性#
\(\mathrm{d}x\) 與 \(\mathrm{d}y\) 分別是兩個獨立的符號。它們的比值 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 有什麼意義?
答案是:斜率。因為
對任何中間變數 \(t\) 都成立——分子分母同乘同除, \(t\) 就消掉了。這就是鏈鎖法則的「原型」。用分式記號寫出來的鏈鎖法則
看起來幾乎是自動成立的——因為分式可以約分。
這就是「可攜性」:同一個記號,同一套規則,作用在任何函數、任何變數、任何層級上。我們用 SymPy 驗證:鏈鎖法則對抽象函數也成立,也就是說這條規則與 \(u\) 的具體形式完全無關。
import sympy as sp
x = sp.Symbol('x', real=True)
u = sp.Function('u')(x)
v = sp.Function('v')(x)
print("=== 乘積法則: d(uv) = u dv + v du ===")
lhs = sp.diff(u*v, x)
rhs = sp.diff(u, x)*v + u*sp.diff(v, x)
print(" 符號結果 :", lhs)
print(" 手寫展開 :", rhs)
print(" 相等?", sp.simplify(lhs - rhs) == 0)
print()
print("=== 鏈鎖法則: d/dx F(u(x)) = F'(u(x)) * u'(x) ===")
u_sym = sp.Symbol('u')
F = sp.Function('F')
lhs2 = sp.diff(F(u), x)
rhs2 = sp.diff(F(u_sym), u_sym).subs(u_sym, u) * sp.diff(u, x)
print(" 符號結果 :", lhs2)
print(" 萊布尼茲展開 :", rhs2)
print(" 相等?", sp.simplify(lhs2 - rhs2) == 0)
print()
print("=== 商法則: d(u/v) = (v du - u dv) / v^2 ===")
lhs3 = sp.simplify(sp.diff(u/v, x))
rhs3 = sp.simplify((v*sp.diff(u, x) - u*sp.diff(v, x))/v**2)
print(" 符號結果 :", lhs3)
print(" 手寫展開 :", rhs3)
print(" 相等?", sp.simplify(lhs3 - rhs3) == 0)
預期輸出:
=== 乘積法則: d(uv) = u dv + v du ===
符號結果 : u(x)*Derivative(v(x), x) + v(x)*Derivative(u(x), x)
手寫展開 : u(x)*Derivative(v(x), x) + v(x)*Derivative(u(x), x)
相等? True
=== 鏈鎖法則: d/dx F(u(x)) = F'(u(x)) * u'(x) ===
符號結果 : Derivative(F(u(x)), u(x))*Derivative(u(x), x)
萊布尼茲展開 : Derivative(F(u(x)), u(x))*Derivative(u(x), x)
相等? True
=== 商法則: d(u/v) = (v du - u dv) / v^2 ===
符號結果 : (-u(x)*Derivative(v(x), x) + v(x)*Derivative(u(x), x))/v(x)**2
手寫展開 : (-u(x)*Derivative(v(x), x) + v(x)*Derivative(u(x), x))/v(x)**2
相等? True
關鍵觀察:這裡的 \(u\) 與 \(v\) 是未指定的抽象函數(sp.Function('u')(x)), \(F\) 也是抽象函數。SymPy 之所以能證明這三條恆等式,是因為它把導數當成一個符號物件來操作,而不是先求出 \(u\) 、 \(v\) 的具體形式。
這就是可攜性的精確含義:
一條運算法則若對所有函數 \(u, v, F\) 成立,它就不是某一個函數的性質,而是導數運算本身的性質。
牛頓的記號做不到這件事。牛頓用「點」(fluxion)表示時間導數 \(\dot{y}\) ,對時間以外的變數他得另設一套符號;而萊布尼茲的 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 對任何變數都用同一個形式。
3.2.3 對數與「反對數」:把指數函數拉進來#
萊布尼茲的記號還有一項關鍵的歷史貢獻:他發明了對數的現代寫法與「反對數」概念。
Napier(1614)與 Briggs(1625)發明對數時,寫的是一串數字表格,沒有符號。萊布尼茲在 1684–1686 年間做了兩件事:
- 給對數一個記號: \(y = \log_a x\) 表示「以 \(a\) 為底、 \(x\) 為真數的對數」;
- 定義「反對數」(antilogarithm):給定對數值 \(x\) 與底 \(a\) ,求真數 \(a^x\) 。他把 \(a^x\) 這個運算寫成 \(a^x\) ,並指出它與對數互為逆運算。
這件事的深遠影響是:指數函數 \(a^x\) 從此有了和對數對稱的地位。有了 \(\frac{\mathrm{d}}{\mathrm{d}x}\log x = \frac{1}{x}\) 與 \(\frac{\mathrm{d}}{\mathrm{d}x}a^x = a^x \log a\) ,微積分才得以用對數微分法處理冪函數、指數函數、三角函數的乘積——這正是 3.2.4 節的「對數微分法」。
我們用 SymPy 驗證對數與反對數的互逆性,並示範對數微分法:
import sympy as sp
x = sp.Symbol('x', positive=True)
# 萊布尼茲 1675-1684 的「對數」與「反對數」:log 與 exp 互為反函數
print("log(exp(x)) =", sp.simplify(sp.log(sp.exp(x))))
print("exp(log(x)) =", sp.simplify(sp.exp(sp.log(x))))
# 對數微分法:d/dx log(f) = f'/f
f = sp.Function('f')(x)
print()
print("d/dx log(f(x)) =", sp.simplify(sp.diff(sp.log(f), x)))
print("f'(x)/f(x) =", sp.simplify(sp.diff(f, x)/f))
# 具體例子:y = x^3 + 1,用對數微分求 y'
y = x**3 + 1
yp = sp.simplify(sp.diff(y, x))
print()
print("y = x^3 + 1 直接微分 y' =", yp)
# 對數微分法:log y = log(x^3+1) => y'/y = 3x^2/(x^3+1) => y' = y * 3x^2/(x^3+1)
log_deriv = sp.simplify((3*x**2/(x**3 + 1)) * y)
print("對數微分法 y' =", log_deriv)
print("兩者相同?", sp.simplify(yp - log_deriv) == 0)
預期輸出:
log(exp(x)) = x
exp(log(x)) = x
d/dx log(f(x)) = Derivative(f(x), x)/f(x)
f'(x)/f(x) = Derivative(f(x), x)/f(x)
y = x^3 + 1 直接微分 y' = 3*x**2
對數微分法 y' = 3*x**2
兩者相同? True
「對數微分法」在今天已經被 sp.log 與 sp.diff 自動化了,但在 17 世紀它是最重要的技術之一:因為 \(\frac{\mathrm{d}}{\mathrm{d}x} x^{x}\) 、 \(\frac{\mathrm{d}}{\mathrm{d}x} x^{\sin x}\) 這類「指數的指數」,用乘積法則直接做會陷入循環,對數微分法是唯一的出路( \(\log x^x = x \log x\) )。
3.2.4 分式的力量:參數曲線與「變數可換」#
分式記號 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 還有一個後來才發揮出威力的後果:變數的自由更換。
若 \(x = x(t)\) 、 \(y = y(t)\) 是參數曲線,則
這個公式用 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 寫出來時幾乎是「顯而易見」的;用牛頓的點記號寫,則需要專門的符號來表達。讓我們在 SymPy 裡驗證它:
import sympy as sp
t = sp.Symbol('t', real=True)
# 分式的用法:dy/dx = (dy/dt) / (dx/dt)
x_t = sp.Function('x')(t)
y_t = sp.Function('y')(t)
dx_dt = sp.diff(x_t, t)
dy_dt = sp.diff(y_t, t)
print("dx/dt =", dx_dt)
print("dy/dt =", dy_dt)
print("dy/dx = (dy/dt)/(dx/dt) =", sp.simplify(dy_dt / dx_dt))
# 具體例子:擺線 x = a(t - sin t), y = a(1 - cos t)
a = sp.Symbol('a', positive=True)
x = a*(t - sp.sin(t))
y = a*(1 - sp.cos(t))
print()
print("參數曲線:x = a(t - sin t), y = a(1 - cos t)")
dydt = sp.simplify(sp.diff(y, t))
dxdt = sp.simplify(sp.diff(x, t))
print(" dx/dt =", dxdt)
print(" dy/dt =", dydt)
print(" dy/dx =", sp.simplify(sp.trigsimp(dydt / dxdt)))
預期輸出:
dx/dt = Derivative(x(t), t)
dy/dt = Derivative(y(t), t)
dy/dx = (dy/dt)/(dx/dt) = Derivative(y(t), t)/Derivative(x(t), t)
參數曲線:x = a(t - sin t), y = a(1 - cos t)
dx/dt = a*(1 - cos(t))
dy/dt = a*sin(t)
dy/dx = -sin(t)/(cos(t) - 1)
最後一行 \(\frac{\mathrm{d}y}{\mathrm{d}x} = -\frac{\sin t}{\cos t - 1} = \frac{\sin t}{1 - \cos t}\) 是擺線(cycloid)的切線斜率。沒有任何一行需要處理「 \(t\) 是什麼」——變數 \(t\) 消失了。這正是分式記號的可攜性。
3.2.5 與牛頓記號的正面交鋒#
兩套記號的對比值得整理成表:
| 牛頓(1670s) | 萊布尼茲(1675) | |
|---|---|---|
| 基本符號 | \(\dot{x}\) (fluxion,時間導數) | \(\frac{\mathrm{d}y}{\mathrm{d}x}\) |
| 對非時間變數 | 需要另立符號 | 同一形式 \(\frac{\mathrm{d}y}{\mathrm{d}x}\) |
| 二階導數 | \(\ddot{x}\) | \(\frac{\mathrm{d}^2 y}{\mathrm{d}x^2}\) |
| 隱函數 | 困難 | \(\frac{\mathrm{d}y}{\mathrm{d}x} = -\frac{F_x}{F_y}\) |
| 參數曲線 | 困難 | \(\frac{\mathrm{d}y}{\mathrm{d}x} = \frac{\dot{y}}{\dot{x}}\) |
| 微積分基本定理 | 幾乎不可寫 | \(\int y\,\mathrm{d}x\) 自然 |
牛頓的記號在力學裡仍然存活至今( \(\dot{v}\) 、 \(\ddot{x}\) 還是物理系的日常),但在分析學裡被淘汰了。原因正是可攜性:萊布尼茲的記號能寫出 \(\int f(x)\,\mathrm{d}x\) ,牛頓的記號寫不出來。
兩人之間還有一段著名的「優先權之爭」(1698–1713):萊布尼茲的《微分學》(De analysi)與《新方法》出版後,皇家學會的評審委員會(包括牛頓本人)發表匿名評論,萊布尼茲於是指控牛頓抄襲;牛頓的《微積分學》(Method of Fluxions, 1737,1712 年寫成)公開後,爭議達到頂點。萊布尼茲 1716 年過世,1727 年牛頓過世,兩人在 18 世紀結束前都未曾和解。
歷史上這場爭議是科學史上最早也最不理性的「優先權大戰」之一。今天全世界的數學系都使用萊布尼茲的記號——這本身就是一個關於「哪套記號更強」的經驗證據。
我們用 SymPy 把兩套記號並排展示:
import sympy as sp
x, t = sp.symbols('x t', real=True)
dt = sp.Symbol('dt', positive=True)
# 萊布尼茲把「微分」當成一個可攜的運算子:dx 可以是任何變數
s = sp.Function('s')(t) # 位置 s(t)
v = sp.Function('v')(t) # 速度 v(t) = s'(t)
a = sp.Function('a')(t) # 加速度 a(t) = v'(t)
ds = sp.diff(s, t)*dt
dv = sp.diff(v, t)*dt
da = sp.diff(a, t)*dt
print("ds =", ds)
print("dv =", dv)
print("da =", da)
print()
print("萊布尼茲的「微分算子」: d/dt 作用一次,dt 就換成 dt")
print(" d/dt s(t) =", sp.diff(s, t))
print(" d/dt v(t) =", sp.diff(v, t))
print(" d/dt a(t) =", sp.diff(a, t))
# 牛頓的記號:用點表示對時間的微分
print()
print("牛頓的點記號 vs 萊布尼茲的分式記號")
print(" 牛頓: s, v, a (即 ṡ, v̇, ä)")
print(" 萊布尼茲: ds/dt =", sp.diff(s, t), " dv/dt =", sp.diff(v, t))
# 具體運動:s(t) = t^3 - 6t^2 + 9t
st = t**3 - 6*t**2 + 9*t
print()
print("s(t) = t^3 - 6t^2 + 9t")
print(" ds/dt =", sp.expand(sp.diff(st, t)))
print(" d^2s/dt^2 =", sp.expand(sp.diff(st, t, 2)))
print(" d^3s/dt^3 =", sp.expand(sp.diff(st, t, 3)))
print(" ds/dt 寫成分式形式 dy/dx 的樣子:", sp.diff(st, t))
預期輸出:
ds = dt*Derivative(s(t), t)
dv = dt*Derivative(v(t), t)
da = dt*Derivative(a(t), t)
萊布尼茲的「微分算子」: d/dt 作用一次,dt 就換成 dt
d/dt s(t) = Derivative(s(t), t)
d/dt v(t) = Derivative(v(t), t)
d/dt a(t) = Derivative(a(t), t)
牛頓的點記號 vs 萊布尼茲的分式記號
牛頓: s, v, a (即 ṡ, v̇, ä)
萊布尼茲: ds/dt = Derivative(s(t), t) dv/dt = Derivative(v(t), t)
s(t) = t^3 - 6t^2 + 9t
ds/dt = 3*t**2 - 12*t + 9
d^2s/dt^2 = 6*t - 12
d^3s/dt^3 = 6
ds/dt 寫成分式形式 dy/dx 的樣子: 3*t**2 - 12*t + 9
3.2.6 歐拉的評價:記號即思想#
萊布尼茲在 1684–1686 年之後就沒有再對微積分做出重大貢獻。真正把它推廣到整個歐洲的,是歐拉(Leonhard Euler, 1707–1783)。
歐拉在 1736 年給萊布尼茲的信中稱讚這套記號,說它「 使得每個人都能輕鬆地推導出微積分的定理」。在《微分計算的基礎》(Institutiones calculi differentialis, 1768)與《導論》(Introductio in analysin infinitorum, 1748)中,歐拉不僅沿用萊布尼茲的 \(\mathrm{d}\) 記號,還做了一件關鍵的事:**從它衍生出偏導數的記號 \(\partial\) **(部分導數符號)。
\(\partial\) 是 \(\mathrm{d}\) 的「花體」,它的出現理由和 \(\mathrm{d}y/\mathrm{d}x\) 一模一樣:當 \(z = z(x, y)\) 時, \(\frac{\mathrm{d}z}{\mathrm{d}x}\) 會誤導人以為 \(z\) 只是 \(x\) 的函數,於是改用
這個小改動是第 7 章(多變量微積分)的伏筆。
歐拉還把萊布尼茲的「微分」提升為微分方程的語言: \(\frac{\mathrm{d}y}{\mathrm{d}x} = f(x, y)\) 就是今天初等微分方程教科書的標準形式。歐拉在《導論》中寫道, \(\frac{\mathrm{d}y}{\mathrm{d}x}\) 這個記號「比任何其他方法都更適合於分析」。
總結歐拉的貢獻:
- 把 \(\mathrm{d}\) 記號推廣到偏導數 \(\partial\) ;
- 建立微分方程的標準表述;
- 把「 \(\mathrm{d}y/\mathrm{d}x\) 可以是變數」的觀念發揚光大,導出對數導數 \(\frac{y'}{y}\) (今天 SymPy 的
log(f).diff(x)正是這個)。
3.2.7 記號的工程學:SymPy 裡的 Derivative#
我們在 SymPy 裡正式地把 \(\frac{\mathrm{d}}{\mathrm{d}x}\) 當作一個運算子來對待。sp.Derivative(expr, x, evaluate=False) 建立一個「還沒算」的導數物件;它可以代入、可以呼叫 .doit() 求解值、可以再微分。
import sympy as sp
x = sp.Symbol('x', real=True)
f = sp.Function('f')
# SymPy 的 diff 核心:把 f'(x) 視為一個「物件」,可代入、可化簡、可延遲求值
expr = sp.Derivative(f(x)**2 + sp.sin(x), x, evaluate=False)
print("未求值:", expr)
print("求值:", expr.doit())
print("代入 x = 0:", expr.doit().subs(x, 0))
# 帶參數的函數:鏈鎖法則的自動套用
a, b = sp.symbols('a b', real=True)
g = sp.Function('g')
expr2 = sp.Derivative(g(a*x + b), x)
print()
print("g(ax+b) 對 x 微分:", expr2.doit())
# 二階偏導數:Derivative 支援多個變數
u, v = sp.symbols('u v', real=True)
H = sp.Function('H')
d2 = sp.Derivative(H(u, v), u, 2)
print()
print("d^2/du^2 H(u,v) =", d2.doit())
# 實際的多變數微分(SymPy 內建偏導數)
expr3 = sp.diff(sp.exp(u*v), u, v)
print("d^2/du dv exp(uv) =", expr3)
預期輸出:
未求值: Derivative(f(x)**2 + sin(x), x)
求值: 2*f(x)*Derivative(f(x), x) + cos(x)
代入 x = 0: 2*f(0)*Subs(Derivative(f(x), x), x, 0) + 1
g(ax+b) 對 x 微分: a*Subs(Derivative(g(_xi_1), _xi_1), _xi_1, a*x + b)
d^2/du^2 H(u,v) = Derivative(H(u, v), (u, 2))
d^2/du dv exp(uv) = (u*v + 1)*exp(u*v)
注意 g(ax+b) 對 \(x\) 微分的結果裡出現的 Subs(Derivative(g(_xi_1), _xi_1), _xi_1, a*x + b):SymPy 引入了一個啞變數 xi_1,把「 \(g\) 在 \(a x + b\) 處的導數」這個函數值當成整體來搬運。這正是歐拉「微分可以整體替換」的想法——變數 \(t\) 不重要,重要的是「 \(t\) 處的導數」這個量。
習題#
習題 3.2.1(記號的翻譯) 把下列牛頓式寫法翻譯成萊布尼茲記號,並用 SymPy 驗證:
(a) \(\dot{y} = f(t)\) 且 \(y = \int f(t)\,\mathrm{d}t\) (注意這裡暗示了積分的存在); (b) 運動 \(s = s(t)\) 中,「加速度是速度對時間的導數」; (c) 「 \(\ddot{y}\) 與 \(y\) 對 \(t\) 的二階導數成正比」。
提示:用 sp.Function('y')(t) 與 sp.diff(expr, t, 2)。
習題 3.2.2(可攜性的力量) 用 SymPy 證明下列抽象函數恆等式(要求 u、v、w 都是未指定的函數):
(a) \((uv)' = u'v + uv'\) ; (b) \(\left(\frac{u}{v}\right)' = \frac{v u' - u v'}{v^2}\) ; (c) \((uvw)' = u'vw + uv'w + uvw'\) ; (d) \(\frac{\mathrm{d}}{\mathrm{d}x}F(u) = F'(u) u'\) ,其中 \(F\) 與 \(u\) 都是抽象函數。
習題 3.2.3(對數微分法) 用對數微分法(先取對數再微分)求出下列函數的導數,並用 sp.diff 交叉驗證:
(a) \(y = x^{x}\) ; (b) \(y = x^{x^{2}}\) ; (c) \(y = (\sin x)^{x}\) 。
並解釋:為什麼 (a)、(b) 這類「指數的指數」用乘積法則會陷入循環?
習題 3.2.4( \(\partial\) 的由來) 歐拉從 \(\mathrm{d}\) 衍生出 \(\partial\) 是為了區分「全導數」與「偏導數」。請:
(a) 對 \(z = x^2 y + \sin(xy)\) ,用 SymPy 分別計算 \(\frac{\mathrm{d}z}{\mathrm{d}x}\) (把 \(y\) 當 \(x\) 的函數 \(y(x)\) )與 \(\frac{\partial z}{\partial x}\) ( \(y\) 固定); (b) 說明兩者為什麼不同; (c) 找出使兩者相同的條件(提示: \(y\) 與 \(x\) 無關)。
習題 3.2.5(可攜性的極致:變數替換) 設 \(u = x^2\) , \(v = u^2 + 1\) 。請分別用
(a) 鏈鎖法則( \((v(u(x)))' = v'(u(x)) u'(x)\) ); (b) 先把 \(v\) 展開成 \(x\) 的多項式再直接微分;
兩種方式計算 \(\frac{\mathrm{d}v}{\mathrm{d}x}\) ,並說明兩者相等的記號理由。這就是「 \(t\) 消掉了」的意思。
小結#
| 記號 | 誰發明 | 年份 | 意義 |
|---|---|---|---|
| \(\Delta x\) | 希臘—費馬傳統 | 17 世紀前 | 確定的增量 |
| \(\mathrm{d}x\) | 萊布尼茲 | 1675 | 「差」,但可獨立參與運算 |
| \(\frac{\mathrm{d}y}{\mathrm{d}x}\) | 萊布尼茲 | 1675 | 斜率;可攜的分式 |
| \(\mathrm{d}^2 y/\mathrm{d}x^2\) | 萊布尼茲 | 1684 | 高階導數 |
| \(\partial z/\partial x\) | 歐拉 | 1768 | 偏導數(多變量) |
| \(\dot{y}\) | 牛頓 | 1670s | 時間導數(流數法) |
- 可攜性是萊布尼茲記號勝出的根本原因:同一套規則作用在任意函數上(SymPy 用抽象函數
sp.Function('u')(x)就能證明)。 - 分式的形式讓變數自由更換成為自動的事: \(\frac{\mathrm{d}y}{\mathrm{d}x} = \frac{\mathrm{d}y/\mathrm{d}t}{\mathrm{d}x/\mathrm{d}t}\) 。
- 對數與「反對數」的發明,把 \(a^x\) 拉進了微積分,使對數微分法成為處理冪指數函數的標準手段。
- SymPy 的
sp.Derivative正是「微分算子」在程式語言中的實現:可建立、可代入、可延遲求值。
下一節,我們要做一件聽起來很簡單、其實很深刻的事:**用 SymPy 從導數的定義出發,重新推導出 \(\frac{\mathrm{d}}{\mathrm{d}x}x^n\) 、 \(\frac{\mathrm{d}}{\mathrm{d}x}\sin x\) 、 \(\frac{\mathrm{d}}{\mathrm{d}x}e^x\) **,並把差分近似與符號結果放在一起比較。