☰
从等差等比求和到级数收敛:p级数、调和级数与斜率
2026/10/31 12:59:39 网站建设 项目流程

整理旧笔记的时候翻到一页,上面密密麻麻挤着几个词:级数、p 级数、q 级数、调和级数、等比数列求和、等差数列求和、斜率。当时是为了给一个刚接触极限的同学讲清楚"为什么 1+1/2+1/3+… 会跑到无穷大",结果越讲越发散,从数列求和讲到收敛判别,最后连斜率和导数都扯了进来。后来我把这一页重新整理了一遍,发现它们根本不是七个孤立的知识点,而是同一条链上的七个扣:数列负责"列出数",求和负责"把数加起来",级数负责"加到无穷",收敛判别负责"判断加到无穷有没有意义",斜率负责"看增长速度"。

这篇就按我实际的整理顺序写,从等差等比求和一路推到调和级数的发散证明,再把斜率这条线接上去。适合三类人看:正在学高等数学但被级数绕晕的;准备考试需要把判别法一次性理清的;以及写代码做数值计算、结果发现"怎么算都不收敛"想搞清楚原因的。全程给推导、给数字、给能直接跑的代码,遇到容易错的地方我会明确标出来。

1. 先把地图画出来:这七个概念是怎么串起来的

1.1 一条主线:从"数列"到"级数"再到"收敛性"

数列是一列按顺序排好的数,记作 a_1, a_2, a_3, …,本质是一个定义在正整数上的函数。这里最关键的一点是:数列是一个"函数",所以它能画图、能求斜率、能谈增长快慢。很多人学数列只记公式,把它当成一堆需要套的模板,结果一遇到级数就完全接不上——因为级数恰恰是在数列的"函数属性"上做文章的。

级数是把数列的项一项一项加起来:S_n = a_1 + a_2 + … + a_n 叫部分和,部分和本身又构成一个新数列 {S_n}。如果这个新数列有极限 S,就说级数收敛,记作 Σa_n = S;如果没有极限,就说发散。注意这里有个思维跳跃:我们从"加有限多项"跳到了"加无限多项",而"无限多项相加"在数学上是没有天然定义的,只能通过"部分和的极限"来定义。这一步是整个级数理论的根,绕不过去。

搞清这条主线之后,等差求和、等比求和就不再是两套独立的公式,而是"求部分和"这件事的两个最基础样例。等差的部分和是一个二次函数,等比的部分和是一个指数型表达式,这两类表达式的行为完全不同,直接决定了对应级数收不收敛。

1.2 为什么"斜率"会出现在这份清单里

初看斜率像是几何的内容,跟级数没关系。但只要把数列当成函数看,斜率立刻就有了意义:等差数列的点 (n, a_n) 全部落在一条直线上,这条直线的斜率就是公差 d;等比数列取对数之后,点 (n, ln a_n) 也落在一条直线上,斜率是 ln q。这一步转换非常实用——它把"数列增长有多快"这件模糊的事,变成了一个可计算的具体数字。

而级数收敛与否,本质上就是在问"通项衰减得够不够快"。衰减速度用什么衡量?用斜率,或者更准确地说,用导数的量级。p 级数的通项 n^(-p) 在对数坐标下的斜率是 -p,这个 -p 和 1 的大小关系,直接决定了收敛还是发散。所以斜率和级数不是两件事,斜率是判断级数收敛性的一把直观尺子。

1.3 学习顺序与取舍:先算什么、后想什么

我的建议顺序是:先把等差、等比两个求和公式推到能自己默写出来(不是背,是推),然后建立"部分和"的概念,接着用等比级数 |q|<1 作为第一个收敛的例子,再用调和级数作为第一个发散的例子。有了这一正一反两个锚点,再去学 p 级数、比较判别法、积分判别法,就不会觉得判别法是天上掉下来的规则。

反过来,如果一上来就背"p>1 收敛,p≤1 发散",会遇到一个很典型的问题:做题时会用,但一被问"为什么 p=1 是分界线"就答不上来。这条分界线其实来自一个非常朴素的比较——求和和积分比大小,而 ∫dx/x 恰好是对数,对数在无穷远处发散,所以卡在 p=1 这个位置。下面第 4 节会把这段推完。

2. 等差数列与等比数列:两个求和公式的推导与取舍

