假设你是一位山岳公园的修路队长,要把两个观景台用一条栈道连起来。普通的数学题是“找到一个数 x 让函数 f(x) 最大”;但修路时,你要在成千上万条可能的路线里选出一整条曲线,让总成本最低。变分法就是研究“怎样选一整条线”的数学。它把一个候选路线送进一个费用函数,得到一个数;当这个数再也无法通过任何微小改路而下降,这条路就是最优候选。这个“最优路”必须满足一条逐点的平衡条件,也就是后文会一步步推出的欧拉-拉格朗日方程。

岗位关联

对 AI 从业者来说,这相当于练成了从连续目标中推导最优性的内功:看透最优控制、物理仿真和机器学习正则化背后的同一套数学语言。

目录
  1. 可视化演示
  2. 1 泛函与极值
  3. 2 变分思想
  4. 3 欧拉方程
  5. 4 边界条件
  6. 5 经典问题
  7. 6 物理应用
  8. 7 现代应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示泛函极值多曲线对比与最优路径、最速降线摆线与直线弧线时间对比、欧拉拉格朗日方程从变分到极值的推导流程。切换模式查看变分法核心概念。

本节配有交互动效(进入视口后自动加载,约 3KB)。

泛函极值:在所有可能曲线中寻找使J最小的路径 泛函J[y]将函数映射为实数求其极值 最优曲线y*使泛函J取极小值 J[y] = ∫ F(x, y, yprime) dx → min 变分法研究泛函极值与微积分求函数极值不同

1 泛函与极值

假设你负责在山区修一条观光栈道。两个观景台的位置已经定死,但中间怎么走、拐几个弯,全都可以自由设计。路线一旦画出来,你就能估算出它的造价、施工难度和游客体验。这里的“路线”是一条完整曲线,而“造价”是由这条曲线算出来的一个数字。数学上,把曲线 \(y(x)\) 变成数字 \(J[y]\) 的工具,就叫泛函。普通函数吃一个数、吐一个数;泛函吃一整条函数曲线、吐一个数。

变分法关心的不是“函数在哪一点最大”,而是“哪一条函数能让泛函取极值”。比如修栈道时,路线稍微绕远一点,造价就上升;再直一点,可能又太陡。我们要找的是整条曲线层面的“最低点”,而不是二维坐标轴上的某个点。所有候选曲线必须满足两端固定、连续光滑等约束,这些约束合起来叫做容许函数类。

最常见的泛函长这样:

所以,修路队长要回答的问题变成了:在无数条候选路线中,哪一条能让 \(J[y]\) 达到极小?这就是变分法的出发点。

