Skip to content

1.4 多元微积分

把一元函数的知识推广到多个变量。你有了一个变量随另一个变量怎么变的概念,现在来看一个值随多个变量同时变化的情况。


一、看得见的例子:从一元到二元

1.1 一元函数回顾

一元函数 f(x)f(x) 很简单——输入一个数 xx,输出一个数 f(x)f(x)。 比如 f(x)=x2f(x) = x^2,输入 33,得 99。画出来就是一条曲线。

1.2 二元函数:输入两个数

二元函数 f(x,y)f(x, y):输入两个数 (x,y)(x, y),输出一个数。 比如 f(x,y)=x2+y2f(x, y) = x^2 + y^2,输入 (3,4)(3, 4),输出 2525

这个函数在输入空间中对所有点都定义了。你想想看如果把它画出来:在 (x,y)(x, y) 平面上每个点处,垂直方向的高度就是 f(x,y)f(x, y)。它在三维空间中形成一个曲面——x2+y2x^2 + y^2 实际上就是一个碗状曲面。

也就是说,f(x)=x2f(x) = x^2 的图像是二维平面上的一条抛物线(弯曲线),而 f(x,y)=x2+y2f(x, y) = x^2 + y^2 的图像是三维空间中的一个(抛物面)。

1.3 看几个具体值

f(x,y)=x2+y2f(x, y) = x^2 + y^2 随便代几个数进去,感受一下:

(x,y)(x, y)代进去怎么算f(x,y)f(x, y)
(1,0)(1, 0)12+021^2 + 0^21
(2,0)(2, 0)22+022^2 + 0^24
(0,2)(0, 2)02+220^2 + 2^24
(1,1)(1, 1)12+121^2 + 1^22
(1,2)(1, 2)12+221^2 + 2^25

注意 (1,0)(1, 0)(0,1)(0, 1) 的结果都是 11(2,0)(2, 0)(0,2)(0, 2) 都是 44——这说明这个函数是对称的。


二、偏导数:一次只看一个变量

2.1 直觉

对于 f(x,y)=x2+y2f(x, y) = x^2 + y^2,我们自然想知道:如果只改变 xx,函数值怎么变?只改变 yy 呢?

这就是偏导数的意思——保持其他变量不动,只对一个变量求导

符号:

  • fx\dfrac{\partial f}{\partial x} 读作"偏 f 偏 x",意思是:yy 固定,只看 xx 的变化
  • fy\dfrac{\partial f}{\partial y} 同理

2.2 动手算

f(x,y)=x2+y2f(x, y) = x^2 + y^2

xx 求偏导(yy 当常数)

y2y^2 看作一个常数(就像 55π\pi 一样),对 xx 求导:

x(x2+y2)=x(x2)+x(y2)=2x+0=2x\frac{\partial}{\partial x}(x^2 + y^2) = \frac{\partial}{\partial x}(x^2) + \frac{\partial}{\partial x}(y^2) = 2x + 0 = 2x

yy 求偏导(xx 当常数)

y(x2+y2)=y(x2)+y(y2)=0+2y=2y\frac{\partial}{\partial y}(x^2 + y^2) = \frac{\partial}{\partial y}(x^2) + \frac{\partial}{\partial y}(y^2) = 0 + 2y = 2y

就这么简单。对比之前学的导数 ddx(x2)=2x\frac{d}{dx}(x^2) = 2x,偏导完全一样——只是多了一个"把其他变量当常数"的步骤。

2.3 再算一个例子

f(x,y)=x2y+3y2f(x, y) = x^2 y + 3y^2

xx 求偏导:yyy2y^2 都是常数

fx=x(x2y)+x(3y2)=yx(x2)+0=y2x=2xy\frac{\partial f}{\partial x} = \frac{\partial}{\partial x}(x^2 y) + \frac{\partial}{\partial x}(3y^2) = y \cdot \frac{\partial}{\partial x}(x^2) + 0 = y \cdot 2x = 2xy

yy 求偏导:x2x^2 是常数

fy=y(x2y)+y(3y2)=x2y(y)+3y(y2)=x21+32y=x2+6y\frac{\partial f}{\partial y} = \frac{\partial}{\partial y}(x^2 y) + \frac{\partial}{\partial y}(3y^2) = x^2 \cdot \frac{\partial}{\partial y}(y) + 3 \cdot \frac{\partial}{\partial y}(y^2) = x^2 \cdot 1 + 3 \cdot 2y = x^2 + 6y

代入具体点验证:在 (2,3)(2, 3)

fx(2,3)=223=12\frac{\partial f}{\partial x}(2, 3) = 2 \cdot 2 \cdot 3 = 12