2.1 等差数列求和:倒序相加为什么必然成立

等差数列的通项是 a_n = a_1 + (n-1)d,前 n 项和记作 S_n。求和的经典手法是"倒序相加":把 S_n 正着写一遍,再倒着写一遍,两式相加,每一对的和都等于 a_1 + a_n。因为第 k 项 a_k 和第 n+1-k 项的和恒为 a_1 + a_n,这是等差结构带来的对称性,不是巧合。

于是 2S_n = n(a_1 + a_n),得到 S_n = n(a_1 + a_n)/2。把 a_n 展开还能得到第二个形式:S_n = n·a_1 + n(n-1)d/2。

这两个形式各有用途,别混用。已知首项和末项时用第一个最省事;已知首项和公差、且 n 比较大时用第二个更直接。我见过不少人在只知道 a_1 和 d 的情况下去硬求 a_n,多算一步还容易错。

从函数角度看,S_n = (d/2)n² + (a_1 - d/2)n,是一个关于 n 的二次函数且常数项为 0。这一点很重要:等差数列的部分和是二次增长。二次增长意味着 S_n/n → ∞,所以任何公差不为零的等差数列,其对应级数一定发散(通项都不趋于 0,连必要条件都不满足)。

2.2 等比数列求和:错位相减法与 q=1 这个必踩的坑

等比数列通项 a_n = a_1·q^(n-1)。求和用"错位相减":写出 S_n,两边乘 q 得到 qS_n,两式相减,中间项全部抵消,剩下 S_n - qS_n = a_1 - a_1·q^n。于是

  • 当 q ≠ 1 时,S_n = a_1(1 - q^n)/(1 - q)
  • 当 q = 1 时,S_n = n·a_1

q = 1 必须单独讨论,这是最高频的低级错误。因为推导过程中除以了 (1-q),q=1 时这个除法没有意义。写代码的时候同理,函数里必须有一个 if 分支处理 q == 1,否则会出现除零或者返回 NaN。

还有一个变体形式 S_n = a_1(q^n - 1)/(q - 1),和上面那个是等价的,只是分子分母同乘了 -1。两种写法都行,但同一道题里不要来回换,容易符号出错。

2.3 无穷等比级数的收敛条件:|q|<1 到底怎么来的

把 S_n 的表达式取极限,关键在于 q^n 的行为:

q 的取值范围q^n 的极限级数 Σa_1q^(n-1) 的结论
|q| < 10收敛,和为 a_1/(1-q)
q = 1恒为 1发散(部分和为 n·a_1)
q = -1在 1 和 -1 之间震荡发散(部分和在 a_1 和 0 之间跳)
|q| > 1绝对值趋于无穷发散(通项都不趋于 0)

这张表值得背下来,因为它是后面所有判别法的"标准对照物"。做比较判别法的时候,我们经常就是拿待判级数去和某个等比级数比,比的依据就是这张表。

再补一句容易被忽略的:|q|<1 时虽然收敛,但收敛的"质量"差别很大。q=0.9 时和是 a_1/0.1 = 10a_1,q=0.1 时和约等于 1.11a_1。同样是收敛,前者需要几千项才能看出稳定,后者三五项就够了。这个"收敛速度"的问题在第 8 节的代码里会看得很清楚。

2.4 一张表把等差、等比彻底对比清楚

对比项等差数列等比数列
通项a_n = a_1 + (n-1)da_n = a_1·q^(n-1)
相邻项关系差恒定比恒定
前 n 项和n(a_1+a_n)/2a_1(1-q^n)/(1-q),q≠1
部分和的增长类型二次型指数型(q≠1)
对应无穷级数必发散(d≠0)|q|<1 收敛,其余发散
图像特征离散点共线,斜率 d取对数后共线,斜率 ln q
典型误用忘记 n 的取值从 1 还是 0 开始忘记 q=1 的特判

这张表我建议自己手抄一遍。抄的过程会发现一个问题:等比的"比恒定"和等差的"差恒定",在对数变换下是可以互换的——等比取对数就变等差。这个对称性是理解后面"对数坐标下等比是直线"的关键。

3. 级数的基本规矩:收敛、发散与"通项趋于零"的误解

3.1 级数与部分和:把无穷多项压成一个数列

