从等差等比求和到级数收敛:p级数、调和级数与斜率
发布时间:2026/10/31 12:59:48 锦皓数字建站

整理旧笔记的时候翻到一页上面密密麻麻挤着几个词级数、p 级数、q 级数、调和级数、等比数列求和、等差数列求和、斜率。当时是为了给一个刚接触极限的同学讲清楚为什么 11/21/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 级数、比较判别法、积分判别法就不会觉得判别法是天上掉下来的规则。反过来如果一上来就背p1 收敛p≤1 发散会遇到一个很典型的问题做题时会用但一被问为什么 p1 是分界线就答不上来。这条分界线其实来自一个非常朴素的比较——求和和积分比大小而 ∫dx/x 恰好是对数对数在无穷远处发散所以卡在 p1 这个位置。下面第 4 节会把这段推完。2. 等差数列与等比数列两个求和公式的推导与取舍2.1 等差数列求和倒序相加为什么必然成立等差数列的通项是 a_n a_1 (n-1)d前 n 项和记作 S_n。求和的经典手法是倒序相加把 S_n 正着写一遍再倒着写一遍两式相加每一对的和都等于 a_1 a_n。因为第 k 项 a_k 和第 n1-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 等比数列求和错位相减法与 q1 这个必踩的坑等比数列通项 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_1q 1 必须单独讨论这是最高频的低级错误。因为推导过程中除以了 (1-q)q1 时这个除法没有意义。写代码的时候同理函数里必须有一个 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_1q -1在 1 和 -1 之间震荡发散部分和在 a_1 和 0 之间跳|q| 1绝对值趋于无穷发散通项都不趋于 0这张表值得背下来因为它是后面所有判别法的标准对照物。做比较判别法的时候我们经常就是拿待判级数去和某个等比级数比比的依据就是这张表。再补一句容易被忽略的|q|1 时虽然收敛但收敛的质量差别很大。q0.9 时和是 a_1/0.1 10a_1q0.1 时和约等于 1.11a_1。同样是收敛前者需要几千项才能看出稳定后者三五项就够了。这个收敛速度的问题在第 8 节的代码里会看得很清楚。2.4 一张表把等差、等比彻底对比清楚对比项等差数列等比数列通项a_n a_1 (n-1)da_n a_1·q^(n-1)相邻项关系差恒定比恒定前 n 项和n(a_1a_n)/2a_1(1-q^n)/(1-q)q≠1部分和的增长类型二次型指数型q≠1对应无穷级数必发散d≠0|q|1 收敛其余发散图像特征离散点共线斜率 d取对数后共线斜率 ln q典型误用忘记 n 的取值从 1 还是 0 开始忘记 q1 的特判这张表我建议自己手抄一遍。抄的过程会发现一个问题等比的比恒定和等差的差恒定在对数变换下是可以互换的——等比取对数就变等差。这个对称性是理解后面对数坐标下等比是直线的关键。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/(n1) 这种极限为 1 的直接判发散通项是 n 的有理式就去比最高次幂本质上就是 p 级数比较通项含阶乘或 n 的 n 次方优先试比值判别法。3.3 判别法工具箱什么时候用哪一把判别法适用形态判断依据使用注意通项判别法任意a_n 不趋于 0 则发散只能判发散比较判别法通项为正、结构接近 p 级数或等比与已知收敛/发散级数比大小必须同号通常取正项极限比较判别法通项含 n 的有理式、根式lim a_n/b_n c ∈ (0,∞) 则同敛散选 b_n 是关键通常取最高次幂比值判别法含阶乘、n 次幂、连乘lim a_(n1)/a_n LL1 时失效需换法根值判别法通项整体是 n 次方lima_n积分判别法通项可写成 f(n)f 单调递减为正级数与 ∫f(x)dx 同敛散要求单调递减别漏判莱布尼茨判别法交错级数通项单调递减趋于 0 则收敛只给收敛不给和这张表里最需要心理准备的是比值法和根值法在 L1 时完全失效。而 p 级数恰好全都落在 L1 上这就是为什么 p 级数必须用积分判别法或比较判别法来处理用比值法会得到 L1白算一场。这个失效不是方法不好是因为 p 级数正处在收敛与发散的临界带上临界带上的问题本来就需要更精细的工具。4. p 级数一个参数决定生死的样本4.1 p 级数的定义与结论p 级数指形如 Σ 1/n^pn 从 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, ∞) 上为正、连续、单调递减p0 时。积分判别法说的是Σ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 0N^(1-p) → 0积分收敛到 1/(p-1)p 1 时1-p 0N^(1-p) → ∞积分发散p 1 时ln N → ∞积分发散。这段推导是整个级数章节里最值得亲自动手写一遍的因为写完就再也不会忘为什么分界线是 1了。分界线的来源就是 x^(1-p) 这个指数指数为负就收敛指数非负就发散而指数恰好是 1-p。4.3 p 值变化时收敛速度差得有多离谱光知道收敛不够实际计算时必须知道收敛有多快。我用部分和做了一组对照n 取到 10 万p 值n100n1000n10^4n10^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收敛快p2 时前 1000 项就已经精确到小数点后三位真值是 π²/6 ≈ 1.644934p1.1 时算到 10 万项还在缓慢爬升。这组数字说明一件事收敛和能算出来是两个概念。做数值计算时如果遇到 p 略大于 1 的情况别指望几百万项就得到答案要么换加速求和方法要么接受较大的误差要么用解析的方法换个表达式。5. 调和级数名字的由来与它为什么发散5.1 调和这个名字的三重来源这是最多人问的一个问题也是教科书通常不解释的一个。我的理解是这个名字至少有三重来源而且这三重来源互相咬合。第一重是与调和平均数的关系。两个正数 a、b 的调和平均数是 2ab/(ab)它的倒数是 (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 节的推导p1 时积分是 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.0491005.1873785.182386约 0.00510007.4854717.484970约 0.000510^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结论还是 q1 收敛。这种情况纯粹是记号差异换个字母而已遇到了不用紧张对照 p 级数处理即可。第二种是指在 p 级数基础上再加一层对数的加强版形如 Σ 1/(n·(ln n)^q)或者更一般的 Σ 1/(n^p·(ln n)^q)。这一类在讨论p 级数临界带上更精细的分层时经常出现因为 p1 那条线上普通 p 级数已经无法区分了必须引入对数因子才能继续分层。我遇到的多数q 级数都是指这第二种。6.2 积分判别法给出 q1 收敛、q≤1 发散以 Σ 1/(n·(ln n)^q) 为例从 n2 开始求和n1 时 ln10 会炸必须跳过首项。取 f(x) 1/(x·(ln x)^q)在 x ≥ 2 上为正、连续、单调递减满足积分判别法条件。做换元 u ln xdu dx/x积分变成 ∫ du/u^q。这就回到了标准 p 级数的形式只不过变量是 u 而不是 x。于是q 1 时收敛积分值约为 1/((q-1)(ln 2)^(q-1))q ≤ 1 时发散q1 时积分为 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) 加常数到 n10^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描述横坐标每增加一个单位纵坐标变化多少。它是直线的陡峭程度也是变化率的离散版本。三个高频错误分子分母顺序反了。有人写成 (x_2-x_1)/(y_2-y_1)那是斜率的倒数几何意义完全不同。记法是先算纵向变化再除以横向变化因为斜率要回答的是横着走一步竖着走几步。竖直直线没有斜率。Δx 0 时分母为零数学上说不存在不是无穷大是不存在。写代码时这里会直接抛除零异常必须提前判断。忽略单位。如果 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本质上是在比较原函数的增长速度。当 p1 时原函数是 x^(1-p)负指数趋于常数当 p≤1 时原函数是正指数或对数趋于无穷。所以斜率这条线到最后指向的是一个很朴素的判断看原函数在无穷远处有没有界。8. 动手实现用 Python 把上面这些结论全验一遍8.1 环境与工具选型这一节我用的都是标准库加常见的科学计算库不需要额外安装什么奇怪的东西。工具选择的理由说清楚math.fsum用来做高精度累加。普通sum或循环累加在项数上千万时会出现明显的浮点累积误差fsum内部做了补偿误差小得多。fractions.Fraction用来做精确有理数运算验证等比求和公式时最可靠不会出现 0.30000000000000004 那种尴尬。sympy用来做符号推导验证公式的代数形式。numpy.polyfit用来拟合斜率验证等差数列斜率等于公差。这里的原则是公式用符号算行为用数值验两边互相校验。只看数值容易误判比如把缓慢发散当成收敛只看符号容易漏掉定义域和特殊情况比如 q1。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(fn{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(fp{p:4} {row})看输出的时候有个技巧不要只看数值大小要看每加 10 倍项数增量怎么变。p0.9 时增量基本不衰减p1.0 时增量按对数衰减每次加约 2.3p1.1 时增量在衰减但极慢p2.0 时增量几乎看不见。这个增量衰减规律比绝对值更能判断收敛性。注意这种数值扫描只能作为辅助观察不能作为证明。p1.1 在 10^6 项时看起来增量很小但理论上它确实收敛反过来 p1.0 在 10^6 项时看起来也快稳定了但它是发散的。这一点必须心里有数。8.4 等比求和符号计算与数值计算互相校验import sympy as sp from fractions import Fraction n sp.symbols(n, positiveTrue, integerTrue) a1, q sp.symbols(a1 q, positiveTrue) # 符号验证有限项和公式 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 这个结论。q1 的特判也可以顺手验一下写一个函数q1 时返回 a1*nq≠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 的慢收敛级数。前面表格里 p1.1 到 10 万项才到 7.5收敛极慢是正常的不是程序错。解决办法是改用解析近似或者级数加速。问题三判断收敛时结论反了。最常见的原因是把通项趋于 0当成了收敛。再检查一下是不是在比较判别法里比错了方向——和收敛级数比、结果自己更大那只能说明比收敛的大不能得出任何结论必须换一个发散的级数去比。9.2 判断与推导类问题问题等比求和公式为什么在 q1 时不能直接用因为推导过程中两边乘了 (1-q) 并做了除法q1 时这个操作不合法。正确做法是分情况q1 时部分和是 n·a_1这在代码里也必须体现为一个 if 分支。问题p 级数的临界点为什么是 1 而不是别的数因为积分判别法把问题转化成了 ∫x^(-p)dx而 x^(-p) 的原函数是 x^(1-p)/(1-p)指数 1-p 决定有没有界。指数 0 有界收敛指数 ≥ 0 无界发散分界点自然落在 p1 上。问题交错级数收敛了能不能随便交换项的顺序不能。条件收敛的级数重排之后和会变这是级数理论里一个反直觉的结论。绝对收敛的才能随意重排。做计算的时候如果级数是条件收敛的累加顺序会影响最终结果这一点在数值上也要注意。9.3 一张可以直接对照的排查表现象最可能的原因处理方式通项趋于 0 但判断为收敛把必要条件当成了充分条件改用比较或积分判别法比值法得到 L1级数处于临界带多为 p 级数换积分判别法或比较判别法等比求和返回 NaN没处理 q1 或 q 为负加特判分支数值和长期不收敛级数本身发散或者收敛极慢先证明收敛性再做数值求和结果随顺序变化条件收敛改用绝对收敛形式或固定累加顺序斜率算出天文数字横坐标间隔极小或者除零附近检查单位与分母对数坐标下不是直线数据不是严格等比检查是否混入了增长率不同的两段10. 我自己的练习路线和几点不太好听的经验10.1 一份两周能跑完的练习清单第一天到第三天只做一件事把等差和等比的两个求和公式各自独立推导五遍不用看笔记。推到能闭着眼睛写出来并且能说出每一步为什么成立。这一步不过关后面全是白搭。第四天到第六天手推积分判别法把 p 级数、调和级数、Σ1/(n ln n) 三个结论全部推一遍。推完立刻写代码验证数值和理论对不上就回去找错。第七天到第九天把常见判别法的作用范围整理成一张自己的表然后找二十道混合的题目做做完给每道题标注用了哪个判别法、为什么选它。这一步的价值远大于刷题量。第十天到第十四天做一次完整的小项目用代码算一批级数的部分和画出部分和 vs n的曲线观察收敛和发散在图上怎么区分。做完这个对慢发散的直觉基本就建立起来了。10.2 几个我确实踩过的坑坑一用数值结果代替证明。我最早学级数的时候习惯算几项看看稳不稳定然后下结论。这个习惯延续到后来做数据分析时出过一次大事——某个指标序列看起来收敛实际是发散的只是增长极慢。教训是数值只能提供线索结论必须由判别法给出。坑二把符号当成固定含义。有次看别人的笔记把等比公式里的 q 当成了 p 级数的参数怎么算都对不上。后来养成习惯所有推导前先在纸角写一行符号约定把每个字母代表什么标清楚。这个习惯看起来啰嗦实际省了大量时间。坑三忽略收敛速度。知道 p1 收敛就以为万事大吉实际写程序时 p1.05 的级数算到内存爆掉也得不到满意精度。现在我动手前会先估一下误差量级p 级数的截断误差大约是 N^(1-p)/(p-1)代入 N 和 p 就知道要算多少项避免白跑。坑四斜率算反。做数据拟合时把横纵坐标搞反过一次斜率变成了倒数结论完全颠倒。现在的做法是固定写k (y2-y1)/(x2-x1)并且在变量命名里带上 x 和 y 的前缀从命名上防止自己搞错。最后分享一个我觉得挺有用的小技巧遇到一个不认识的级数先做三步——看通项极限、看能不能找到对应的 p 级数或等比级数做比较、看通项有没有单调性。这三步走完八成的情况已经能定性了剩下两成再上比值法、根值法或者更精细的估计。这套流程我用了很久比一上来就翻判别法目录要快得多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。