fy(2,3)=22+63=4+18=22\frac{\partial f}{\partial y}(2, 3) = 2^2 + 6 \cdot 3 = 4 + 18 = 22

含义:在 (2,3)(2, 3) 这个点,xx 每增加一点点,函数值增加约 1212 倍的变化量;yy 每增加一点点,函数值增加约 2222 倍。

Quant Link:期权价格 C(S,σ,r,t)C(S, \sigma, r, t) 是多元函数——标的价格、波动率、利率、剩余时间。期权希腊值本质上就是偏导数:

  • Delta =CS= \dfrac{\partial C}{\partial S}:标的价格每涨 1 块,期权涨多少
  • Vega =Cσ= \dfrac{\partial C}{\partial \sigma}:波动率每升 1%,期权涨多少
  • Rho =Cr= \dfrac{\partial C}{\partial r}:利率每升 1%,期权涨多少
  • Theta =Ct= \dfrac{\partial C}{\partial t}:过一天,期权跌多少 这就是 "其他变量固定,只看一个变量变化的影响" 在量化里的直接应用。

2.4 二元偏导的几何意义

还记得 f(x,y)=x2+y2f(x, y) = x^2 + y^2 是个碗吗?

在某点 (x0,y0)(x_0, y_0)

  • fx\dfrac{\partial f}{\partial x} 告诉你:如果你沿着 xx 方向走,碗面是向上还是向下倾斜
  • fy\dfrac{\partial f}{\partial y} 告诉你:如果你沿着 yy 方向走,碗面是怎么倾斜的

在碗底 (0,0)(0, 0),两个偏导都是 00——因为碗底是平的。


三、梯度:所有偏导放在一起

3.1 定义

一个函数的全部偏导数放在一个向量里,就叫梯度

f=(fx,fy)\nabla f = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right)

注意 \nabla 读作 "nabla"。

3.2 算是算

f(x,y)=x2y+3y2f(x, y) = x^2 y + 3y^2

f=(2xy,  x2+6y)\nabla f = (2xy, \; x^2 + 6y)

(2,3)(2, 3) 处:

f(2,3)=(12,22)\nabla f(2, 3) = (12, 22)

这个向量的含义就两个东西:

  1. 方向(12,22)(12, 22) 指的方向,是函数上升最快的方向
  2. 大小122+22225.06\sqrt{12^2 + 22^2} \approx 25.06,是上升的"速度"

反之,负梯度 f-\nabla f 就是下降最快的方向。

3.3 梯度下降的核心直觉

如果你站在碗面上想走到最低点(f=0\nabla f = 0 的碗底),你会怎么做?

每次都沿着当前最陡的下降方向迈一步——这就是梯度下降。

xk+1=xkαf(xk)\boldsymbol{x}_{k+1} = \boldsymbol{x}_k - \alpha \nabla f(\boldsymbol{x}_k)

α\alpha学习率,决定你迈的步子有多大。

这也是一元函数里牛顿法的升级版——当你有很多变量(比如神经网络里几百万个参数)时,不可能把所有二阶偏导都算了,梯度下降就是唯一可行的方案。

Quant Link:梯度下降是所有机器学习模型训练的基石。线性回归、逻辑回归、神经网络,训练过程就是:

  1. 预测 → 2. 算损失 → 3. 算梯度 → 4. 沿着梯度反方向更新参数 → 重复 你在量化里写的任何模型,只要是"学习"出来的,背后就是梯度下降或它的变体(Adam、SGD 等)。

四、方向导数:沿着任意方向的变化

4.1 不只是沿坐标轴

梯度告诉你"最陡的方向",但你可能想知道沿任意方向 v\boldsymbol{v}(单位向量)的变化率。

方向导数的公式简单得惊人:

Dvf=fvD_{\boldsymbol{v}} f = \nabla f \cdot \boldsymbol{v}

就是梯度和方向向量的点积

4.2 算一个看看

还拿 f(x,y)=x2y+3y2f(x, y) = x^2 y + 3y^2(2,3)(2, 3) 处,f=(12,22)\nabla f = (12, 22)

如果沿着方向 v=(1,0)\boldsymbol{v} = (1, 0)(即沿 xx 轴方向)走,方向导数为:

Dvf=(12,22)(1,0)=12D_{\boldsymbol{v}} f = (12, 22) \cdot (1, 0) = 12

嗯,这不就是 f/x\partial f / \partial x 吗?确实,沿 xx 轴的方向导数就是偏导本身。

如果沿着 v=(12,12)\boldsymbol{v} = \left( \frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}} \right)(45 度方向)走:

Dvf=1212+2212=34224.04D_{\boldsymbol{v}} f = 12 \cdot \frac{1}{\sqrt{2}} + 22 \cdot \frac{1}{\sqrt{2}} = \frac{34}{\sqrt{2}} \approx 24.04