再强调一次定义,因为它是后面所有判断的依据:Σa_n 收敛,当且仅当部分和数列 {S_n} 有有限极限。这个定义的好处是把"无穷"这件玄乎的事,转化成了"数列极限"这件已经有完整工具的事。

由此立刻能得到一条性质:级数收敛,则通项 a_n → 0。因为 a_n = S_n - S_(n-1),两个收敛数列相减,极限是 S - S = 0。这条性质是"必要条件",也就是说它只能用来否定,不能用来肯定。

很多人的思维惯性是反过来的:看到 a_n → 0 就认为级数收敛。这是级数这一章最典型的误判。反面例子就是调和级数——通项 1/n 确实趋于 0,但级数发散。这个反例的存在,使得"判断收敛"必须依赖更强的工具,而不是看一眼通项。

3.2 收敛的必要条件与常见误判

把上面这条整理成可操作的话:

  • 如果 a_n 不趋于 0,级数一定发散,可以直接下结论,不用再算。这个判别法叫"通项判别法"或"第 n 项判别法",是性价比最高的第一步。
  • 如果 a_n 趋于 0,什么也不能说,必须换工具。可能是收敛(如 1/n²),也可能是发散(如 1/n)。

我在实际做题和讲题时形成的一个习惯是:拿到一个级数,先用 30 秒看通项。通项里如果含有 (-1)^n 之外还在增长的东西,比如 n/(n+1) 这种极限为 1 的,直接判发散;通项是 n 的有理式,就去比最高次幂(本质上就是 p 级数比较);通项含阶乘或 n 的 n 次方,优先试比值判别法。

3.3 判别法工具箱:什么时候用哪一把

判别法适用形态判断依据使用注意
通项判别法任意a_n 不趋于 0 则发散只能判发散
比较判别法通项为正、结构接近 p 级数或等比与已知收敛/发散级数比大小必须同号,通常取正项
极限比较判别法通项含 n 的有理式、根式lim a_n/b_n = c ∈ (0,∞) 则同敛散选 b_n 是关键,通常取最高次幂
比值判别法含阶乘、n 次幂、连乘lim a_(n+1)/a_n = LL=1 时失效,需换法
根值判别法通项整体是 n 次方lima_n
积分判别法通项可写成 f(n),f 单调递减为正级数与 ∫f(x)dx 同敛散要求单调递减,别漏判
莱布尼茨判别法交错级数通项单调递减趋于 0 则收敛只给收敛,不给和

这张表里最需要心理准备的是:比值法和根值法在 L=1 时完全失效。而 p 级数恰好全都落在 L=1 上,这就是为什么 p 级数必须用积分判别法或比较判别法来处理,用比值法会得到 L=1,白算一场。这个"失效"不是方法不好,是因为 p 级数正处在收敛与发散的临界带上,临界带上的问题本来就需要更精细的工具。

4. p 级数:一个参数决定生死的样本

4.1 p 级数的定义与结论

p 级数指形如 Σ 1/n^p(n 从 1 到无穷)的级数,其中 p 是实参数。结论很干脆:

  • p > 1 时收敛
  • p ≤ 1 时发散
  • p = 1 时就是调和级数,发散(虽然是最慢的发散之一)

这个结论值得反复咀嚼,因为它给出了"衰减速度"的精确门槛。n^(-p) 的衰减要"足够快",快到什么程度?快到 p 严格大于 1。p = 1.0001 都收敛,p = 1 就发散。这个临界性在数学上很常见,但直觉上很难接受——毕竟 1/n^1.0001 和 1/n 只差了一点点。

4.2 用积分判别法把结论推一遍

设 f(x) = 1/x^p,在 [1, ∞) 上为正、连续、单调递减(p>0 时)。积分判别法说的是:Σf(n) 与 ∫_1^∞ f(x)dx 同敛散。原因是矩形面积夹逼——左矩形面积和 ≤ 积分 ≤ 右矩形面积和,两边只差一个首项。

具体算积分:

  • p ≠ 1 时,∫_1^N x^(-p)dx = [x^(1-p)/(1-p)]_1^N = (N^(1-p) - 1)/(1-p)
  • p = 1 时,∫_1^N dx/x = ln N

于是:p > 1 时,1-p < 0,N^(1-p) → 0,积分收敛到 1/(p-1);p < 1 时,1-p > 0,N^(1-p) → ∞,积分发散;p = 1 时,ln N → ∞,积分发散。

