arXiv · 2018 / 2024 重发 · Annotated visualization

微积分,
也需要被重构。

一百年没动过的教法,给学生留了一笔「代码债」:同一件事被拆成了许多不同的流程。Jonathan Bartlett 在这篇 arXiv 论文里提议 —— 把微分换成主角,把极限放到最后,把整门课压成一条路。

作者 Jonathan Bartlett 来源 arxiv.org / readwise 标注 howie.serious 阅读 25 分钟 可视化 李梦溪
01 · 诊断

同一件事 六七种做法

显函数 / 隐函数 / 多元 / 高阶导数 / 链式 / 商式 —— 每种都有自己的「规矩」。学生记的不是方法,是几十种流程。

02 · 提议

让 微分当主角

用 d() 代替 d/dx —— 它对 x、y 一视同仁,把隐函数和显函数的「规矩」压成同一条。把极限挪到课程结尾。

03 · 收益

少记忆,多能力

同一套流程跑遍显函数 / 隐函数 / 多元 / 高阶。学生练一次,几十种情况都通了。

§ 01 · 诊断

学生被迫记住的,不是方法,
是几十种流程。

程序员有一句老话:code debt。新功能不断塞进去,旧的代码不重写, 就出现「同一件事有好几种写法」。今天的大一微积分,就是这样。

before · 现在的教法
if   显函数 y = f(x):  套 $\frac{\mathrm{d}}{\mathrm{d}x}(\cdot)$ 公式
elif 隐函数 xy = 5:    两边求导, y 单独处理
elif 多元 f(x, y, z):三个偏导 ∂/∂x ∂/∂y ∂/∂z
elif 链式 f(g(x)):  复合求导, 链式法则
elif 商式 u/v:      单独的商法则
elif 反函数:        1 / f'(y), 单独记
else:              用极限 lim 硬推
6 条规则 · 学生要背 6 套流程
after · 重构后
def diff(expr):
    # 一个微分算子 d(), 对每个变量一视同仁
    return 乘积律 + 链式律

def derivative(eq, with_respect_to):
    # 第二步: 用普通代数解出 dy/dx
    return solve(diff(eq), dy/dx)
1 条规则 · 显 / 隐 / 多元 / 高阶 全部走同一条路

重构的关键不是发明新东西,是识别:哪些是核心,哪些只是变形。 Bartlett 的答案 —— 微分 d() 是核心,导数 d/dx 只是它的一种比例。

§ 02 · 顺序

先会跑,再学为什么。

几乎所有学科,学生都在直觉之后才遇到证明。孩子先会说话, 再学语法;先会算 3+2,再学加法交换律。微积分不该例外。

现在
极限 → 导数 → 应用
学生还没用到导数解决任何问题,先要理解 $\lim\limits_{x \to 3} x^2 = 9$。 新符号、新规则、新困惑 —— 全为「未来的严谨」买单。 why it fails · 学生在看到问题之前就被符号淹没了
×
提议
斜率直觉 → 导数 → 用熟 → 极限
先用两点间的代数 m = (y₁ − y₀)/(x₁ − x₀) 求斜率,让 h 越来越小; 等学生把导数用熟,再回头说:这一切的严格基础是极限。 why it works · 连续性可以先说成「一笔画完不抬笔」
✓

Bartlett 自己把极限挪到了课程最后。 极限的定义回到「图上的洞」 —— 而不是「代数表达式的精细写法」。

§ 03 · 斜率

两点越靠越近,
斜率越算越准。

在严格的 ε-δ 之前,学生其实可以靠一个 h 参数, 用最普通的代数把「单点斜率」逼出来。

h把两点拉开一点点

y = x² 上的 (1, 1) 和 (1 + h, (1 + h)²)
x y x = 1 x = 1 + h h → 0 时, 割线变切线
两点越靠近, 割线越接近切线。h 只是「还没到零的距离」。

h的代数意义