看,比沿 xx 轴变化更快了。

点积最大化:当 v\boldsymbol{v} 和梯度同方向时,方向导数最大(增长最快);反向时最小(下降最快);垂直时为零(沿等高线移动,值不变)。


五、高阶偏导与海森矩阵

5.1 二阶偏导

就像一元函数可以求二阶导一样,多元函数也可以。只是现在有四种组合

f(x,y)f(x, y)

符号含义读法
2fx2\dfrac{\partial^2 f}{\partial x^2}先对 xx 求偏导,再对 xx"偏 x 两次"
2fy2\dfrac{\partial^2 f}{\partial y^2}先对 yy 求偏导,再对 yy"偏 y 两次"
2fxy\dfrac{\partial^2 f}{\partial x \partial y}先对 yy 求偏导,再对 xx"偏 x 偏 y"
2fyx\dfrac{\partial^2 f}{\partial y \partial x}先对 xx 求偏导,再对 yy"偏 y 偏 x"

5.2 手算

f(x,y)=x2y3f(x, y) = x^2 y^3

先算一阶偏导

fx=2xy3,fy=3x2y2\frac{\partial f}{\partial x} = 2x y^3,\quad \frac{\partial f}{\partial y} = 3x^2 y^2

再算二阶

2fx2=x(2xy3)=2y3\frac{\partial^2 f}{\partial x^2} = \frac{\partial}{\partial x}(2x y^3) = 2y^3

2fy2=y(3x2y2)=6x2y\frac{\partial^2 f}{\partial y^2} = \frac{\partial}{\partial y}(3x^2 y^2) = 6x^2 y

2fxy=x(3x2y2)=6xy2\frac{\partial^2 f}{\partial x \partial y} = \frac{\partial}{\partial x}(3x^2 y^2) = 6x y^2

2fyx=y(2xy3)=6xy2\frac{\partial^2 f}{\partial y \partial x} = \frac{\partial}{\partial y}(2x y^3) = 6x y^2

注意 2fxy=2fyx\dfrac{\partial^2 f}{\partial x \partial y} = \dfrac{\partial^2 f}{\partial y \partial x}——混合偏导在大多数情况下与求导顺序无关(克莱罗定理)。

5.3 海森矩阵

把四个二阶偏导排成一个 2×22 \times 2 矩阵:

H=[2fx22fxy2fyx2fy2]H = \begin{bmatrix} \frac{\partial^2 f}{\partial x^2} & \frac{\partial^2 f}{\partial x \partial y} \\ \frac{\partial^2 f}{\partial y \partial x} & \frac{\partial^2 f}{\partial y^2} \end{bmatrix}

对于上面的 f(x,y)=x2y3f(x, y) = x^2 y^3

H=[2y36xy26xy26x2y]H = \begin{bmatrix} 2y^3 & 6x y^2 \\ 6x y^2 & 6x^2 y \end{bmatrix}

5.4 海森矩阵有什么用?

回忆一元函数:f(x)>0f''(x) > 0 意味着函数是凸的(局部最小值),f(x)<0f''(x) < 0 意味着是凹的(局部最大值)。

对多元函数,海森矩阵就相当于二阶导的推广。判定规则:

  • HH 所有特征值 > 0(特征值 = 衡量矩阵在各方向"拉伸"程度的数值,详见 2.4 特征值分解)→ 函数在该点是凸的(局部最小值)
  • HH 所有特征值 < 0 → 函数在该点是凹的(局部最大值)
  • HH 特征值有正有负 → 鞍点(一个方向凸、另一个方向凹,像马鞍的形状)

六、拉格朗日乘子法

6.1 问题

假设你想最大化一个矩形面积 f(x,y)=xyf(x, y) = xy,但有一个限制:x+y=10x + y = 10(周长固定)。

这是一个带约束的优化问题。你可以直接代入 y=10xy = 10 - x 变成一元问题,但很多时候代入不了。

6.2 解决方案

构造拉格朗日函数

L(x,y,λ)=f(x,y)λ(g(x,y)0)\mathcal{L}(x, y, \lambda) = f(x, y) - \lambda \cdot (g(x, y) - 0)

这里 g(x,y)=x+y10=0g(x, y) = x + y - 10 = 0 是约束条件。

所以:

L=xyλ(x+y10)\mathcal{L} = xy - \lambda (x + y - 10)

6.3 求解

对三个变量分别求偏导,令为零:

Lx=yλ=0y=λ\frac{\partial \mathcal{L}}{\partial x} = y - \lambda = 0 \quad \Rightarrow \quad y = \lambda