这段推导是整个级数章节里最值得亲自动手写一遍的,因为写完就再也不会忘"为什么分界线是 1"了。分界线的来源就是 x^(1-p) 这个指数:指数为负就收敛,指数非负就发散,而指数恰好是 1-p。

4.3 p 值变化时收敛速度差得有多离谱

光知道收敛不够,实际计算时必须知道收敛有多快。我用部分和做了一组对照(n 取到 10 万):

p 值n=100n=1000n=10^4n=10^5收敛性
0.9约 4.6约 6.7约 9.5约 13.4发散,缓慢
1.0约 5.19约 7.49约 9.79约 12.09发散,极缓慢
1.1约 3.0约 4.5约 6.0约 7.5收敛,极缓慢
1.5约 2.34约 2.55约 2.59约 2.60收敛,较慢
2.0约 1.635约 1.644约 1.6448约 1.6449收敛,快

p=2 时前 1000 项就已经精确到小数点后三位(真值是 π²/6 ≈ 1.644934),p=1.1 时算到 10 万项还在缓慢爬升。这组数字说明一件事:"收敛"和"能算出来"是两个概念。做数值计算时如果遇到 p 略大于 1 的情况,别指望几百万项就得到答案,要么换加速求和方法,要么接受较大的误差,要么用解析的方法换个表达式。

5. 调和级数:名字的由来与它为什么发散

5.1 "调和"这个名字的三重来源

这是最多人问的一个问题,也是教科书通常不解释的一个。我的理解是这个名字至少有三重来源,而且这三重来源互相咬合。

第一重是与"调和平均数"的关系。两个正数 a、b 的调和平均数是 2ab/(a+b),它的倒数是 (1/a + 1/b)/2,也就是"倒数的算术平均"。而调和级数的项 1, 1/2, 1/3, 1/4, … 恰好是等差数列 1, 2, 3, 4, … 的逐项倒数。也就是说,调和级数是"取倒数之后的等差结构"。这种"倒数的平均"在数学里就叫调和平均,级数因此得名。

第二重是与音乐泛音(harmonics)的对应。一根弦或一根空气柱振动时,除了基频 f,还会产生频率为 2f、3f、4f… 的泛音,这些泛音的音高关系听起来是和谐的(八度、五度、四度等等),古人把这些叫"谐音"或"泛音"。与频率成反比的波长(可以理解为弦长或管长)就呈现 1, 1/2, 1/3, 1/4… 的比例。直白点说,你在弦上找出 1/2、1/3、1/4 处按住,得到的音正好构成和谐的泛音列。级数 Σ1/n 的项,就是这一串长度比。所以"调和"这个词同时指向"和声上的和谐"和"数值上的调和平均",两者在词源上本来就是同一个词。

第三重是与"对比"的对应:这类级数处在收敛与发散的分界线上,是所有正项级数里最有代表性的"临界样本"。学级数的人几乎都是从它开始建立"发散可以很慢"这个直觉的。我个人觉得,前两重是名字的来源,第三重是它在教学中的地位来源,三者叠加,才让这个名字一直留着。

5.2 两种经典证法:分组法与积分估计

分组法(也叫奥雷斯姆证明)。把项按 2 的幂分组:

  • 第 1 组:1,和 ≥ 1/2
  • 第 2 组:1/2 + 1/3,注意 1/3 ≥ 1/4,所以和 ≥ 1/2
  • 第 3 组:1/4 + 1/5 + 1/6 + 1/7,每一项 ≥ 1/8,四项之和 ≥ 4 × 1/8 = 1/2
  • 一般地,第 k 组有 2^(k-1) 项,每项 ≥ 2^(-k),组和 ≥ 1/2

于是部分和每翻一倍就至少增加 1/2,加无穷多次 1/2,必然跑到无穷。这个证明的漂亮之处在于完全没有用微积分,纯粹是算术估计,而且顺带给出了增长速度的粗略下界。

积分法。由第 4 节的推导,p=1 时积分是 ln N → ∞,所以发散。更进一步,积分判别法还能给出更精确的估计:S_n 与 ln n 只差一个有界量,这就是下一小节的主题。

5.3 部分和 ≈ ln n + γ:慢得让人怀疑人生