J[y]=∫abF(x,y(x),y′(x)) dx\displaystyle J[y] = \int_{a}^{b} F\big(x, y(x), y'(x)\big)\, dx
  1. \(J[y]\)这是给整条路线打分的符号,方括号表示输入是一条函数曲线,而不是一个普通数。
    J[y]\displaystyle J[y]
  2. 积分号 \(\int_a^b\)把路线从起点 \(a\) 到终点 \(b\) 上的每一小段费用累加起来。
    ∫ab⋯dx\displaystyle \int_a^b \cdots dx
  3. 被积函数 \(F(x, y, y')\)路线在 \(x\) 处的“局部费用”,它可能依赖位置 \(x\)、高度 \(y\) 和坡度 \(y'\)。
    F(x,y,y′)\displaystyle F(x, y, y')
  4. 曲线 \(y(x)\)这是你的候选路线,变分法要找的就是它,而不是某个孤立的数值。
    y(x)\displaystyle y(x)

2 变分思想

修路队长想做一个小实验:先画一条可行的路线,然后轻轻拨动路线上的每个点,让整条路发生一点“波浪形”的小变形。只要起点和终点还钉在原地,这条路仍然是从 A 到 B 的合法路线。我们会看到,路线一旦变形,造价 \(J\) 也会跟着变化。如果无论怎么拨动,造价的“一阶变化”都是零,那这条路就有可能是最优路线。

这个“轻轻拨动整条曲线”的动作,就是变分。我们把候选曲线记为 \(y(x)\),把一个小扰动记为 \(\eta(x)\),并要求它在端点处为零:\(\eta(a)=\eta(b)=0\)。然后让扰动强度用一个很小的参数 \(\varepsilon\) 来控制。当 \(\varepsilon=0\) 时,曲线回到原始路线;\(\varepsilon\) 稍大一点,曲线就偏离原路线。所谓一阶变分,就是看原始路线在“所有扰动方向”上的导数是否为零。

用公式写出来就是:

最优路线必须满足 \(\delta J = 0\),对任意端点为零的扰动 \(\eta\) 都成立。这和普通函数求极值时令导数等于零,本质上是同一个思想,只不过把“点”换成了“整条路线”。

δJ=ddεJ[y+εη]∣ε=0\displaystyle \delta J = \left. \frac{d}{d\varepsilon} J[y + \varepsilon \eta] \right|_{\varepsilon=0}
  1. \(\delta J\)表示泛函 \(J\) 的一阶变分,也就是路线被扰动后造价变化的主要部分。
    δJ\displaystyle \delta J
  2. \(\frac{d}{d\varepsilon}\)把 \(\varepsilon\) 当作一个可以调大调小的旋钮,求造价随扰动强度的变化率。
    ddε\displaystyle \frac{d}{d\varepsilon}
  3. \(y + \varepsilon \eta\)原始路线 \(y\) 加上一小段扰动 \(\varepsilon\eta\),相当于把整条路轻轻推了一下。
    y+εη\displaystyle y + \varepsilon \eta
  4. \(\varepsilon = 0\)在原始路线处计算变化率,这就是“初始推力”带来的第一反应。
    ε=0\displaystyle \varepsilon = 0

3 欧拉方程

修路队长心里明白:一条路如果某个局部还能通过微调变得更省,那它就不可能是最优。问题是,怎么把“任意扰动下 \(\delta J=0\)”这个整体条件变成每个点都要满足的局部方程?

办法是打开 \(\delta J\),把里面的扰动项整理出来。\(F\) 里既有 \(y\) 又有 \(y'\),扰动会同时通过这两条渠道影响造价。对包含 \(y'\) 的项做分部积分,就能把“扰动函数的导数”转移到“被积函数的导数”上;又因为端点处扰动为零,分部积分产生的边界项自动消失。最后再用一个基本引理:如果一个连续函数乘上任意扰动后积分为零,那这个连续函数本身必须处处为零。于是我们得到:

这就是欧拉-拉格朗日方程。它像是一条“局部平衡律”:最优路在线上的每一小段都处于力学平衡,没有任何局部拨动能让造价下降。修路队长不再需要同时检查整条路,只需要检查每一段是否满足这个方程。

∂F∂y−ddx(∂F∂y′)=0\displaystyle \frac{\partial F}{\partial y} - \frac{d}{dx}\left(\frac{\partial F}{\partial y'}\right) = 0
  1. \(\frac{\partial F}{\partial y}\)路线高度 \(y\) 每变化一点,局部费用 \(F\) 变化多少。
    ∂F∂y\displaystyle \frac{\partial F}{\partial y}
  2. \(\frac{d}{dx}\)沿路线方向 \(x\) 求全导数,因为 \(y'\) 本身也随 \(x\) 变化。
    ddx\displaystyle \frac{d}{dx}
  3. \(\frac{\partial F}{\partial y'}\)坡度 \(y'\) 每变化一点,局部费用 \(F\) 变化多少。
    ∂F∂y′\displaystyle \frac{\partial F}{\partial y'}
  4. 整体等于 0这两股力量必须逐点抵消,路线才没有进一步改进的空间。
    =0\displaystyle = 0

4 边界条件

修路队长还要决定栈道两端怎么固定。最常见的办法是:起点和终点都钉死,游客从 A 出发必须到 B 结束。这时扰动在两端为零,分部积分产生的边界项自动消失。但在很多实际问题里,端点不一定固定,比如索道的一端可以沿山坡自由滑动,或者最终时刻的位置没有规定。这时边界项就不能随便丢掉了。

边界条件不是欧拉-拉格朗日方程的“附加题”,而是方程能否成立的组成部分。固定端点会让边界项 \([F_{y'}\eta]_a^b=0\) 自动满足;自由端点则要求被积函数的“坡度响应”在边界处也为零,也就是:

这种由边界项推出来的条件叫做自然边界条件。它告诉我们:最优路不只内部要平衡,边界上也要给出“门是开着还是关着”的规则。修栈道时,如果桥头可以自由滑动,那么桥头处的受力方向也必须满足新的平衡,而不是随便停在某个位置。

∂F∂y′∣x=b=0\displaystyle \left.\frac{\partial F}{\partial y'}\right|_{x=b} = 0
  1. \(\frac{\partial F}{\partial y'}\)这是边界处“对坡度的敏感度”,可以理解成路线末端受到的某种力或通量。
    ∂F∂y′\displaystyle \frac{\partial F}{\partial y'}
  2. \(\left.\cdots\right|_{x=b}\)把这个量放在终点 \(b\) 处取值,只看端点这一瞬间的状态。
    ⋯ ∣x=b\displaystyle \left.\cdots\right|_{x=b}
  3. 等于 0如果端点自由,这个边界“通量”必须为零,否则还能通过移动端点来继续降低费用。
    =0\displaystyle = 0

5 经典问题

变分法最迷人的故事之一就是最速降线:一个小球只受重力作用,从 A 点滑到 B 点,走什么曲线用时最短?直觉上可能以为是直线,但修路队长知道,直线虽然是路程最短,却不是时间最短。若让小球先快速下降获得速度,再转弯到终点,往往更快。

把下滑时间写成泛函,就是一个典型的变分问题:

对 \(T[y]\) 应用欧拉-拉格朗日方程,会得到摆线参数方程 \(x = r(\theta-\sin\theta), y = r(1-\cos\theta)\)。这条摆线不是直觉中的直线,而是“先陡后缓”的曲线。同类经典问题还有很多:在曲面上找两点间最短路径的短程线、悬链线、等周问题等,它们都共享同一个“局部平衡”内核。

T[y]=∫0L1+(y′)22gy dx\displaystyle T[y] = \int_{0}^{L} \sqrt{\frac{1 + (y')^2}{2g y}}\, dx
  1. \(T[y]\)整条曲线对应的总下滑时间,是我们要最小化的目标。
    T[y]\displaystyle T[y]
  2. \(1 + (y')^2\)来自弧长微分的表达式,表示路线在这一小段上的实际长度。
    1+(y′)2\displaystyle 1 + (y')^2
  3. 分母 \(2gy\)重力势能转化为动能后的速度平方,体现“下降越深、速度越快”。
    2gy\displaystyle 2gy
  4. 积分从 \(0\) 到 \(L\)从起点到终点把每一小段时间累加起来。
    ∫0L⋯dx\displaystyle \int_0^L \cdots dx

6 物理应用

修路队长的直觉在物理学中有一个更宏大的版本:大自然也像在“挑路线”。法国数学家莫佩尔蒂提出,物体真实运动的轨迹,不是凭某一点的受力,而是让某个作用量取极值。后来拉格朗日把这个思想整理成最小作用量原理:从 \(t_1\) 到 \(t_2\),系统的运动轨迹使作用量泛函取驻值。

作用量由拉格朗日量 \(L = T - V\) 定义,其中 \(T\) 是动能,\(V\) 是势能。对每个广义坐标 \(q(t)\),泛函写成:

令 \(\delta S=0\),欧拉-拉格朗日方程立刻变成理论力学的核心:\(\frac{d}{dt}\frac{\partial L}{\partial \dot q} - \frac{\partial L}{\partial q}=0\)。牛顿方程、能量守恒、诺特定理都能从这一条原则里长出来。可以说,修路队长找的是“山谷里的最优栈道”,物理学家找的是“所有可能历史中的最优剧情”。

S[q]=∫t1t2L(q(t),q˙(t),t) dt\displaystyle S[q] = \int_{t_1}^{t_2} L\big(q(t), \dot{q}(t), t\big)\, dt
  1. \(S[q]\)作用量,相当于一整段运动过程的“综合代价”。
    S[q]\displaystyle S[q]
  2. \(q(t)\)广义坐标,可以是位置、角度或其他描述系统状态的量。
    q(t)\displaystyle q(t)
  3. \(\dot{q}(t)\)广义速度,表示状态随时间变化的快慢。
    q˙(t)\displaystyle \dot{q}(t)
  4. \(L(q, \dot{q}, t)\)拉格朗日量,是动能减势能,构成局部“运动代价”。
    L(q,q˙,t)\displaystyle L(q, \dot{q}, t)

7 现代应用

在现代 AI 与工程中,变分法仍然在“修路”。比如机器人规划一条从 A 到 B 的轨迹,既要快速到达,又要避免关节剧烈抖动,这就是在函数空间中优化一条轨迹;最优控制理论中的许多问题,本质上都是泛函极值问题。

机器学习里也有类似场景。训练一个连续函数 \(f(x)\) 去拟合数据时,我们常常不仅要让拟合误差小,还要让函数足够平滑,防止过拟合。把这两件事合起来写成一个泛函:

对这个泛函求变分,会得到关于 \(f\) 的欧拉-拉格朗日方程,也就是著名的偏微分方程正则化方法。变分推断、神经场、最优控制中的轨迹优化,都可以看作“修路队长”在不同领域里的分身:眼前的目标千变万化,但找到最优路线的数学内核始终如一。

E[f]=∫Ω(f(x)−d(x))2dx+λ∫Ω∥∇f(x)∥2dx\displaystyle E[f] = \int_{\Omega} \big(f(x) - d(x)\big)^2 dx + \lambda \int_{\Omega} \|\nabla f(x)\|^2 dx
  1. \(E[f]\)模型的总损失,输入是一个候选函数 \(f\),输出是一个数。
    E[f]\displaystyle E[f]
  2. \((f(x) - d(x))^2\)预测值与目标数据之间的拟合误差。
    (f(x)−d(x))2\displaystyle (f(x) - d(x))^2
  3. \(\|\nabla f(x)\|^2\)函数局部变化的剧烈程度,用来惩罚过于“毛糙”的曲线。
    ∥∇f(x)∥2\displaystyle \|\nabla f(x)\|^2
  4. \(\lambda\)正则化强度,控制“拟合数据”和“保持平滑”之间的权重。
    λ\displaystyle \lambda

AI 应用场景

机器人最优轨迹规划

阶段:策略优化 / 轨迹生成

解决的问题:传统上机器人轨迹要靠工程师逐点设计、反复试错调参,既费时又容易让关节速度突变。把轨迹看成一条完整曲线,把“到达目标 + 省能量 + 平滑”写成泛函,用欧拉-拉格朗日方程求驻值,就能自动得到平滑省电的轨迹。

具体案例:机械臂从传送带上抓取零件并放到指定位置。系统用三次样条描述候选轨迹,在泛函中加入关节速度平方和加速度惩罚,再求欧拉-拉格朗日方程,生成一条无抖动、不越界的轨迹。

物理引擎与动态仿真

阶段:环境建模 / 仿真

解决的问题:游戏和数字孪生需要真实模拟物体运动。直接逐帧算力往往不稳定;使用最小作用量思想和欧拉-拉格朗日方程推导出系统的拉格朗日动力学,可以保证能量和动量在长期仿真中更稳定。

具体案例:在一款机械臂仿真环境中,把每个关节角当作广义坐标 \(q(t)\),由拉格朗日方程自动生成动力学方程,再交给 AI 智能体训练抓取策略,训练出的策略能直接迁移到真实机械臂。

机器学习平滑正则化

阶段:模型训练 / 正则化

解决的问题:深度模型在稀疏样本上容易过拟合,单个点微小的噪声会被放大成剧烈抖动。通过在函数空间上定义包含梯度惩罚的泛函,再用变分法求解或用其思想设计损失函数,可以让模型输出在空间上更平滑、更稳定。

具体案例:在神经辐射场重建 3D 场景时,视线采样点稀疏会造成重建表面出现噪声。在损失中加入关于 \(f(x)\) 梯度范数的正则项,参考欧拉-拉格朗日方程设计可微惩罚,显著减少重建表面的“皱纹”。

Python 演示

python38 行
import math N = 50YA = 0.0YB = 1.0dx = 1.0 / Nlr = 0.08epochs = 300 def evaluate(y):    total = 0.0    for i in range(N):        slope = (y[i + 1] - y[i]) / dx        total += slope * slope    return 0.5 * total * dx def gradient(y):    g = [0.0] * (N + 1)    for i in range(1, N):        g[i] = (2.0 * y[i] - y[i - 1] - y[i + 1]) / dx    return g def main():    y = [YA + (YB - YA) * i / N for i in range(N + 1)]    for epoch in range(epochs):        g = gradient(y)        for i in range(1, N):            y[i] -= lr * g[i]        y[0] = YA        y[N] = YB        if epoch % 50 == 0:            print("epoch", epoch, "J =", round(evaluate(y), 6))    max_dev = max(abs(y[i] - (YA + (YB - YA) * i / N)) for i in range(N + 1))    print("max deviation from straight line:", round(max_dev, 10))    print("y[25] =", round(y[25], 6)) if __name__ == "__main__":    main()
目的:用离散梯度下降求解一个最简单的泛函极值问题,让读者直观看到“不断微调整条路线”最终收敛到直线。
  1. def evaluate(y):把离散路线代入费用函数,给我们一个可以监控的数值。
  2. slope = (y[i + 1] - y[i]) / dx计算相邻两点之间的斜率,近似导数 \(y'\)。
  3. return 0.5 * total * dx对斜率平方做离散积分,这就是泛函的数值版本。
  4. g[i] = (2.0 * y[i] - y[i - 1] - y[i + 1]) / dx这就是离散化的欧拉-拉格朗日残差,对应每个点上的微小扰动一阶项。
  5. y[i] -= lr * g[i]沿负梯度方向修路,让每个点都朝降低费用的方向移动。
  6. y[0] = YA; y[N] = YB固定两端点,保证候选路线始终合法。

常见误区

误区我已经学过微积分,令 \(dJ/dx=0\),解出 \(x\) 就是答案。变分法不过是把 \(x\) 换成一个数而已。

正解普通求导在实数轴上找点,变分法在函数空间中找曲线。\(J[y]\) 输出一个数,但输入是整条曲线。令一阶变分为零,相当于对整条路的每个小改路方向都“无懈可击”,不是解单个方程。

为何常见:因为“极值”这个词相同,初学者很容易沿用单变量求导的旧习惯,而忽略了输入对象已经从“点”变成了“曲线”。

误区只要背下欧拉-拉格朗日方程,把 \(F\) 代进去机械求偏导,就一定能得到正确答案,根本不用管边界条件。

正解欧拉-拉格朗日方程是由一阶变分为零推出的必要条件,它依赖函数光滑、扰动可交换、边界项为零等前提。边界条件不同会得到完全不同的解,就像修栈道时,桥头可以滑动和桥头被钉死,最优路线的端点状态完全不同。

为何常见:公式形式简洁,教材又常用固定端点例题,容易让人误以为它是无条件的“万能公式”。

误区欧拉-拉格朗日方程成立的路线一定就是费用最低的路线,不可能是极大值或鞍点。

正解欧拉-拉格朗日方程给出的是“一阶变分为零”的驻路线。山谷底部、山顶、马鞍点都能满足这个条件。想区分极小和极大,还需要考察二阶变分,就像水平山脊也可能局部平衡,却不是最低点。

为何常见:入门例题大多在找最小值,物理里的“最小作用量原理”也叫“最小”,导致大家默认驻值就等于极小值。

误区变分法必须两端固定,只要端点不固定就不能用,所以自由末端问题无解。

正解固定端点只是最常见的一种边界条件。端点自由时,边界项不会自动消失,会推出自然边界条件。欧拉-拉格朗日方程在内部依然成立,只是边界上多了额外的横截条件。

为何常见:教材通常从固定端点引入,最速降线和短程线又都是固定端点问题,给人留下“变分法 = 固定端点”的刻板印象。

面试题

Q1. 变分法的研究对象是什么?

单选题 · easy

  • A.一个实数 x
  • B.一条函数曲线← 正确答案
  • C.一个固定向量
  • D.一个二维矩阵

答案:B。变分法不再找单个数值,而是在函数空间里寻找一整条最优曲线。普通微积分研究数到数的映射,变分法研究“函数到数”的映射,也就是泛函。

Q2. 泛函取极值的必要条件是?

单选题 · mid

  • A.沿 y 方向的普通梯度为 0
  • B.沿 y' 方向的普通梯度为 0
  • C.对任意小扰动的一阶变分为 0← 正确答案
  • D.二阶变分一定大于 0

答案:C。任意端点为零的扰动下,一阶变分必须为零,这是驻路条件。A 和 B 把泛函误当成普通多元函数;D 是极小值的充分性条件之一,不是必要条件。

Q3. 欧拉-拉格朗日方程通常要求候选函数满足?

单选题 · easy

  • A.光滑且边界条件适定← 正确答案
  • B.任意没有导数意义的间断函数
  • C.坐标轴上一个孤立点的邻域
  • D.不需要任何边界条件的开放集合

答案:A。推导中要用到导数、积分和分部积分,所以候选函数要足够光滑,并且边界条件必须明确。间断函数会让积分和变分失去意义。

Q4. 推导欧拉-拉格朗日方程时,端点项通常自动消失,原因是?

单选题 · hard

  • A.固定端点处扰动函数为零← 正确答案
  • B.被积函数具有偶函数对称性
  • C.导数在端点处恰好为零
  • D.边界条件可以随意选取

答案:A。因为扰动函数 \(\eta(x)\) 在固定端点满足 \(\eta(a)=\eta(b)=0\),所以分部积分产生的边界项为零。这不是被积函数对称性或导数为零造成的。

Q5. 关于最速降线问题,下列说法正确的是?

多选题 · mid

  • A.最优解是一条摆线(旋轮线)← 正确答案
  • B.最优解是连接两点的一条直线
  • C.求解时会把下滑时间写成含 \(1/\sqrt{y}\) 的积分← 正确答案
  • D.最优曲线形状与重力加速度大小无关← 正确答案

答案:ACD。最速降线的解是摆线,不是直线。时间泛函中含速度项 \(\sqrt{2gy}\),所以被积函数含 \(1/\sqrt{y}\)。摆线的形状参数只由端点位置决定,与 \(g\) 的大小无关,\(g\) 只影响滑行时间。

Q6. 关于变分问题的边界条件,说法正确的是?

多选题 · hard

  • A.固定端点要求两端扰动为零← 正确答案
  • B.自由端点会推出自然边界条件← 正确答案
  • C.边界条件与泛函形式完全无关
  • D.自然边界条件来自端点项必须为零← 正确答案

答案:ABD。固定端点时扰动在两端为零;自由端点时边界项必须单独为零,推出自然边界条件。边界条件会和泛函一起参与最终解,所以 C 错误。

Q7. 最小作用量原理中,真实运动轨迹满足?

单选题 · mid

  • A.作用量泛函取驻值← 正确答案
  • B.系统动能取最大值
  • C.系统势能取最小值
  • D.速度方向始终保持不变

答案:A。真实轨迹是让作用量泛函取一阶变分为零的路径。它不是简单地让动能最大或势能最小,更不是要求速度方向不变。

Q8. 用变分法做机器学习正则化,核心思路是?

单选题 · mid

  • A.在函数空间上定义损失泛函← 正确答案
  • B.在数据集上随机采样即可
  • C.只对最后一个隐藏层求导
  • D.把损失写成概率分布不变

答案:A。变分正则化把模型看成一个连续函数,把拟合误差和平滑惩罚写成泛函,再求极值。它不是对最后一层求导,也不是随机采样的替代方案。

Q9. 变分法与普通微积分求极值的共同点是?

单选题 · easy

  • A.都让目标的一阶变化为零← 正确答案
  • B.都只处理离散数值
  • C.都要求变量是标量
  • D.都不需要任何边界条件

答案:A。普通函数求极值令一阶导数为零,变分法令一阶变分为零,两者都是“一阶变化为零”的驻值条件。区别在于变量从标量变成了函数。

Q10. 关于欧拉-拉格朗日方程的使用前提,正确的是?

多选题 · extreme

  • A.被积函数需要有偏导数← 正确答案
  • B.候选曲线可有跳跃间断
  • C.推导中用分部积分消去高阶扰动项← 正确答案
  • D.端点项必须由边界条件处理← 正确答案

答案:ACD。欧拉-拉格朗日方程要求 \(F\) 对 \(y\) 和 \(y'\) 可偏导,候选曲线足够光滑。推导时用分部积分把 \(\eta'\) 转为 \(F_{y'}\) 的导数,并通过边界条件消去端点项。B 的跳跃间断不满足光滑性要求。