# 积分学

*积分学在区间上累积量，将局部变化率还原为总量。本文涵盖定积分与不定积分、微积分基本定理、积分技巧，以及在机器学习中与概率密度和期望值的应用。*

- 微分告诉我们单个点的变化率。积分则相反：它将许多微小片段累积起来，计算出一个总量。

- 如果导数回答的是"多快？"，那么积分回答的是"多少？"

- 理解积分最简单的方式是将其视为**曲线下的面积**。如果绘制出函数 $f(x)$ 的图像，并将从 $x = a$ 到 $x = b$ 之间曲线与 x 轴之间的区域涂上阴影，积分给出的就是该区域的有符号面积。

![积分通过求和薄矩形来计算曲线下的面积](../images/area_under_curve.svg)

- 为什么是"有符号"的？在 x 轴上方的区域贡献正面积，在下方的区域贡献负面积。这在物理上是有意义的：如果 $f(x)$ 代表速度，积分给出的是净位移（正向减去反向），而不是总路程。

- 为了计算这个面积，想象将区域切成 $n$ 个细长的竖直矩形，每个矩形的宽度为 $\Delta x$。每个矩形的高度是该切片内某一点的函数值。将它们求和：

$$\text{面积} \approx \sum_{i=1}^{n} f(x_i^\ast) \, \Delta x$$

- 当我们让矩形越来越薄时（$n \to \infty$，$\Delta x \to 0$），这个和就变得精确。这个极限过程定义了**定积分**：

$$\int_a^b f(x)\, dx = \lim_{n \to \infty} \sum_{i=1}^{n} f(x_i^\ast) \, \Delta x$$

- $\int$ 符号是拉长的"S"，代表"求和"（Sum）。$dx$ 提醒我们，我们是在沿 x 轴方向对无穷薄的切片求和。

- **不定积分**（或**原函数**）是一个函数 $F(x)$，其导数为 $f(x)$。我们写作：

$$\int f(x)\, dx = F(x) + C$$

- $+ C$ 是**积分常数**。因为任何常数的导数都是零，所以存在无穷多个仅相差一个常数的原函数。例如，$\int 2x\, dx = x^2 + C$，因为 $x^2 + 7$ 或 $x^2 - 3$ 的导数仍然是 $2x$。

- **微积分基本定理**是连接微分与积分的桥梁。它包含两部分：

- **第一部分**：如果 $F(x)$ 是 $f(x)$ 的一个原函数，那么定积分等于 $F$ 在端点处的值之差：

$$\int_a^b f(x)\, dx = F(b) - F(a)$$

- 这非常实用。我们不再需要计算一个和的极限（这很困难），而是找到一个原函数并在两点处求值（这通常很简单）。

- **第二部分**：如果我们定义 $F(x) = \int_a^x f(t)\, dt$，那么 $F'(x) = f(x)$。微分与积分是互逆运算，它们相互抵消。

- 例如，计算 $\int_1^3 x^2\, dx$：$x^2$ 的原函数是 $\frac{x^3}{3}$。所以 $\int_1^3 x^2\, dx = \frac{27}{3} - \frac{1}{3} = \frac{26}{3} \approx 8.67$。

- 正如微分有运算法则一样，积分也有相应的逆向运算法则：

| 函数 | 积分 | 条件 |
|---|---|---|
| $x^n$ | $\frac{x^{n+1}}{n+1} + C$ | $n \neq -1$ |
| $\frac{1}{x}$ | $\ln\|x\| + C$ | |
| $e^x$ | $e^x + C$ | |
| $a^x$ | $\frac{a^x}{\ln a} + C$ | |
| $\sin x$ | $-\cos x + C$ | |
| $\cos x$ | $\sin x + C$ | |
| $k$（常数） | $kx + C$ | |

- **和/差法则**同样适用：$\int [f(x) \pm g(x)]\, dx = \int f(x)\, dx \pm \int g(x)\, dx$。常数可以提出来：$\int k\, f(x)\, dx = k \int f(x)\, dx$。

- 当一个函数太复杂而无法直接积分时，我们有简化它的技巧。

- **换元积分法（u 代换）**是链式法则的逆过程。如果发现一个复合函数 $f(g(x))$ 乘以 $g'(x)$，则令 $u = g(x)$，于是 $du = g'(x)\, dx$，积分得以简化。

- 例如：$\int 2x \cos(x^2)\, dx$。令 $u = x^2$，则 $du = 2x\, dx$。积分变为 $\int \cos(u)\, du = \sin(u) + C = \sin(x^2) + C$。

- **分部积分法**是乘积法则的逆过程。如果被积函数是两个函数的乘积：

$$\int u\, dv = uv - \int v\, du$$

- 策略性地选择 $u$ 和 $dv$，使得剩下的积分 $\int v\, du$ 比原来的更简单。选择 $u$ 的常用助记法是 **LIATE**：对数函数（Logarithmic）、反三角函数（Inverse trig）、代数函数（Algebraic）、三角函数（Trigonometric）、指数函数（Exponential）（优先从靠前的类别中选择 $u$）。

- 例如：$\int x\, e^x\, dx$。令 $u = x$（代数函数）和 $dv = e^x\, dx$。则 $du = dx$，$v = e^x$。因此：$\int x\, e^x\, dx = x\, e^x - \int e^x\, dx = x\, e^x - e^x + C = e^x(x - 1) + C$。

- 在机器学习中，积分出现在概率论中（通过对密度函数积分来计算概率）、期望值中（连续分布上的加权平均），以及计算 ROC 曲线下的面积。虽然在实际中我们很少手动积分，但理解积分的含义有助于解释这些量。

## 编程练习（使用 CoLab 或 notebook）

1. 使用黎曼和，用不断增加数量的矩形来数值逼近 $\int_0^1 x^2\, dx$。与精确答案 $\frac{1}{3}$ 进行比较。
```python
import jax.numpy as jnp

for n in [10, 100, 1000, 10000]:
    x = jnp.linspace(0, 1, n, endpoint=False)
    dx = 1.0 / n
    area = jnp.sum(x**2 * dx)
    print(f"n={n:5d}  approx: {area:.6f}  exact: {1/3:.6f}")
```

2. 数值验证微积分基本定理。定义 $F(x) = \int_0^x t^2\, dt = \frac{x^3}{3}$，并验证其导数（通过 `jax.grad` 计算）等于 $x^2$。
```python
import jax
import jax.numpy as jnp

F = lambda x: x**3 / 3
dF = jax.grad(F)

for x in [0.5, 1.0, 2.0, 3.0]:
    print(f"x={x:.1f}  F'(x)={dF(x):.4f}  x^2={x**2:.4f}")
```

3. 可视化 $f(x) = \sin(x)$ 从 $0$ 到 $\pi$ 的曲线下面积。使用 `plt.fill_between` 填充该区域，并用黎曼和数值计算面积。
```python
import jax.numpy as jnp
import matplotlib.pyplot as plt

x = jnp.linspace(0, jnp.pi, 500)
y = jnp.sin(x)

plt.plot(x, y, color="purple", linewidth=2)
plt.fill_between(x, y, alpha=0.2, color="purple")
plt.title(f"Area = {jnp.sum(jnp.sin(x) * (jnp.pi / 500)):.4f}  (exact: 2.0)")
plt.show()
```