精确的渐近式是 H_n = ln n + γ + 1/(2n) - 1/(12n²) + …,其中 γ ≈ 0.5772156649 是欧拉-马歇罗尼常数。这个常数到底是不是有理数至今没有定论,但它的数值在计算里非常有用。

几组实测数字:

nH_nln n + γ差 H_n - (ln n + γ)
102.9289682.879801约 0.049
1005.1873785.182386约 0.005
10007.4854717.484970约 0.0005
10^614.39272714.392727几乎为 0

差值大约是 1/(2n),和渐近式里的第二项对得上。这组数字最能说明"发散有多慢":要让调和级数的和超过 20,需要 n 大约为 e^(20-0.577) ≈ 3.4 亿项。很多人写程序验证调和级数发散,跑到千万项发现和才 16 上下,以为程序写错了或者结论不对,其实完全正常。

提示:如果你要做"验证调和级数发散"的演示,别用"部分和很大"作为标准,改用"每增加 10 倍项数,和大约增加 ln10 ≈ 2.3026"。这个规律在任何量级都成立,是可预期的、可验证的。

6. q 级数:教材之外的民间叫法,用之前得说清楚

6.1 q 级数通常指什么

需要先打个预防针:"q 级数"不是一个有统一定义的教科书术语。我在实际接触到它时,主要出现在两种语境里。

第一种,是把 p 级数的参数换个字母写,直接叫 q 级数,内容完全一样,就是 Σ1/n^q,结论还是 q>1 收敛。这种情况纯粹是记号差异,换个字母而已,遇到了不用紧张,对照 p 级数处理即可。

第二种,是指在 p 级数基础上再加一层对数的"加强版",形如 Σ 1/(n·(ln n)^q),或者更一般的 Σ 1/(n^p·(ln n)^q)。这一类在讨论"p 级数临界带上更精细的分层"时经常出现,因为 p=1 那条线上,普通 p 级数已经无法区分了,必须引入对数因子才能继续分层。我遇到的多数"q 级数"都是指这第二种。

6.2 积分判别法给出 q>1 收敛、q≤1 发散

以 Σ 1/(n·(ln n)^q) 为例,从 n=2 开始求和(n=1 时 ln1=0 会炸,必须跳过首项)。取 f(x) = 1/(x·(ln x)^q),在 x ≥ 2 上为正、连续、单调递减,满足积分判别法条件。

做换元 u = ln x,du = dx/x,积分变成 ∫ du/u^q。这就回到了标准 p 级数的形式,只不过变量是 u 而不是 x。于是:

  • q > 1 时收敛,积分值约为 1/((q-1)(ln 2)^(q-1))
  • q ≤ 1 时发散,q=1 时积分为 ln(ln x),仍然趋于无穷

这个推导非常值得自己动手做一遍,因为它揭示了一个通用套路:遇到带 ln 的结构,先换元 u = ln x,把它打回 p 级数的形状。学会这一招,Σ1/(n ln n)、Σ1/(n ln n ln ln n) 这类"套娃级数"全都能处理。顺带说个结论:Σ 1/(n ln n) 发散,但发散速度慢到离谱,部分和大约是 ln(ln n) 加常数,到 n=10^6 时和只有 3 上下,到 10^100 才勉强到 5 左右,实际计算中基本无法通过数值方法"看出来"。

6.3 符号冲突:同一个字母 q 在等差等比和级数里身份不同

这是我在给别人讲题时最常纠正的一处混乱:等比数列求和公式里的 q 是公比,q 级数里的 q 是幂次参数,两者毫无关系。同一张卷子上同时出现这两者的时候,一定要在草稿纸上分开写,比如把公比写成 r,或者把级数参数写成 α,避免自己把自己绕晕。

同样的道理,p 级数里的 p、q 级数里的 q、等比公式里的 q,三个符号各自独立。数学教材里符号重复使用是常态,但做笔记的时候最好在符号旁边标注一下"这个是公比""这个是幂次",省得回头看笔记时完全对不上。

7. 斜率:把数列、级数和增长速度接到一张图上

7.1 斜率的定义与三个高频出错点

斜率的基本定义是 k = (y_2 - y_1)/(x_2 - x_1),也写作 Δy/Δx,描述"横坐标每增加一个单位,纵坐标变化多少"。它是直线的"陡峭程度",也是变化率的离散版本。

