11.2 积分与数值积分:从局部速率到累计总量
监控系统每分钟记录一次请求速率,业务却问一天处理了多少请求;概率模型给出的是密度,产品却关心某个区间内发生事件的概率。两类问题都在把局部速率累积成总量。
本课目标
- 区分不定积分与定积分;
- 用微积分基本定理连接导数和积分;
- 理解概率密度、累计量与面积的关系;
- 比较矩形法、梯形法和采样误差。
1. 定积分是和的极限
取
当最大子区间长度趋于零,若所有取点方式的和趋向同一极限,就得到定积分:
若
单位检查很有帮助:若
2. 不定积分是一族原函数
若
微积分基本定理的一组常用充分条件是:
它并不是说所有函数都有容易写出的初等原函数。许多实际积分只能用特殊函数或数值方法计算。
3. 概率密度不是点概率
本节假设随机变量
区间概率为:
在有密度的分布中,单点概率
累计分布函数是:
在密度
例如
4. 采样数据只能近似积分
若只有离散监控点,可以用梯形法:
from collections.abc import Sequence
from math import fsum, isfinite
def trapezoidal_integral(
times: Sequence[float], rates: Sequence[float], max_gap=None
) -> float:
if len(times) != len(rates) or len(times) < 2:
raise ValueError("need equal lengths and at least two points")
if not all(isfinite(x) for x in times) or not all(isfinite(r) for r in rates):
raise ValueError("observations must be finite")
gaps = [right - left for left, right in zip(times, times[1:])]
if any(gap <= 0 for gap in gaps):
raise ValueError("timestamps must be strictly increasing")
if max_gap is not None:
if not isfinite(max_gap) or max_gap <= 0:
raise ValueError("max_gap must be positive and finite")
if any(gap > max_gap for gap in gaps):
raise ValueError("gap exceeds the interpolation limit")
return fsum((left / 2 + right / 2) * gap
for left, right, gap in zip(rates, rates[1:], gaps))
seconds = [0, 60, 120, 180]
requests_per_second = [10, 14, 13, 9]
print(trapezoidal_integral(seconds, requests_per_second, max_gap=90)) # 2190.0这个结果依赖采样假设:相邻观测之间用直线连接。若中间发生尖峰,低频采样可能完全错过。增加算法精度不能弥补原始数据没有观测到的变化。
这份 Python 3.9+ 代码得到 180 秒内约 2,190 次请求,允许不等距采样,但拒绝 NaN、无穷值和非递增时间戳。max_gap=90 明确拒绝跨越超过 90 秒的缺口做插值;它没有偷偷把缺测当零。这个阈值要由采集频率和业务容忍度确定,练习可改成其他策略。有限输入也不保证任意巨大数值的中间运算都不会溢出。
常见数值积分方法包括:
以下阶数比较默认在固定区间上等距加密且函数足够光滑;中点法和梯形法通常是二阶,复合 Simpson 法在分段数为偶数、四阶导数有界时是四阶。自适应算法的误差估计也可能漏掉未采到的窄峰。
| 方法 | 区间内假设 | 特点 |
|---|---|---|
| 左/右矩形法 | 函数值保持不变 | 简单;单调函数可判断偏差方向 |
| 中点法 | 用中点代表区间 | 通常比端点矩形更准 |
| 梯形法 | 相邻点间线性变化 | 适合已有离散样本 |
| Simpson 法 | 局部二次近似 | 对光滑函数精度更高 |
| 自适应积分 | 在难点处细分 | 控制估计误差,但成本变化 |
5. 误差来自不止一个地方
数值积分至少要区分:
- 建模误差:真实过程并不等于选定函数;
- 采样误差:观测频率不足,或忽略了实际不等距的时间间隔;
- 离散化误差:有限分割近似连续积分;
- 舍入误差:浮点累计造成的偏差。
缩小步长通常降低离散化误差,却增加计算量和浮点运算次数。选择方法时要结合函数平滑性、误差目标和计算预算,而不是只比较公式阶数。
对 x² 在 [0,1] 上的积分,真值为 1/3。下面用 Python 3 精确分数计算有符号误差,只在显示时转成浮点数:
from fractions import Fraction as F
for n in [4, 8, 16]:
h = F(1, n)
left = h * sum((i * h) ** 2 for i in range(n))
midpoint = h * sum(((i + F(1, 2)) * h) ** 2 for i in range(n))
trapezoid = left + h / 2 # f(1) - f(0) = 1
print(n, f"{float(left-F(1,3)):.6f}",
f"{float(midpoint-F(1,3)):.6f}", f"{float(trapezoid-F(1,3)):.6f}")
# 4 -0.114583 -0.005208 0.010417
# 8 -0.059896 -0.001302 0.002604
# 16 -0.030599 -0.000326 0.000651分段数翻倍时,中点与梯形误差缩为四分之一。本例梯形误差恰为 1/(6n²),中点误差为 -1/(12n²);左矩形误差主要按 1/n 缩小。误差阶描述加密趋势,不保证任意函数、任意网格都遵循这组数字。
6. 在软件系统中看见积分
- 请求速率随时间积分得到请求总数;
- 功率随时间积分得到能量;
- 概率密度在区间积分得到概率;
- 速度随时间积分得到位移;
- 连续现金流贴现后积分得到现值。
有些系统用计数器直接记录累计量,比对速率曲线再积分更可靠。但计数器会重置、溢出或丢失,仍需处理数据质量。数学工具不能替代对采集机制的理解。
常见误区
- 积分永远是正面积:定积分带符号。
- 密度值就是概率:连续分布的区间概率才由密度积分得到。
- 采样更密就一定更准:传感器偏差和模型误差不会自动消失。
- 有解析公式就无需数值考虑:公式在浮点实现中仍可能溢出、消减或精度不足。
练习
- 由速度
求 到 的位移。 - 用矩形法和梯形法近似
,比较不同步长的误差。 - 解释为什么
[0,1]上的均匀分布落在[0,0.5]的概率是0.5,但任一单点概率是零。 - 为监控积分代码增加缺测区间策略,并说明它隐含的业务假设。
小结
导数把整体过程切到局部,积分把局部速率重新累积为总量。计算机面对的是有限样本和有限精度,因此数值积分的答案总要连同采样方式、近似方法与误差假设一起解释。
后续优化内容会把局部坡度用于选择更新方向,并继续处理步长、噪声与停止条件。