Ly=xλ=0x=λ\frac{\partial \mathcal{L}}{\partial y} = x - \lambda = 0 \quad \Rightarrow \quad x = \lambda

Lλ=(x+y10)=0x+y=10\frac{\partial \mathcal{L}}{\partial \lambda} = -(x + y - 10) = 0 \quad \Rightarrow \quad x + y = 10

由前两式得 x=yx = y,代入第三式得 x=y=5x = y = 5。最大面积 xy=25xy = 25

Quant LinkMarkowitz 组合优化就是拉格朗日乘子的直接应用: 目标:最小化组合方差 σp2=wTΣw\sigma_p^2 = \boldsymbol{w}^T \Sigma \boldsymbol{w} 约束:1Tw=1\boldsymbol{1}^T \boldsymbol{w} = 1(权重之和为 1) 拉格朗日函数:L=wTΣwλ(1Tw1)\mathcal{L} = \boldsymbol{w}^T \Sigma \boldsymbol{w} - \lambda (\boldsymbol{1}^T \boldsymbol{w} - 1) 求导得最优权重的解析解:w=Σ111TΣ11\boldsymbol{w}^* = \dfrac{\Sigma^{-1} \boldsymbol{1}}{\boldsymbol{1}^T \Sigma^{-1} \boldsymbol{1}}


七、Python 验证

python
import sympy as sp
import numpy as np

# === 偏导数符号计算 ===
x, y = sp.Symbol('x'), sp.Symbol('y')

f = x**2 * y + 3*y**2
print("=== 偏导数 ===")
print(f"f(x, y) = {f}")
print(f"∂f/∂x = {sp.diff(f, x)}")   # 2xy
print(f"∂f/∂y = {sp.diff(f, y)}")   # x² + 6y

# 在具体点求值
fx = sp.lambdify((x, y), sp.diff(f, x))
fy = sp.lambdify((x, y), sp.diff(f, y))
print(f"在 (2, 3) 处: ∂f/∂x = {fx(2, 3)}, ∂f/∂y = {fy(2, 3)}")

# === 海森矩阵 ===
f2 = x**2 * y**3
H = sp.hessian(f2, (x, y))
print(f"\n=== 海森矩阵 ===")
print(f"f(x,y) = {f2}")
print(f"H = {H}")
# 代入 x=1, y=1
H_num = np.array([[float(H[0,0].subs({x:1, y:1})),
                   float(H[0,1].subs({x:1, y:1}))],
                  [float(H[1,0].subs({x:1, y:1})),
                   float(H[1,1].subs({x:1, y:1}))]])
eigvals = np.linalg.eigvals(H_num)
print(f"在 (1,1) 处的特征值: {eigvals}")
if np.all(eigvals > 0):
    print("→ 正定,局部最小值")
elif np.all(eigvals < 0):
    print("→ 负定,局部最大值")
else:
    print("→ 鞍点")

# === 梯度下降 ===
def gradient_descent(grad, x0, lr=0.1, n_iter=20):
    x = np.array(x0, dtype=float)
    print(f"\n=== 梯度下降 ===")
    print(f"从 {x0} 开始, lr={lr}")
    for i in range(n_iter):
        g = grad(x)
        x = x - lr * g
        if i % 5 == 0 or i == n_iter - 1:
            print(f"  第{i+1:2d}步: x={x}, |∇f|={np.linalg.norm(g):.4f}")
    return x

# 找 f(x,y) = x² + y² 的最小值(已知在 (0,0))
grad_f = lambda v: np.array([2*v[0], 2*v[1]])
opt = gradient_descent(grad_f, [5.0, 3.0])
print(f"\n理论最小值在 (0, 0),梯度下降找到 ({opt[0]:.6f}, {opt[1]:.6f})")

# === 拉格朗日乘子 ===
lam = sp.Symbol('lambda')
f_obj = x * y
g_con = x + y - 10
L = f_obj - lam * g_con
eqs = [sp.diff(L, var) for var in (x, y, lam)]
sol = sp.solve(eqs, (x, y, lam))
print(f"\n=== 拉格朗日乘子 ===")
print(f"最大化 xy,约束 x+y=10")
print(f"最优解: x={sol[x]}, y={sol[y]}, λ={sol[lam]}")
print(f"最大面积: {sol[x] * sol[y]}")

小结

概念要点
偏导数固定其他变量,只对一个变量求导
梯度所有偏导组成的向量,指向最陡上升方向
方向导数沿任意方向的变化率 = 梯度 · 方向向量
海森矩阵所有二阶偏导组成的矩阵,判定极值类型
拉格朗日乘子带约束的优化——引入 λ\lambda 变成无约束问题
Quant 应用希腊值(偏导)、梯度下降(训练)、Markowitz(拉格朗日)

Built with VitePress