第三十三 微积分(Calculus)
微积分(Calculus)是数学中最伟大的成就之一,由牛顿和莱布尼茨在 17 世纪独立创立。它的核心思想是以直代曲、以简代繁——把复杂问题分解成无数个小的、简单的问题,然后再整合结果。
- 微分(求导):求变化快慢,比如速度、斜率
- 积分:求累积总量,比如面积、路程
- 两者互为逆运算(导数 ↔ 积分)
一、极限与连续
1.1 极限的定义
$$\lim_{x \to a} f(x) = L$$
表示当 $x$ 无限接近 $a$ 时,$f(x)$ 无限接近 $L$。
1.2 重要极限
$$\lim_{x \to 0} \frac{\sin x}{x} = 1$$
$$\lim_{x \to 0} \frac{e^x - 1}{x} = 1$$
$$\lim_{x \to 0} \frac{a^x - 1}{x} = \ln a \quad (a > 0)$$
$$\lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n = e$$
1.3 无穷小与无穷大
- 无穷小:极限为 0 的量
- 无穷大:趋向于无穷的量
- 等价无穷小替换($x \to 0$ 时):$\sin x \sim x$,$\tan x \sim x$,$e^x - 1 \sim x$,$\ln(1+x) \sim x$
fn main() {
// 验证 lim(x→0) sin(x)/x = 1
for &h in &[1e-1_f64, 1e-2_f64, 1e-4_f64, 1e-8_f64] {
println!("sin({:.0e})/{:.0e} = {:.10}", h, h, h.sin() / h);
}
// 越接近 0,结果越接近 1
}
二、导数(微分)
2.1 导数的定义
函数 $y = f(x)$ 在某点的导数:
$$f’(x) = \frac{dy}{dx} = \lim_{\Delta x \to 0} \frac{f(x+\Delta x) - f(x)}{\Delta x}$$
几何意义: 曲线在该点的切线斜率。
2.2 基本求导公式
| 函数 | 导数 |
|---|---|
| $(C)’$ | $0$(常数函数) |
| $(x^n)’$ | $nx^{n-1}$(幂函数) |
| $(\frac{1}{x})’$ | $-\frac{1}{x^2}$ |
| $(\sin x)’$ | $\cos x$ |
| $(\cos x)’$ | $-\sin x$ |
| $(\tan x)’$ | $\sec^2 x$ |
| $(\ln x)’$ | $\frac{1}{x}$ |
| $(\log_a x)’$ | $\frac{1}{x \ln a}$ |
| $(e^x)’$ | $e^x$ |
| $(a^x)’$ | $a^x \ln a$ |
2.3 微分基本运算法则
| 法则 | 公式 |
|---|---|
| 和 | $(u + v)’ = u’ + v’$ |
| 差 | $(u - v)’ = u’ - v’$ |
| 乘积 | $(uv)’ = u’v + uv’$ |
| 商 | $\left(\frac{u}{v}\right)’ = \frac{u’v - uv’}{v^2}$ |
| 链式法则 | $\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}$ |
fn main() {
// 数值求导:f(x) = sin(x) + x²
let f = |x: f64| x.sin() + x * x;
let h = 1e-8;
let x = 1.0;
// 数值导数
let numerical = (f(x + h) - f(x - h)) / (2.0 * h);
// 解析导数: cos(x) + 2x
let analytical = x.cos() + 2.0 * x;
println!("数值导数: {:.10}", numerical); // 2.5403023059
println!("解析导数: {:.10}", analytical); // 2.5403023059
}
2.4 高阶导数
高阶导数是导数的导数:
- 一阶导数:$f’(x)$(速度)
- 二阶导数:$f’’(x)$(加速度)
- 三阶导数:$f’‘’(x)$(急动度/Jerk)
$$f’’(x) = \frac{d}{dx}\left(\frac{d}{dx}f(x)\right) = \frac{d^2 f}{dx^2}$$
三、微分中值定理
3.1 罗尔定理
若 $f(x)$ 在 $[a,b]$ 上连续,在 $(a,b)$ 内可导,且 $f(a) = f(b)$,则在 $(a,b)$ 内至少存在一点 $\xi$,使得 $f’(\xi) = 0$。
3.2 拉格朗日中值定理
若 $f(x)$ 在 $[a,b]$ 上连续,在 $(a,b)$ 内可导,则在 $(a,b)$ 内至少存在一点 $\xi$,使得:
$$f’(\xi) = \frac{f(b) - f(a)}{b - a}$$
几何意义: 曲线上至少有一点处的切线平行于连接两端点的弦。
物理意义: 至少在某一时刻,瞬时速度等于平均速度。
3.3 柯西中值定理
若 $f(x)$ 和 $g(x)$ 都在 $[a,b]$ 上连续,在 $(a,b)$ 内可导,且 $g’(x) \neq 0$,则在 $(a,b)$ 内至少存在一点 $\xi$,使得:
$$\frac{f’(\xi)}{g’(\xi)} = \frac{f(b) - f(a)}{g(b) - g(a)}$$
四、洛必达法则
当 $\lim_{x \to a} \frac{f(x)}{g(x)}$ 为 $\frac{0}{0}$ 或 $\frac{\infty}{\infty}$ 型未定式时:
$$\lim_{x \to a} \frac{f(x)}{g(x)} = \lim_{x \to a} \frac{f’(x)}{g’(x)}$$
前提是右边的极限存在。
fn main() {
// 求 lim(x→1) sin(πx) / (x² - 1)
let f = |x: f64| (std::f64::consts::PI * x).sin();
let g = |x: f64| x * x - 1.0;
let x = 1.0;
let h = 1e-8;
// 直接代入是 0/0 型,使用洛必达法则
// f'(x) = πcos(πx), g'(x) = 2x
// lim = πcos(π) / 2 = -π/2
let limit = (f(x + h) - f(x - h)) / (2.0 * h) / ((g(x + h) - g(x - h)) / (2.0 * h));
println!("lim = {:.6}", limit); // -1.570796 ≈ -π/2
}
五、泰勒公式
泰勒公式用多项式逼近函数,是“以直代曲“的数学表达:
$$f(x) \approx f(a) + f’(a)(x-a) + \frac{f’‘(a)}{2!}(x-a)^2 + \frac{f’‘’(a)}{3!}(x-a)^3 + \cdots$$
当 $a = 0$ 时,称为麦克劳林公式:
$$f(x) \approx \sum_{n=0}^{\infty} \frac{f^{(n)}(0)}{n!} x^n$$
常用泰勒展开式:
$$\sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots$$
$$\cos x = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \cdots$$
$$e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots$$
$$\ln(1-x) = -\left(x + \frac{x^2}{2} + \frac{x^3}{3} + \frac{x^4}{4} + \cdots\right) \quad (|x| < 1)$$
fn taylor_sin(x: f64, terms: usize) -> f64 {
let mut sum = 0.0;
for n in 0..terms {
let power = 2 * n + 1;
let coeff = if n % 2 == 0 { 1.0 } else { -1.0 };
let factorial: f64 = (1..=power).map(|x| x as f64).product();
sum += coeff * x.powi(power as i32) / factorial;
}
sum
}
fn main() {
let x = std::f64::consts::PI / 4.0; // 45°
println!("标准库 sin(π/4) = {:.10}", x.sin());
println!("泰勒 3 项: {:.10}", taylor_sin(x, 3));
println!("泰勒 5 项: {:.10}", taylor_sin(x, 5));
println!("泰勒 10 项: {:.10}", taylor_sin(x, 10));
}
六、积分
6.1 不定积分
导数的逆运算。若 $F’(x) = f(x)$,则:
$$\int f(x) dx = F(x) + C$$
其中 $C$ 为积分常数。
6.2 定积分
$$\int_a^b f(x) dx = F(b) - F(a)$$
定积分的几何意义是曲线 $y = f(x)$ 与 $x$ 轴、$x = a$、$x = b$ 所围成区域的有向面积。
6.3 基本积分公式
| 被积函数 | 不定积分 |
|---|---|
| $\int k , dx$ | $kx + C$ |
| $\int x^n , dx$ | $\frac{x^{n+1}}{n+1} + C \quad (n \neq -1)$ |
| $\int \frac{1}{x} , dx$ | $\ln |
| $\int \sin x , dx$ | $-\cos x + C$ |
| $\int \cos x , dx$ | $\sin x + C$ |
| $\int \sec^2 x , dx$ | $\tan x + C$ |
| $\int e^x , dx$ | $e^x + C$ |
| $\int \ln x , dx$ | $x\ln x - x + C$ |
6.4 换元积分法
$$\int f(g(x)) \cdot g’(x) , dx = \int f(u) , du \quad (u = g(x))$$
6.5 分部积分法
$$\int u , dv = uv - \int v , du$$
七、微积分基本定理(牛顿-莱布尼茨公式)
若 $F(x)$ 是 $f(x)$ 在 $[a,b]$ 上的一个原函数(即 $F’(x) = f(x)$),则:
$$\int_a^b f(x) dx = F(b) - F(a)$$
辛普森积分法
fn simpson_integral(f: impl Fn(f64) -> f64, a: f64, b: f64, n: usize) -> f64 {
assert!(n % 2 == 0);
let h = (b - a) / n as f64;
let mut sum = f(a) + f(b);
for i in 1..n {
let x = a + i as f64 * h;
if i % 2 == 0 { sum += 2.0 * f(x); }
else { sum += 4.0 * f(x); }
}
sum * h / 3.0
}
fn main() {
// ∫₀¹ x² dx = 1/3
let result = simpson_integral(|x| x * x, 0.0, 1.0, 100);
println!("∫₀¹ x² dx = {:.10} (理论值: 0.3333333333)", result);
// ∫₀^π sin(x) dx = 2
let result2 = simpson_integral(|x| x.sin(), 0.0, std::f64::consts::PI, 100);
println!("∫₀π sin(x) dx = {:.10} (理论值: 2)", result2);
// ∫₀¹ e^x dx = e - 1
let result3 = simpson_integral(|x| x.exp(), 0.0, 1.0, 100);
println!("∫₀¹ e^x dx = {:.10} (理论值: {:.10})", result3, std::f64::consts::E - 1.0);
}
八、偏导数与梯度
8.1 偏导数
对于多元函数 $f(x_1, x_2, \ldots, x_n)$,对某个变量的偏导数是固定其他变量后对该变量的导数:
$$\frac{\partial f}{\partial x_i} = \lim_{\Delta x_i \to 0} \frac{f(x + \Delta x_i) - f(x)}{\Delta x_i}$$
8.2 梯度
梯度是所有偏导数组成的向量:
$$\nabla f = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n}\right)$$
梯度指向函数值增长最快的方向,其大小是最大增长率。
应用: 偏导数是机器学习模型训练的数学基础。在神经网络中,损失函数 $L$ 对权重 $w$ 的偏导数 $\nabla L(w)$,直接告诉我们应该如何调整权重才能让损失函数下降得最快。
8.3 反向传播
$$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w}$$
反向传播利用链式法则,从输出层向输入层逐层计算梯度。
九、牛顿二项式定理与杨辉三角
9.1 牛顿二项式定理
$$(a+b)^n = \sum_{k=0}^{n} \binom{n}{k} a^k b^{n-k}$$
9.2 组合数
$$\binom{n}{k} = \frac{n!}{k!(n-k)!}$$
9.3 杨辉三角的性质
- 每行数字之和为 $2^n$:$\sum_{k=0}^{n} \binom{n}{k} = 2^n$
- 对称性:$\binom{n}{k} = \binom{n}{n-k}$
- 递推关系:$\binom{n}{k} = \binom{n-1}{k-1} + \binom{n-1}{k}$
fn binomial(n: u64, k: u64) -> u64 {
if k > n { return 0; }
if k > n - k { k = n - k; } // 利用对称性优化
let mut result = 1u64;
for i in 0..k {
result = result * (n - i) / (i + 1);
}
result
}
fn print_pascal(rows: usize) {
for n in 0..rows {
for k in 0..=n {
print!("{:6}", binomial(n as u64, k as u64));
}
println!();
}
}
fn main() {
print_pascal(10);
}
十、极值问题
10.1 极值的判定
- 必要条件:若 $f(x)$ 在 $x_0$ 处可导且取得极值,则 $f’(x_0) = 0$
- 充分条件(第一判别法):$f’(x)$ 在 $x_0$ 两侧变号(左正右负为极大值,左负右正为极小值)
- 充分条件(第二判别法):$f’(x_0) = 0$ 且 $f’‘(x_0) < 0$ 为极大值,$f’’(x_0) > 0$ 为极小值
10.2 拉格朗日乘子法
用于求解带约束条件的极值问题:
$$\mathcal{L}(x, y, \lambda) = f(x, y) - \lambda \cdot g(x, y)$$
对 $x, y, \lambda$ 分别求偏导并令其为零,解方程组。
十一、蒙特卡洛方法
蒙特卡洛方法利用随机采样来近似计算确定性的数学问题。
用蒙特卡洛方法计算圆周率:
use rand::Rng;
use rand::RngExt;
fn monte_carlo_pi(samples: usize) -> f64 {
let mut rng = rand::rng(); // thread_rng() → rng()
let mut inside = 0;
for _ in 0..samples {
let x: f64 = rng.random_range(-1.0..1.0); // gen_range() → random_range()
let y: f64 = rng.random_range(-1.0..1.0);
if x * x + y * y <= 1.0 {
inside += 1;
}
}
4.0 * inside as f64 / samples as f64
}
fn main() {
let sample_sizes = [1000, 10000, 100000, 1000000];
for &n in &sample_sizes {
let pi_approx = monte_carlo_pi(n);
println!("{n:>7} 次采样: π ≈ {pi_approx:.6}");
}
}
十二、总结
| 概念 | 要点 |
|---|---|
| 极限 | 函数值无限接近某个值 |
| 导数 | 变化率,切线斜率 |
| 求导法则 | 和差积商、链式法则 |
| 中值定理 | 罗尔、拉格朗日、柯西 |
| 洛必达法则 | 0/0 或 ∞/∞ 型未定式 |
| 泰勒公式 | 多项式逼近函数 |
| 不定积分 | 导数的逆运算 |
| 定积分 | 面积,牛顿-莱布尼茨公式 |
| 偏导数 | 多元函数对某个变量的导数 |
| 梯度 | 偏导数向量,指向增长最快方向 |
微积分是理解连续变化的数学工具。从物理中的运动分析,到机器学习中的梯度下降,微积分的思想无处不在。
练习建议:
- 用数值方法验证泰勒公式的精度
- 实现蒙特卡洛方法计算定积分
- 用梯度下降法求解函数的极小值
学习资源
| 资源 | 说明 |
|---|---|
| 3Blue1Brown - 微积分的本质 | 微积分可视化教程 |
| 3Blue1Brown B站 | 中文字幕版 |
| 微积分的本质 | B站系列 |