三个高频错误:

  1. 分子分母顺序反了。有人写成 (x_2-x_1)/(y_2-y_1),那是斜率的倒数,几何意义完全不同。记法是"先算纵向变化,再除以横向变化",因为斜率要回答的是"横着走一步,竖着走几步"。
  2. 竖直直线没有斜率。Δx = 0 时分母为零,数学上说不存在(不是"无穷大",是"不存在")。写代码时这里会直接抛除零异常,必须提前判断。
  3. 忽略单位。如果 x 轴是秒、y 轴是米,斜率单位是米/秒,是有量纲的。同一组数据换成分钟做单位,斜率的数值会差 60 倍。做数据分析时这一点非常容易出错,尤其是比较不同来源的数据时。

7.2 等差数列的斜率就是公差

等差数列 a_n = a_1 + (n-1)d,把点 (n, a_n) 画出来,相邻两点的纵坐标差恒为 d,横坐标差恒为 1,所以斜率恒为 d。换句话说,公差 d 就是这条离散直线的斜率。

这个观察的价值在于:很多关于等差数列的问题可以转化为直线问题。比如"三个数成等差"等价于"三点共线";"等差数列前 n 项和的最小值"可以转化为二次函数的顶点问题。我在做题时如果卡住了,会习惯性地画一下点,往往一眼就能看出结构。

反过来,等差数列部分和 S_n 是 n 的二次函数,它的"平均增长率"S_n/n 是 n 的一次函数,斜率是 d/2。这就是为什么等差数列的部分和图像是一条抛物线。

7.3 等比数列取对数之后,斜率是 ln q

等比数列 a_n = a_1·q^(n-1),两边取自然对数:ln a_n = ln a_1 + (n-1)·ln q。这正是一个首项为 ln a_1、公差为 ln q 的等差数列。所以在半对数坐标(纵轴取对数)下,等比数列的点共线,斜率是 ln q。

这个结论在实际工作里用得极多。看到"某指标每年增长 8%",本质上就是一个公比为 1.08 的等比数列,取对数后斜率是 ln1.08 ≈ 0.077。要比较两个不同增长率的序列快多少,直接比 ln q 的大小,比直接比 q 更接近直觉(因为对数把乘性差异变成了加性差异)。

顺带提一句近似的技巧:当 q 很接近 1 时,ln q ≈ q - 1。增长率 8% 对应 ln1.08 ≈ 0.0770,和 0.08 只差 0.003,做心算时直接用 q-1 完全可以。

7.4 从斜率到导数:连续化的那一步

把离散的 n 换成连续的 x,斜率就变成了导数,Δy/Δx 变成 dy/dx。这一步"连续化"在级数理论里不是装饰,而是工具:积分判别法之所以能成立,靠的就是"求和可以看成曲线下面积的近似"。矩形面积和与积分值只差首项,而收敛性只关心"有没有界",所以可以互相替代。

回到第 4 节:p 级数通项 f(x) = x^(-p),它的导数是 -p·x^(-p-1),量级是 x^(-p-1)。积分判别法要求讨论 ∫x^(-p)dx,本质上是在比较"原函数的增长速度"。当 p>1 时原函数是 x^(1-p),负指数,趋于常数;当 p≤1 时原函数是正指数或对数,趋于无穷。所以斜率这条线到最后指向的是一个很朴素的判断:看原函数在无穷远处有没有界。

8. 动手实现:用 Python 把上面这些结论全验一遍

8.1 环境与工具选型

这一节我用的都是标准库加常见的科学计算库,不需要额外安装什么奇怪的东西。工具选择的理由说清楚:

  • math.fsum用来做高精度累加。普通sum或循环累加在项数上千万时会出现明显的浮点累积误差,fsum内部做了补偿,误差小得多。
  • fractions.Fraction用来做精确有理数运算,验证等比求和公式时最可靠,不会出现 0.30000000000000004 那种尴尬。
  • sympy用来做符号推导,验证公式的代数形式。
  • numpy.polyfit用来拟合斜率,验证"等差数列斜率等于公差"。

这里的原则是:公式用符号算,行为用数值验,两边互相校验。只看数值容易误判(比如把缓慢发散当成收敛),只看符号容易漏掉定义域和特殊情况(比如 q=1)。

8.2 调和级数部分和与 ln n + γ 的对照

这段代码要做的事:算 H_n,和 ln n + γ 比,看差值是不是接近 1/(2n)。

