5.5 一元积分学与微积分基本定理
微分回答的是「局部怎么变」,积分回答的是「整体累积了多少」。把一条曲线下的面积切成一列窄矩形再求和,这是积分最初的想法;把总位移看成速度对时间的累积,这是积分的物理含义。上一节末尾出现的积分余项
本节的组织沿三条线索展开。定义线索是 Riemann 积分:分割、求和的极限,可积性的判别(Darboux 上下和),以及可积函数类的刻画。定理线索是微积分基本定理:变上限积分的导数等于被积函数,由此得到 Newton-Leibniz 公式,把求积分化为求原函数,微分与积分从此互为逆运算。推广线索把积分推向两类反常情形:无穷区间与无界函数,判敛工具是比较判别法,条件收敛的例子来自
5.5.1 Riemann 积分
分割、Riemann 和与定义
设
记小区间长度
令分割的细度
Riemann 和的几何含义是「一列窄矩形面积之和」,积分的几何含义是曲边梯形的面积。当
Darboux 上下和与可积判别
定义中的极限要求对所有取点方式成立,直接验证很麻烦。Darboux 用最值的上下界把取点的自由度消掉:记
任何 Riemann 和都夹在
即上下和之差可以任意小。证明的要点是加细分割时上和不增、下和不减,两者的极限(上积分与下积分)存在,可积等价于两个极限相等。这条准则把「极限与取点无关」的要求替换成「一种分割就能把振幅压小」的可操作条件,后续所有可积性的证明都从它出发。
可积函数类
由 Darboux 准则可以证明三类函数的可积性:
- 连续函数:闭区间上连续则一致连续(5.3 节),把区间取得足够细可使每个小区间上的振幅
一致地小于 ,于是 。 - 单调函数:单调函数在每个小区间上的振幅总和被总变差
控制, ,细度足够小即可。 - 有界且间断点有限的函数:把间断点附近的小区间单独拿出来(总长度可以任意小),其余部分按连续函数处理。
更一般的刻画是 Riemann-Lebesgue 定理:有界函数 Riemann 可积,当且仅当它的间断点集是零测集(零测集指可以用总长度任意小的区间覆盖的集合,5.10 节会给出严格定义)。这个定理说明间断点可以有无穷多个,只要它们足够稀少。相应的反面例子是 Dirichlet 函数:有理点取
三条常用性质:改变有限个点的函数值不影响积分值(零测集上的差异不改变上下和);
5.5.2 微积分基本定理
变上限积分
设
两条性质把积分与微分接通。
连续性:
可导性:若
证明用差商的估值:
与微分学中值定理的对照
5.4 节的积分余项
Newton-Leibniz 公式
设
这就是微积分基本定理(Newton-Leibniz 公式)。证明由「原函数相差常数」得到:
公式的意义在于计算方式的转换:积分的定义是「分割求和的极限」,直接计算需要处理无穷过程;有了原函数,一次求值相减即可得到结果。代价是求原函数并不总有初等表达:
两个基本技巧是求原函数的常规工具。
换元积分:
方向是「把复杂的被积函数通过替换化简」。例:
分部积分:
来源是乘积求导法则
这个值在练习题中还会以数值求积的方式复算一次。分部积分在理论上的用途更广:Gamma 函数的递推公式、含参积分的估计、弱导数的定义都由它导出。
5.5.3 反常积分
Riemann 积分要求区间有界、函数有界。两类越界的情形可以分别定义极限来救回:无穷区间与无界函数。
无穷区间上的积分
设
右端极限存在(有限)时称积分收敛,否则称发散。典型例子是
无界函数的积分
设
典型例子是
阈值与无穷区间的情形恰好相反。原因在于两类反常的尺度不同:无穷远处考察的是衰减是否快于
比较判别法与条件收敛
判断收敛不需要算出积分值,用已知的
绝对收敛与条件收敛:
它的收敛由 Dirichlet 判别法保证:被积函数写成
一个提醒:Cauchy 主值与收敛是两件事。对称截断
5.5.4 Gamma 与 Beta 函数
Gamma 函数把阶乘推广到连续参数:
这个积分同时带有两类反常:
两条基本性质:
递推:由分部积分(取
结合
特殊值
Beta 函数定义为
它与 Gamma 函数的关系是
Stirling 公式给出阶乘的渐近展开:
第一项之后的修正是
与概率论一章的连接
5.5.5 数值求积
原函数可用初等函数表示的情形在应用中占少数,数值求积(quadrature)承担其余的计算。基本做法是用简单的近似积分替换原积分:在区间上取若干节点,用节点值的加权和作为积分近似。
插值型求积:用
中点公式:
梯形公式:
Simpson 公式:
中点与梯形的误差系数是
复化格式:把
误差阶分别是
Gauss 求积走另一条路线:节点不预先等距,而是与权重一起挑选,让误差的自由度最大。
代数精度达到
对光滑函数,Gauss 求积的误差随
选型经验:被积函数光滑、需要高精度、求值代价高(一次函数求值对应一次仿真或一次实验测量)时选 Gauss 求积;函数在网格上采样得到、或含有轻微的端点效应时用复化 Simpson(无奇性)与复化梯形(周期函数,谱精度);只需要低精度快速估计时用中点或梯形,并配合 Richardson 外推提高两阶精度。
5.5.6 数值实验
实验一:求积公式的误差阶
计算
import math
import numpy as np
def midpoint(f, a, b, n):
x = a + (np.arange(n) + 0.5) * (b - a) / n
return (b - a) / n * float(np.sum(f(x)))
def trapezoid(f, a, b, n):
x = np.linspace(a, b, n + 1)
y = f(x)
return (b - a) / n * float(0.5 * (y[0] + y[-1]) + np.sum(y[1:-1]))
def simpson(f, a, b, n):
x = np.linspace(a, b, n + 1)
y = f(x)
return (b - a) / (3 * n) * float(y[0] + y[-1] + 4 * np.sum(y[1:n:2]) + 2 * np.sum(y[2:n:2]))
def gauss(f, a, b, n):
x, w = np.polynomial.legendre.leggauss(n)
t = 0.5 * (b - a) * x + 0.5 * (a + b)
return 0.5 * (b - a) * float(np.sum(w * f(t)))
f = np.exp
exact = math.e - 1.0
print(f"I = int_0^1 e^x dx = e - 1 = {exact:.15f}")
ns = [2, 4, 8, 16, 32, 64, 128]
err_mid, err_trp, err_smp = [], [], []
print(f"{'n':>5} {'中点误差':>13} {'阶':>5} {'梯形误差':>13} {'阶':>5} {'Simpson 误差':>13} {'阶':>5}")
for i, n in enumerate(ns):
em = abs(midpoint(f, 0, 1, n) - exact)
et = abs(trapezoid(f, 0, 1, n) - exact)
es = abs(simpson(f, 0, 1, n) - exact)
err_mid.append(em)
err_trp.append(et)
err_smp.append(es)
om = f"{math.log2(err_mid[i-1] / em):.2f}" if i else "-"
ot = f"{math.log2(err_trp[i-1] / et):.2f}" if i else "-"
os_ = f"{math.log2(err_smp[i-1] / es):.2f}" if i else "-"
print(f"{n:>5} {em:>13.4e} {om:>5} {et:>13.4e} {ot:>5} {es:>13.4e} {os_:>5}")
print("Gauss-Legendre 求积(n 个节点,不分段)")
for n in range(1, 9):
e = abs(gauss(f, 0, 1, n) - exact)
print(f"{n:>5} {e:>13.4e}")输出:
I = int_0^1 e^x dx = e - 1 = 1.718281828459045
n 中点误差 阶 梯形误差 阶 Simpson 误差 阶
2 1.7769e-02 - 3.5649e-02 - 5.7932e-04 -
4 4.4665e-03 1.99 8.9401e-03 2.00 3.7013e-05 3.97
8 1.1182e-03 2.00 2.2368e-03 2.00 2.3262e-06 3.99
16 2.7964e-04 2.00 5.5930e-04 2.00 1.4559e-07 4.00
32 6.9915e-05 2.00 1.3983e-04 2.00 9.1027e-09 4.00
64 1.7479e-05 2.00 3.4958e-05 2.00 5.6897e-10 4.00
128 4.3698e-06 2.00 8.7396e-06 2.00 3.5562e-11 4.00
Gauss-Legendre 求积(n 个节点,不分段)
n 误差
1 6.9561e-02
2 3.8545e-04
3 8.2409e-07
4 9.3297e-10
5 6.5370e-13
6 0.0000e+00
7 2.2204e-16
8 2.2204e-16三段数据分别对应三种公式的误差阶。中点与梯形的阶列稳定在
Simpson 的阶列从
Gauss 求积的误差下降速度明显快于任何固定阶:
实验二:Stirling 近似的精度阶梯
比较 math.lgamma(Gamma 函数的对数,内部实现避免了
import math
print(f"{'n':>6} {'ln(n!) 精确值':>16} {'Stirling':>16} {'误差':>11} {'n*误差':>10} "
f"{'加 1/(12n) 修正':>16} {'误差':>11}")
for n in [5, 10, 20, 50, 100, 200, 500, 1000]:
ex = math.lgamma(n + 1)
st = n * math.log(n) - n + 0.5 * math.log(2 * math.pi * n)
st2 = st + 1.0 / (12.0 * n)
print(f"{n:>6} {ex:>16.12f} {st:>16.12f} {abs(st - ex):>11.3e} {n * abs(st - ex):>10.4f} "
f"{st2:>16.12f} {abs(st2 - ex):>11.3e}")输出:
n ln(n!) 精确值 Stirling 误差 n*误差 加 1/(12n) 修正 误差
5 4.787491742782 4.770847051592 1.664e-02 0.0832 4.787513718259 2.198e-05
10 15.104412573076 15.096082009642 8.331e-03 0.0833 15.104415342975 2.770e-06
20 42.335616460753 42.331450141061 4.166e-03 0.0833 42.335616807728 3.470e-07
50 148.477766951773 148.476100307326 1.667e-03 0.0833 148.477766973993 2.222e-08
100 363.739375555563 363.738542225008 8.333e-04 0.0833 363.739375558341 2.778e-09
200 863.231987192405 863.231570526086 4.167e-04 0.0833 863.231987192753 3.472e-10
500 2611.330458460156 2611.330291793512 1.667e-04 0.0833 2611.330458460178 2.228e-11
1000 5912.128178488163 5912.128095154832 8.333e-05 0.0833 5912.128178488166 2.728e-12数据验证了修正项的结构。未修正的 Stirling 近似误差与
实用提醒:lgamma 才能处理
实验三:反常积分的判敛与 Gamma 函数
三组数据分别对应无穷区间、无界函数与 Gamma 函数。第一部分打印
import math
import numpy as np
def simpson(f, a, b, n):
x = np.linspace(a, b, n + 1)
y = f(x)
return (b - a) / (3 * n) * float(y[0] + y[-1] + 4 * np.sum(y[1:n:2]) + 2 * np.sum(y[2:n:2]))
print("(a) 无穷区间:int_1^R x^(-p) dx 的部分积分值")
ps = [2.0, 1.5, 1.1, 1.0, 0.9]
print(f"{'R':>10} " + " ".join(f"{'p=' + str(p):>13}" for p in ps))
for k in range(1, 7):
R = 10.0 ** k
vals = []
for p in ps:
if abs(p - 1.0) < 1e-15:
vals.append(math.log(R))
else:
vals.append((1.0 - R ** (1.0 - p)) / (p - 1.0))
print(f"{R:>10.0e} " + " ".join(f"{v:>13.6f}" for v in vals))
print("(b) 无界函数:int_0^1 x^(-1/2) dx = 2")
bad = simpson(lambda x: x ** -0.5, 0.0, 1.0, 100)
print(f" 直接对 [0, 1] 用 Simpson(n = 100):{bad}")
print("(c) Gamma 函数:Gamma(1/2) = sqrt(pi)")
for n in [16, 32, 64, 128]:
val = 2.0 * simpson(lambda u: np.exp(-u * u), 0.0, 8.0, n)
print(f" n = {n:>3}: {val:.15f},与 sqrt(pi) 的差 = {abs(val - math.sqrt(math.pi)):.3e}")输出:
(a) 无穷区间:int_1^R x^(-p) dx 的部分积分值
R p=2.0 p=1.5 p=1.1 p=1.0 p=0.9
1e+01 0.900000 1.367544 2.056718 2.302585 2.589254
1e+02 0.990000 1.800000 3.690427 4.605170 5.848932
1e+03 0.999000 1.936754 4.988128 6.907755 9.952623
1e+04 0.999900 1.980000 6.018928 9.210340 15.118864
1e+05 0.999990 1.993675 6.837722 11.512925 21.622777
1e+06 0.999999 1.998000 7.488114 13.815511 29.810717
(b) 无界函数:int_0^1 x^(-1/2) dx = 2
直接对 [0, 1] 用 Simpson(n = 100):inf
(c) Gamma 函数:Gamma(1/2) = sqrt(pi)
n = 16: 1.772392732931804,与 sqrt(pi) 的差 = 6.112e-05
n = 32: 1.772453850905516,与 sqrt(pi) 的差 = 0.000e+00
n = 64: 1.772453850905516,与 sqrt(pi) 的差 = 0.000e+00
n = 128: 1.772453850905516,与 sqrt(pi) 的差 = 0.000e+00第一段数据里两种收敛的对比很鲜明。
第二段是端点奇性的处理。inf(浮点除零)。换元
奇性被换元消掉,被积函数成为常数,任何求积公式都精确。这条技巧的适用范围很广:
第三段验证 math.sqrt(math.pi) 完全一致的双精度结果(差值显示为
5.5.7 本节小结
积分学的三层内容
本节把一元积分学组织为三层。定义层是 Riemann 积分:分割求和的极限,Darboux 上下和把它转化为可操作判别(inf,换元后可精确计算)。
积分把「累积」说清楚了,下一节处理一个新的对象:函数的序列与级数。有限维的向量可以讨论极限,函数之间也可以,但函数的「靠近」有多种含义:逐点收敛与一致收敛的差别决定了极限运算能否与积分、求导交换次序,这是逼近理论、数值分析与后续 Fourier 分析的前提。
练习题
第 1 题 概念推导
(a) 用 Darboux 准则说明 Dirichlet 函数在
参考答案
(a) Dirichlet 函数
与分割无关,恒为区间长度
(b) 设
即
(c) 两个积分的收敛都由「部分积分的极限是否存在」决定,而极限的障碍在相反的一端。
第 2 题 计算推理
(a) 用分部积分计算
参考答案
(a) 分部积分(取
梯形公式:
(b) 对
(c) 复化梯形误差
约
第 3 题 代码验证
用本节代码做三组实验并解释:(a) 把实验一的被积函数换成
参考答案
(a) 阶不变。误差阶由公式本身的代数精度决定,与被积函数的具体选择无关(只要函数的光滑性满足误差公式的要求):中点与梯形仍是
(b)
(c) 尾部估计:
第 4 题 综合应用
某计算程序需要反复调用
参考答案
方案一:复化 Simpson。误差公式
方案二:Gauss-Legendre。
方案三:Taylor 级数。
交错级数的余项被首项控制:截到
推荐:方案二最合适。它的函数求值次数(20 次)与方案三(15 项)同量级,但节点权重预计算后单次调用只有加权求和,适合
常见错误
错误 1 · 把两类反常积分的判敛阈值记反
原因:
解决:判断时先定位反常在哪里(无穷端还是奇点端),再对照「
错误 2 · 用截断数值结果判断反常积分收敛
原因:慢收敛的积分在有限截断上看起来「差不多稳定」。实验三的数据:
解决:用尾部解析估计代替截断观察。对
错误 3 · 把「可积」「有原函数」「原函数是初等函数」混为一谈
原因:三件事互相独立。Riemann 可积只要求有界与间断点足够少;有原函数指存在函数
解决:分层确认。先确认被积函数是否有界、间断点是否为零测集(可积性),再确认是否有初等原函数(决定能否用 Newton-Leibniz 手算),两者都不成立时回到数值求积。报告中区分「精确值」与「数值近似」,
错误 4 · 对含端点奇性的被积函数直接套用标准求积公式
原因:中点、梯形、Simpson、Gauss-Legendre 的误差公式都假设被积函数在区间上足够光滑(Simpson 要求四阶导数有界,Gauss 的快速收敛依赖解析性)。inf(浮点除零,实验三第二段)或者收敛极慢(对数奇性的收敛阶只有 inf 或 nan 之后把节点略微内移再计算,会得到一个「看起来正常」但系统性偏低的数值(截断误差以幂律或对数律衰减,实验三第二段的数据显示
解决:先做奇性分析(找出发散点、判断发散速度),再选择处理方式:幂次换元(如