两点间的斜率 = 2x + h
algebra · 斜率的 h 表达式
\[ m = \frac{(x + h)^2 - x^2}{(x + h) - x} = \frac{2xh + h^2}{h} = 2x + h \]

当 $h \to 0$ 时, $m \to 2x$。这就是 $y = x^2$ 在 $x$ 处的导数。

把 h 算出来之后,「当 h → 0」 就只是代入 h = 0 —— 给出 2x。

h 不是零, 但够近到可以当零用

§ 04 · 两个算子

导数偏心;微分对每颗变量一视同仁。

导数 $\frac{\mathrm{d}}{\mathrm{d}x}$ 必须选一个「自变量」;微分 d() 不挑。 对隐函数 xy = 5 —— 乘积律应该对称,结果 d/dx 让 y 显得很特殊。

算子 · d/dx

显函数 OK,隐函数崩溃

显函数 · d/dx
\[ y = x^3 \;\Rightarrow\; \frac{\mathrm{d}y}{\mathrm{d}x} = 3x^2 \]
隐函数 · d/dx 失对称
\[ xy = 5 \;\Rightarrow\; y + x \cdot \frac{\mathrm{d}y}{\mathrm{d}x} = 0 \]

求 dy/dx 时 y 不是数字,要换成 dy/dx;求 dx/dy 时反过来又换一次。 乘积律不再对称,学生被告知「记住这一条规则」。

算子 · d()

x 和 y 平等处理

显函数 · d()
\[ y = x^3 \;\Rightarrow\; \mathrm{d}y = 3x^2 \cdot \mathrm{d}x \]
隐函数 · d() 恢复对称
\[ xy = 5 \;\Rightarrow\; y\cdot\mathrm{d}x + x\cdot\mathrm{d}y = 0 \]

想要 dy/dx?把等式代数求解就行。所有导数都变成两步: 先微分,再除一下。

这本来就是Leibniz 当年的做法(Bos 1974)—— 原文里 $\mathrm{d}(\cdot)$ 是主角,$\frac{\mathrm{d}y}{\mathrm{d}x}$ 是后来才被人凑出来的比例。

§ 05 · 代数

把微分当代数对象使用。

19 世纪严格派说不行 —— 「无穷小是鬼魂」。 1974 年 Abraham Robinson 用超实数(hyperreals) 把这套操作重新严格化了。从此 $\mathrm{d}(uv) = u\,\mathrm{d}v + v\,\mathrm{d}u$ 可以像乘法分配律那样直接用。