import math GAMMA = 0.5772156649015329 def harmonic(n): return math.fsum(1.0 / k for k in range(1, n + 1)) for n in (10, 100, 1_000, 10_000, 100_000, 1_000_000): h = harmonic(n) approx = math.log(n) + GAMMA print(f"n={n:>8} H_n={h:.10f} ln n + gamma={approx:.10f} diff={h - approx:.3e}")

跑出来会看到 diff 从 5e-2 一路降到 5e-7 量级,和 1/(2n) 同阶。这个实验做完,对"调和级数发散但极慢"这件事就有手感了。想看增长规律,可以改成每隔 10 倍打一行,观察每次增量是不是接近 2.3026。

8.3 p 级数扫描:摸清收敛与发散的数值边界

def p_series(p, n): return math.fsum(k ** (-p) for k in range(1, n + 1)) for p in (0.9, 1.0, 1.1, 1.5, 2.0): row = [round(p_series(p, n), 4) for n in (10**2, 10**3, 10**4, 10**5, 10**6)] print(f"p={p:<4} {row}")

看输出的时候有个技巧:不要只看数值大小,要看每加 10 倍项数,增量怎么变。p=0.9 时增量基本不衰减,p=1.0 时增量按对数衰减(每次加约 2.3),p=1.1 时增量在衰减但极慢,p=2.0 时增量几乎看不见。这个"增量衰减规律"比绝对值更能判断收敛性。

注意:这种数值扫描只能作为"辅助观察",不能作为"证明"。p=1.1 在 10^6 项时看起来增量很小,但理论上它确实收敛;反过来 p=1.0 在 10^6 项时看起来也快稳定了,但它是发散的。这一点必须心里有数。

8.4 等比求和:符号计算与数值计算互相校验

import sympy as sp from fractions import Fraction n = sp.symbols('n', positive=True, integer=True) a1, q = sp.symbols('a1 q', positive=True) # 符号验证有限项和公式 finite = sp.summation(a1 * q**(n - 1), (n, 1, 10)) print(sp.simplify(finite)) # a1*(q**9 + ... + 1) # 精确有理数验证 |q|<1 的无穷和 print(sum(Fraction(1, 2)**k for k in range(200))) print(float(sum(Fraction(1, 2)**k for k in range(200)))) # 接近 2

用 Fraction 累加 200 项,结果是个分母极长的分数,但转成浮点就是 2.0(严格说是 2 - 2^(-199),浮点下显示为 2.0)。这正好验证了 Σ(1/2)^k = 1/(1-1/2) = 2 这个结论。

q=1 的特判也可以顺手验一下:写一个函数,q=1 时返回 a1*n,q≠1 时用公式,然后和逐项累加的结果对比,看是否一致。

8.5 精度控制:为什么这里必须用 fsum

普通累加的问题是误差会累积。加 10^7 个 1/k 这种在量级上逐渐变小的数,大数加小数会有截断误差,逐项累积下来可以偏离真实值好几个有效数字。math.fsum用的是补偿求和(内部维护部分和的高低位),精度接近精确舍入,代价是内存开销略大。

另一个选择是用mpmath做高精度计算:

import mpmath as mp mp.mp.dps = 30 h = mp.nsum(lambda k: 1/mp.mpf(k), [1, mp.inf])

不过这里要提醒:对发散级数,这种求和在数学上是没有意义的,会返回错误结果或者极慢。用之前一定先确认收敛性。

9. 常见问题与排查速查表

9.1 数值计算类问题

问题一:算出来和预期完全不符,差了几个数量级。先检查是不是漏了首项,或者 n 的起始值写错了(从 0 开始时 1/0 会炸,从 1 还是从 2 开始对某些级数影响很大,比如带 ln n 的那些)。再检查是不是把整数除法当成了浮点除法。

问题二:级数明明收敛,程序跑到几千万项还没稳定。大概率是遇到了 p 略大于 1 或者带 ln 的慢收敛级数。前面表格里 p=1.1 到 10 万项才到 7.5,收敛极慢是正常的,不是程序错。解决办法是改用解析近似或者级数加速。

问题三:判断收敛时结论反了。最常见的原因是把"通项趋于 0"当成了"收敛"。再检查一下是不是在比较判别法里比错了方向——和收敛级数比、结果自己更大,那只能说明"比收敛的大",不能得出任何结论,必须换一个发散的级数去比。

9.2 判断与推导类问题

问题:等比求和公式为什么在 q=1 时不能直接用?因为推导过程中两边乘了 (1-q) 并做了除法,q=1 时这个操作不合法。正确做法是分情况,q=1 时部分和是 n·a_1,这在代码里也必须体现为一个 if 分支。

问题:p 级数的临界点为什么是 1 而不是别的数?因为积分判别法把问题转化成了 ∫x^(-p)dx,而 x^(-p) 的原函数是 x^(1-p)/(1-p),指数 1-p 决定有没有界。指数 < 0 有界(收敛),指数 ≥ 0 无界(发散),分界点自然落在 p=1 上。

问题:交错级数收敛了,能不能随便交换项的顺序?不能。条件收敛的级数重排之后和会变,这是级数理论里一个反直觉的结论。绝对收敛的才能随意重排。做计算的时候,如果级数是条件收敛的,累加顺序会影响最终结果,这一点在数值上也要注意。

9.3 一张可以直接对照的排查表

现象最可能的原因处理方式
通项趋于 0 但判断为收敛把必要条件当成了充分条件改用比较或积分判别法
比值法得到 L=1级数处于临界带(多为 p 级数)换积分判别法或比较判别法
等比求和返回 NaN没处理 q=1 或 q 为负加特判分支
数值和长期不收敛级数本身发散,或者收敛极慢先证明收敛性,再做数值
求和结果随顺序变化条件收敛改用绝对收敛形式或固定累加顺序
斜率算出天文数字横坐标间隔极小,或者除零附近检查单位与分母
对数坐标下不是直线数据不是严格等比检查是否混入了增长率不同的两段

10. 我自己的练习路线和几点不太好听的经验

10.1 一份两周能跑完的练习清单

第一天到第三天,只做一件事:把等差和等比的两个求和公式各自独立推导五遍,不用看笔记。推到能闭着眼睛写出来,并且能说出每一步为什么成立。这一步不过关,后面全是白搭。

第四天到第六天,手推积分判别法,把 p 级数、调和级数、Σ1/(n ln n) 三个结论全部推一遍。推完立刻写代码验证,数值和理论对不上就回去找错。

第七天到第九天,把常见判别法的作用范围整理成一张自己的表,然后找二十道混合的题目做,做完给每道题标注"用了哪个判别法、为什么选它"。这一步的价值远大于刷题量。

第十天到第十四天,做一次完整的小项目:用代码算一批级数的部分和,画出"部分和 vs n"的曲线,观察收敛和发散在图上怎么区分。做完这个,对"慢发散"的直觉基本就建立起来了。

10.2 几个我确实踩过的坑

坑一:用数值结果代替证明。我最早学级数的时候,习惯算几项看看"稳不稳定",然后下结论。这个习惯延续到后来做数据分析时出过一次大事——某个指标序列看起来收敛,实际是发散的,只是增长极慢。教训是:数值只能提供线索,结论必须由判别法给出。

坑二:把符号当成固定含义。有次看别人的笔记,把等比公式里的 q 当成了 p 级数的参数,怎么算都对不上。后来养成习惯,所有推导前先在纸角写一行"符号约定",把每个字母代表什么标清楚。这个习惯看起来啰嗦,实际省了大量时间。

坑三:忽略收敛速度。知道 p>1 收敛就以为万事大吉,实际写程序时 p=1.05 的级数算到内存爆掉也得不到满意精度。现在我动手前会先估一下误差量级:p 级数的截断误差大约是 N^(1-p)/(p-1),代入 N 和 p 就知道要算多少项,避免白跑。

坑四:斜率算反。做数据拟合时把横纵坐标搞反过一次,斜率变成了倒数,结论完全颠倒。现在的做法是固定写k = (y2-y1)/(x2-x1),并且在变量命名里带上 x 和 y 的前缀,从命名上防止自己搞错。

最后分享一个我觉得挺有用的小技巧:遇到一个不认识的级数,先做三步——看通项极限、看能不能找到对应的 p 级数或等比级数做比较、看通项有没有单调性。这三步走完,八成的情况已经能定性了,剩下两成再上比值法、根值法或者更精细的估计。这套流程我用了很久,比一上来就翻判别法目录要快得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询