R · 01 · 线性\[ \mathrm{d}(u + v) = \mathrm{d}u + \mathrm{d}v \]
R · 02 · 乘积\[ \mathrm{d}(u \cdot v) = u\,\mathrm{d}v + v\,\mathrm{d}u \]
R · 03 · 商\[ \mathrm{d}\!\left(\frac{u}{v}\right) = \frac{v\,\mathrm{d}u - u\,\mathrm{d}v}{v^2} \]
R · 04 · 复合\[ \mathrm{d}(f \circ g) = f'(g) \cdot \mathrm{d}g \]
「微分 d() 是超实数中的一个值 —— 可以加、减、乘、除、约分,跟普通代数一样操作。」

来源 · Robinson 1974 · Henle & Kleinberg 2003 · Keisler 2012

这意味着 —— 学生不用记「隐函数特殊规则」「链式特殊规则」「商式特殊规则」。 只有四条基本微分律,所有规则都从它们推出来。

§ 06 · 一个写法

d²y/dx² 这个写法,其实不够。

教科书上「照着用就好」的二阶导数记号 $\frac{\mathrm{d}^2 y}{\mathrm{d}x^2}$ —— Bartlett & Khurshudyan 2018 指出它是错误的。 它省略了一项。

教科书版本

二阶导数 = 6x

教科书给的标准答案
\[ \frac{\mathrm{d}^2 y}{\mathrm{d}x^2} = 6x \]

这是几乎所有教材给的答案 —— Bartlett & Khurshudyan 把它称作 「用就好别问」式的传统。

用微分算两遍

完整答案多一项

用微分算两遍
\[ \mathrm{d}(\mathrm{d}y) = \mathrm{d}^2 y, \quad \mathrm{d}(\mathrm{d}x) = \mathrm{d}^2 x \]

对 $y = x^3$ 算两遍:

\[ 6x \cdot \mathrm{d}x^2 \;-\; 3x^2 \cdot \mathrm{d}^2 x \]

只有当 $x$ 是自变量时, $\mathrm{d}^2 x = 0$ 才能消掉。

平时消掉是对的,因为 x 是自变量;但在链式 / 隐函数 / 参数方程里 —— 这一项不能丢,否则 d² 在代数上不可操作。

这不是炫技 —— 这意味着标准写法在很多场合静默丢失了信息。 d²y/dx² 之所以「答案是 6x」,是因为我们偷偷假设了 x 是自变量。

§ 07 · 历史

无穷小被怀疑了几百年。

微分能当代数用,技术上没问题;但数学家有哲学上的洁癖。 从 Berkeley 到 Kronecker 到 Hilbert,每一代都有人拒绝「无穷小」这个概念。

1670s
Leibniz 微分就是主角。他用 d²y/dx² 时,脑子里就是两个微分相除, 没有「无穷小是否合法」的焦虑。
1734
George Berkeley 「已逝量的鬼魂。」 Fluxions(即导数)、evanescent increments(即微分) 既非有限,也非无穷小,也非无 —— 他质问,这种东西到底算什么?
1870s
Kronecker 只承认自然数。反对 Cantor 的超穷理论 —— 任何数学概念都必须能在有限步内从自然数构造出来。
1900s
Hilbert 理想 vs 现实。无穷是理想,自然数是现实。 Hilbert 计划:找到一致的公理集,证明任何真命题而不依赖无穷。
1931
Gödel Hilbert 计划不可行。 不完备定理证明:任何足够强的形式系统,要么不一致,要么不完备。
1974
Abraham Robinson 超实数救场。 把微分重新定义为超实数域里的对象 —— 严谨、合法、可以代数操作。

但怀疑论的传统已经造成了实际损失: 微分被赶到课程角落,导数 d/dx 成了主角,一用就是一百年。 Robinson 的工作本可以让微分早回课堂。

§ 08 · 重构

一个流程,
在更多场景里复用。

Bartlett 的整套提议可以浓缩成一句话 —— 把「同一个算子」从显函数一路推到隐函数 / 多元 / 高阶 / 链式, 让学生练一次,几十种情况都通。

before

if / elif 链

if   显函数:  记一套
elif 隐函数:  再记一套
elif 多元:    再记一套
elif 链式:    再记一套
elif 高阶:    再记一套
elif 反函数:  再记一套
elif 参数方程:再记一套

学生拿到一道题,第一反应是分类 —— 「这属于哪种情况?」然后查表选公式。

after

同一个算子

d(uv) = u·d(v) + v·d(u)        乘积律
d(f∘g) = f'(g)·d(g)           链式律
derivative(eq, x):
    diff(eq) → solve(dy/dx)      微分 + 代数求解

显 / 隐 / 多元 / 高阶 / 链式 / 反函数 —— 全走同一条路。学生拿到一道题,第一反应是动手,不是分类。

这就是「refactoring」的本意 —— 不是发明新东西,是识别核心,把变形收回到一处。

§ 09 · 余响

一百年没动过的教法,
在一篇论文里被提议重构。

曾经被认为「不够严谨」的微分,
被 Robinson 重新严格化了。
曾经被认为「必备前置」的极限,
被建议放到课程最后。
两件事都指向同一个结论 —— 教学上的难,常常不是数学本身的难,
是组织方式的难。

Simplifying and Refactoring Introductory Calculus · Jonathan Bartlett · arXiv:1808.05517 · 2018