二次型配方法全解:标准形、可逆线性变换与合同对角化
带过几轮线性代数辅导之后我发现二次型这一章真正卡人的地方不是概念而是化简。题目给一个三元二次型要求化成标准形并写出所用的可逆线性变换绝大多数人的第一反应是去解特征方程、求特征值、再做正交化。思路没错但真在纸上算过的人都知道三次特征方程一旦出现无理根后面的正交化加单位化能吃掉整整一页纸中间抄错一个符号前面全部作废。配方法是另一条路。它不解任何方程只做代数整理把交叉项一次次吸收进完全平方里五六行就能把二次型压成只剩平方项的标准形。代价是你必须自己盯住两件事——配方过程中变量有没有丢失以及最后那个线性变换到底可不可逆。第二件事在作业和考试里扣分最多也最容易被自己糊弄过去写个显然可逆就交卷。这篇我把二次型的配方法按三种情形拆开有平方项的、一个平方项都没有的、以及把配方过程机械化到矩阵上的合同变换版本。每种情形配完整算例最后单独用一章讲可逆性该怎么证、代码怎么验、结果怎么自查。看完你应该能做到拿到任意一个三元二次型五分钟内给出标准形和一个行列式非零的变换矩阵。1. 配方法在和什么较劲二次型的去交叉项本质1.1 二次型、对称矩阵与可逆线性变换的三方关系先把语言统一。一个 n 元二次型就是一个每项都是二次的齐次多项式比如 f x₁² 2x₂² 3x₃² 2x₁x₂ 4x₂x₃。它和对称矩阵是一一对应的平方项 xᵢ² 的系数放在对角线 aᵢᵢ 上交叉项 2aᵢⱼxᵢxⱼ 的系数的一半放在 aᵢⱼ 和 aⱼᵢ 两个位置。上面那个例子的矩阵就是A [1 1 0] [1 2 2] [0 2 3]这个约定必须记死交叉项的系数要除以 2 再填。我见过太多人直接把 2x₁x₂ 的系数 2 填进 a₁₂结果矩阵算出来和后面配方的结果对不上回头查半小时才发现是这一步。二次型的三套语言其实是同一件事的三种说法多项式形式、矩阵形式 xᵀAx、以及标准形 y₁² y₂² - y₃² 这种只含平方项的形式。配方法做的事情本质上就是找一个可逆矩阵 C让 x Cy 代进去之后交叉项全部消失f xᵀAx (Cy)ᵀA(Cy) yᵀ(CᵀAC)y只要 CᵀAC 是对角阵任务就完成了。所以配方和矩阵合同对角化是同一件事的代数版本和矩阵版本一个是给手算的人用的一个是给理论推导和程序用的。1.2 为什么必须先证可逆惯性定理给的硬约束很多人配方配得很溜最后随便写个变换矩阵就收工从来没想过可逆性为什么重要。原因在于惯性定理二次型在可逆线性变换下秩和正负惯性指数都不变。换句话说你最后得到的标准形里正平方项的个数和负平方项的个数是二次型本身的内在不变量不管你用哪种方法、按什么顺序配方结果必须一致。这也是为什么标准形不唯一可以写成 y₁² y₂² - y₃²也可以写成 2y₁² 5y₂² - 3y₃²但规范形唯一系数只能是 ±1 和 0。这条定理成立的前提就是可逆。如果变换不可逆秩会掉正负惯性指数会乱你算出来的标准形就跟原二次型没有关系了。举个极端例子取 C 为全零矩阵任何二次型代进去都变成 0秩从 3 掉到 0这显然说明不了任何问题。所以我养成的一个习惯是配方过程中每引入一个新变量都在草稿纸边上标一下这个变量的表达式最后反解出 x 用 y 表示的式子。只要能唯一反解变换就是可逆的因为反解出来的那组式子本身就是逆变换。这个习惯救过我很多次尤其是在处理那些配着配着某个变量消失了的退化情形时。还有一个更隐蔽的坑正交变换法得到的变换矩阵是正交阵行列式必然是 ±1可逆性自动满足而配方法得到的 C 通常是三角阵或者带分数的矩阵行列式需要自己算。这就是为什么用配方法时可逆性证明不能省。2. 第一种路径有平方项时的逐元消去配方2.1 选主元的经验法则系数小、出现多的优先二次型里只要存在至少一个平方项配方就能直接启动不需要任何预处理。流程是这样的挑一个变量当主元把含有它的所有项凑成一个完全平方剩下的部分再对下一个变量重复这个动作。关键在于挑谁当主元。教科书写任选一个平方项系数非零的变量但实际操作中这个选择会显著影响计算量。我的三条经验优先挑系数绝对值为 1 的。系数是 2、3、5 的时候配方要提公因数平方里面会出现 1/2、1/3 这样的分数后续每一步都带着分数跑出错概率直线上升。优先挑出现在最多交叉项里的。比如 x₁ 同时出现在 x₁x₂ 和 x₁x₃ 里拿它当主元一次配方能同时消掉两个交叉项如果挑一个只出现在一个交叉项里的变量就得配两次。避开只出现在一个交叉项、且该项另一端变量还有别的交叉项的位置。这种选法经常导致配完一次之后剩下的式子结构变复杂。用这三条去筛绝大多数题目的主元是唯一确定的不需要纠结。我带的某个同学之前做一道三元题硬是按照 x₃ 主元配结果中间出现了 4/3 和 16/9 这种系数算了三遍三个答案换成 x₁ 主元之后两分钟出结果而且全是整数。2.2 三元实例的完整配方过程拿具体例子走一遍。设f(x₁, x₂, x₃) x₁² 2x₂² 3x₃² 2x₁x₂ 4x₂x₃第一步扫一眼平方项系数分别是 1、2、3x₁ 系数是 1 最小而且它出现在交叉项 x₁x₂ 里。选 x₁ 当主元。把含 x₁ 的项全部聚起来x₁² 2x₁x₂。这是一个关于 x₁ 的二次式配方x₁² 2x₁x₂ (x₁ x₂)² - x₂²代回原式f (x₁ x₂)² - x₂² 2x₂² 3x₃² 4x₂x₃ (x₁ x₂)² x₂² 4x₂x₃ 3x₃²x₁ 已经被彻底吸收进第一个完全平方里剩下的部分只含 x₂ 和 x₃。重复同样的动作这次主元是 x₂系数 1x₂² 4x₂x₃ (x₂ 2x₃)² - 4x₃²代回f (x₁ x₂)² (x₂ 2x₃)² - 4x₃² 3x₃² (x₁ x₂)² (x₂ 2x₃)² - x₃²到这里交叉项全没了。令y₁ x₁ x₂y₂ x₂ 2x₃y₃ x₃标准形就是 f y₁² y₂² - y₃²。正惯性指数 2负惯性指数 1秩 3。这个过程有几个值得停下来看的地方。第一配方是逐层推进的配完 x₁ 之后剩下的部分里 x₁ 就彻底消失了不会再回来。这是配方法收敛的根本原因也是它比解特征方程省事的根本原因。第二每一步配出来的完全平方系数一定是正的因为原式里对应平方项系数为正如果你配出一个负系数的完全平方说明前面算错了。2.3 从标准形反推变换矩阵并验证可逆标准形出来之后要把变换矩阵写出来。方法是从 y 的定义式出发反解 x。三个定义式y₁ x₁ x₂ y₂ x₂ 2x₃ y₃ x₃从下往上解最省事x₃ y₃x₂ y₂ - 2x₃ y₂ - 2y₃x₁ y₁ - x₂ y₁ - y₂ 2y₃。写成矩阵x₁ 1 -1 2 y₁ x₂ 0 1 -2 · y₂ x₃ 0 0 1 y₃记这个矩阵为 C。可逆性怎么验证最直接的是算行列式。C 是个上三角矩阵主对角线全是 1所以 det(C) 1 ≠ 0可逆。这里不需要展开计算三角矩阵的行列式等于主对角线乘积这个性质要随手用。如果你不放心还可以反向验证把 C 代进 xᵀAx 里展开看是不是真的等于 y₁² y₂² - y₃²。手算容易出错这时候用代码验最稳import sympy as sp x1, x2, x3, y1, y2, y3 sp.symbols(x1 x2 x3 y1 y2 y3) f x1**2 2*x2**2 3*x3**2 2*x1*x2 4*x2*x3 subs {x1: y1 - y2 2*y3, x2: y2 - 2*y3, x3: y3} print(sp.expand(f.subs(subs)))输出就是y1**2 y2**2 - y3**2一眼就能确认。这里插一个特别容易被忽略的退化情形。假设题目是 f x₁² 2x₁x₂ x₂²配方得 (x₁ x₂)²x₂ 在结果里消失了很多人这时候就写令 y₁ x₁ x₂标准形 y₁²然后没了。但这是一个二元二次型变换矩阵必须是 2×2 的。正确的做法是补一个 y₂ x₂得到完整的变换x₁ y₁ - y₂x₂ y₂矩阵 [[1, -1], [0, 1]]行列式 1可逆。配方过程中某个变量消失不代表它在变换里可以不存在。这是配方法最常见的失分点之一我见过不止一次。3. 第二种路径一个平方项都没有时怎么办3.1 直接配方卡住的根源有些二次型长这样f 2x₁x₂ 2x₁x₃ - 6x₂x₃。三项全是交叉项一个平方项都没有。这时候你想启动 2.1 的流程会发现第一步就卡住——没有平方项哪来的含主元的项聚成完全平方硬凑也不行因为 x₁²这个位置根本没有东西可以吸收。很多人在这里会犯一个错把 2x₁x₂ 当成 (x₁ x₂)² 的一部分硬配写成 (x₁ x₂)² - x₁² - x₂²结果减出来的 x₁² 和 x₂² 还是平方项看起来好像能继续配实际上只是把问题绕回去了而且把原本干净的整数系数搞成一堆负号。正确的判断是没有平方项说明二次型矩阵的对角线全是零这时候必须先做一个可逆线性变换人为造出平方项来。这不是投机取巧是配方法的标准分支。3.2 造平方项的换元设计造平方项的思路来自一个再简单不过的代数恒等式(x₁ x₂)(x₁ - x₂) x₁² - x₂²只要有一对变量出现在交叉项里就可以用和与差的换元把它变成一个平方减另一个平方。对上面那个例子x₁ 和 x₂ 同时出现在 2x₁x₂ 中于是令x₁ y₁ y₂x₂ y₁ - y₂x₃ y₃第三个变量没有参与造平方直接平移过去。代进去逐项算x₁x₂ (y₁ y₂)(y₁ - y₂) y₁² - y₂²所以 2x₁x₂ 2y₁² - 2y₂²x₁x₃ (y₁ y₂)y₃ y₁y₃ y₂y₃所以 2x₁x₃ 2y₁y₃ 2y₂y₃x₂x₃ (y₁ - y₂)y₃ y₁y₃ - y₂y₃所以 -6x₂x₃ -6y₁y₃ 6y₂y₃合并f 2y₁² - 2y₂² (2 (-6))y₁y₃ (2 6)y₂y₃ 2y₁² - 2y₂² - 4y₁y₃ 8y₂y₃现在有平方项了2y₁² 和 -2y₂²回到第一种路径。主元选 y₁系数 2出现在一个交叉项里2y₁² - 4y₁y₃ 2(y₁ - y₃)² - 2y₃²代回f 2(y₁ - y₃)² - 2y₃² - 2y₂² 8y₂y₃再对 y₂ 配方-2y₂² 8y₂y₃ -2(y₂ - 2y₃)² 8y₃²代回f 2(y₁ - y₃)² - 2(y₂ - 2y₃)² - 2y₃² 8y₃² 2(y₁ - y₃)² - 2(y₂ - 2y₃)² 6y₃²令 z₁ y₁ - y₃z₂ y₂ - 2y₃z₃ y₃标准形为f 2z₁² - 2z₂² 6z₃²正惯性指数 2负惯性指数 1。注意这里平方项的系数是 2、-2、6这是标准形不是规范形。要写成规范形就再除以系数绝对值变成 z₁² - z₂² z₃²。标准形和规范形是两个东西题目要哪个得看清楚系数不是 ±1 的时候就说明你给的是标准形。有个细节很值得说为什么选 x₁ 和 x₂ 造平方而不是 x₁ 和 x₃答案是都可以。选 x₁、x₂ 是因为交叉项 2x₁x₂ 的系数是 2换元后恰好得到 2y₁² - 2y₂²整数干净。如果选 x₁ 和 x₃2x₁x₃ 也会变成 2(y₁² - y₂²) 的形式同样能走通只是后面剩下那个交叉项的系数会不一样计算量略有差别。这个选择不影响最终的正负惯性指数只影响过程的难易所以不用纠结挑系数最整的那对就行。3.3 两个换元的可逆性核验与矩阵合并这里出现了两层换元最终变换矩阵要把它们乘起来。这是最容易出错的一步很多人第一层写对、第二层写对合起来乘反了。第一层x 与 y 的关系x₁ y₁ y₂ x₂ y₁ - y₂ x₃ y₃矩阵形式 x P y其中P [1 1 0] [1 -1 0] [0 0 1]det(P)按第三行展开等于 1 × det([[1, 1], [1, -1]]) 1 × (-1 - 1) -2 ≠ 0可逆。第二层y 与 z 的关系z₁ y₁ - y₃ z₂ y₂ - 2y₃ z₃ y₃反解y₃ z₃y₂ z₂ 2z₃y₁ z₁ z₃。矩阵形式 y Q zQ [1 0 1] [0 1 2] [0 0 1]上三角主对角线全 1det(Q) 1。合并x P y P(Q z) (PQ) z所以最终变换矩阵 C PQ。注意乘法顺序x 先由 y 表示y 再由 z 表示所以是 P 在左、Q 在右。乘反了结果完全不同。算出 CC [1 1 0] [1 0 1] [1 1 3] [1 -1 0] · [0 1 2] [1 -1 -1] [0 0 1] [0 0 1] [0 0 1]det(C) det(P) · det(Q) -2 × 1 -2 ≠ 0。矩阵乘积的行列式等于行列式的乘积这个性质在多层换元时特别好用——不用真的去展开 3×3 的行列式只要每层的行列式都非零乘积就非零可逆性自动成立。也可以直接看第一列和第二列C 的前两列线性无关[1,1,0]ᵀ 和 [1,-1,0]ᵀ 不成比例第三列是 [3,-1,1]ᵀ三者构成的矩阵行列式非零。两种验证都行但我更推荐用乘积的路线因为它顺带把每一步的可逆性都检查了哪一层出问题一目了然。4. 第三种路径用矩阵合同变换把配方机械化4.1 行变换与列变换必须成对出现的原则前两种路径都是纯代数操作靠眼睛和笔。第三种路径换个视角直接在矩阵上动手把配方过程翻译成矩阵变换。原理一句话对二次型矩阵 A 做一次初等行变换必须紧接着做一次完全相同的初等列变换。这样得到的矩阵与原矩阵合同对应的二次型在某个可逆线性变换下保持等价。为什么必须成对因为初等行变换相当于左乘一个初等矩阵 E初等列变换相当于右乘 Eᵀ。左乘 E、右乘 Eᵀ合起来就是 E A Eᵀ这正是合同变换的形式。如果只做行变换不做列变换得到的是 EA那不是对称矩阵对应的也不再是二次型了。这条规则听起来简单实操时极容易忘。因为人在做行变换的时候是有肌肉记忆的解线性方程组天天做做完一行很自然地就想去动下一行忘了补列。我的做法是每做完一次行变换立刻在同一列位置做同样的列变换用不同颜色的笔标出这一对操作。慢一点但不会漏。用第 2 章那个例子走一遍。矩阵A [1 1 0] [1 2 2] [0 2 3]目标是把非对角线元素逐个清零。第一步消 a₂₁ 和 a₁₂。操作是第 2 行减去第 1 行对应列操作是第 2 列减去第 1 列。先做行第 2 行 - 第 1 行 (1-1, 2-1, 2-0) (0, 1, 2)矩阵变成[1 1 0] [0 1 2] [0 2 3]再做列第 2 列 - 第 1 列第一列是 (1, 0, 0)ᵀ所以第 2 列变成 (1-1, 1-0, 2-0)ᵀ (0, 1, 2)ᵀ矩阵变成[1 0 0] [0 1 2] [0 2 3]可以看到 a₁₂ 和 a₂₁ 同时归零了这就是成对操作的好处——对称矩阵的对称位置会一起消掉做一次等于做两次。第二步消 a₃₂ 和 a₂₃。操作是第 3 行减去 2 倍的第 2 行对应第 3 列减去 2 倍的第 2 列。行第 3 行 (0, 2, 3) - 2×(0, 1, 2) (0, 0, -1)[1 0 0] [0 1 2] [0 0 -1]列第 3 列 (0, 2, 3)ᵀ - 2×(0, 1, 2)ᵀ (0, 0, -1)ᵀ[1 0 0] [0 1 0] [0 0 -1]对角化完成得到 diag(1, 1, -1)。跟第 2 章配方法算出来的 y₁² y₂² - y₃² 完全一致正负惯性指数都是 (2, 1)。两条路殊途同归这个交叉验证很有价值——如果你两边算出来不一致那一定是有一边错了。4.2 变换矩阵怎么从变换过程里提取矩阵对角化完了但题目要的是可逆线性变换所以还得把变换矩阵挖出来。方法是记录每一次行变换对应的初等矩阵按顺序乘起来。上面做了两次行变换第一次第 2 行减第 1 行对应E₁ [ 1 0 0] [-1 1 0] [ 0 0 1]第二次第 3 行减 2 倍第 2 行对应E₂ [1 0 0] [0 1 0] [0 -2 1]整个过程的矩阵表达是E₂ (E₁ A E₁ᵀ) E₂ᵀ (E₂E₁) A (E₂E₁)ᵀ P A Pᵀ diag(1, 1, -1)其中 P E₂E₁。算出 PP [1 0 0] [ 1 0 0] [ 1 0 0] [0 1 0] · [-1 1 0] [-1 1 0] [0 -2 1] [ 0 0 1] [ 2 -2 1]det(P) 1下三角主对角线乘积可逆。这里有个必须讲清楚的细节。我们得到的是P A Pᵀ D注意是 P 在左、Pᵀ 在右。而标准形需要的形式是 Cᵀ A C D也就是 C 在右、Cᵀ 在左。两者对不上所以最终的变换矩阵不是 P而是 Pᵀ。取 x Pᵀ y则xᵀAx yᵀ (Pᵀ)ᵀ A Pᵀ y yᵀ (P A Pᵀ) y yᵀ D y ✓Pᵀ 展开写Pᵀ [1 -1 2] [0 1 -2] [0 0 1]咦这不就是第 2 章配方法算出来的那个 C 吗一模一样。这不是巧合——配方法和矩阵合同变换法本质上是同一件事的两种记录方式只是前者记录的是代数式后者记录的是矩阵操作。这个呼应关系可以当作一个强力的自检手段用两种方法各算一遍变换矩阵应该完全相同在变量顺序固定的前提下。4.3 取转置这一步为什么最容易翻车前面那个变换矩阵要取转置的细节是我见过出错率最高的地方值得单独拆开讲。出错的原因在于很多人记的是做行变换把行变换的累积矩阵记录下来那就是变换矩阵。这个记忆本身没错但它对应的是解线性方程组 Ax b 的场景那里确实是左乘。而在合同变换里行变换和列变换是成对的导致最终关系式里 P 出现在两边方向就变了。判断方法很简单看你最后写出的等式长什么样。如果写成 P A Pᵀ D那变换是 x Pᵀ y如果写成 P ᵀ A P D那变换是 x P y两种记法都有人用取决于你习惯把行变换的累积矩阵记在左边还是右边。关键是不要记结论每次都回头看一眼等式然后据此决定取不取转置。我自己的固定做法是记录行变换的累积矩阵 P并且只验证 P A Pᵀ D 这个等式。一旦等式成立变换就是 x Pᵀ y不假思索。这样只需要记住一条规则不用在两种记法之间切换。还有一个附带的好处P 通常是下三角矩阵因为行变换是自上而下做的取转置后变成上三角行列式不变所以 det(Pᵀ) det(P)可逆性验证的结论可以直接沿用不用重算。5. 三条路横向对比什么时候用哪个5.1 计算量、出错点与适用场景对照三种方法都能把二次型化成标准形但适用场景差别很大。整理成表格看得更清楚维度直接配方法造平方项后配方矩阵合同变换前提条件至少有一个平方项无平方项但有交叉项任意二次型计算量小纯代数中等多一层换元中等但步骤机械主要出错点配方丢变量、系数算错两层换元乘反顺序只做行不做列、忘记转置可逆性验证反解 x 用 y 表示逐层算行列式再相乘三角阵看主对角线适合场景手算、考试、小题纯交叉项的题目编程实现、需要严格过程是否给出变换矩阵需要反解需要矩阵相乘直接读出来取转置后有一个认知需要纠正很多人以为矩阵合同变换法是更高级、更严谨的方法手算时也优先用它。实际上对于三元及以下的题目直接配方法通常更快因为它不需要在纸上维护一个 3×3 的矩阵也不用担心行列操作对不齐。合同变换法的优势在于流程完全机械化不依赖选谁当主元这种判断所以适合写成程序也适合在变量多、结构复杂时避免人为失误。5.2 什么时候该放弃配方回到特征值法配方法不是万能的。有两类题目必须用正交变换法配方法给不了答案第一类题目明确要求用正交变换化二次型为标准形。正交变换要求 C 是正交矩阵CᵀC I配方法给出的 C 一般不是正交阵所以不满足要求。这时只能走特征值路线。第二类题目问的是二次型对应的曲面类型比如判断 f 1 表示椭球面、双曲面还是抛物柱面。这类问题需要知道标准形里平方项的系数正负和相对大小而配方法给出的标准形系数依赖于变换的选择不能直接读出几何信息。正交变换给出的标准形系数是特征值几何意义明确。还有一类是理论上必须用配方法的判定二次型的正定性时配方法可以快速给出正负惯性指数比算所有顺序主子式快得多尤其是变量多的时候主子式要算 n 个行列式。这个用法在实际刷题中很实用。6. 可逆性证明的四种写法与自查流程6.1 从易到难的四种证明套路写该变换可逆这句话是不够的得给出理由。四种写法按推荐程度排序第一种直接算行列式。最通用但 3×3 以上手算容易出错。适用于变换矩阵有明显的三角结构、或者元素特别简单的情况。第二种把矩阵写成初等矩阵的乘积。合同变换法天然满足这一条——你做的每一步行变换都是一个初等矩阵初等矩阵都可逆可逆矩阵的乘积可逆。这个证明最漂亮因为它不需要算任何数字纯逻辑推导。写作业时如果用的是合同变换法强烈推荐这么写。第三种从变换关系反解。配方得到 y 用 x 表示的式子之后能不能唯一解出 x 用 y 表示能就说明变换是双射矩阵可逆。这个方法的优势是它顺带把变换矩阵算出来了一举两得。我平时手算基本都用这个。第四种看三角结构。上三角或下三角矩阵主对角线元素全部非零则行列式非零可逆。配方法得到的 C 经常是三角阵因为每次配完一个变量这个变量就不会再出现所以这个方法命中率很高。实际写的时候我一般会组合使用先用第三种把变换矩阵反解出来然后用第四种或第一种给它盖个章。两句话就能说清楚阅卷的人也看得明白。6.2 用代码把结果钉死手算总有出错的可能尤其是系数是分数的时候。用代码验证几乎是免费的几行就能跑完import sympy as sp # 原始二次型矩阵与候选变换矩阵 A sp.Matrix([[1, 1, 0], [1, 2, 2], [0, 2, 3]]) C sp.Matrix([[1, -1, 2], [0, 1, -2], [0, 0, 1]]) print(C^T A C ) print(C.T * A * C) print(det(C) , C.det())输出会是Matrix([[1, 0, 0], [0, 1, 0], [0, 0, -1]])和det(C) 1。左边对角阵说明标准形正确行列式非零说明可逆两件事一次验证完。再用特征值交叉核对惯性指数print(eigenvalues:, A.eigenvals())特征值的符号分布应该与标准形里正负系数的个数一致正特征值 2 个、负特征值 1 个。注意惯性定理说的是个数一致不是数值一致——特征值可能是无理数而配方得到的系数是整数两者数值完全不同但符号个数必须吻合。这个核对非常有用因为它同时检验了秩非零特征值个数、正负惯性指数三个量一起对上了基本不可能错。验证合同变换那条路的时候记得把转置关系也一起验P sp.Matrix([[1, 0, 0], [-1, 1, 0], [2, -2, 1]]) print(P A P^T ) print(P * A * P.T) print(det(P) , P.det())如果这里输出的是 diag(1, 1, -1)就说明 P A Pᵀ D 成立那么变换矩阵应当是 Pᵀ 而不是 P。代码能帮你把这一步的符号关系彻底钉死。6.3 惯性指数作为最后一道保险所有验证都做完之后还有一个终极保险用惯性指数核对。具体做法是在配方开始之前先用不依赖于任何配方的独立手段算出正负惯性指数。最可靠的手段是算顺序主子式只能判断正定局限性大或者直接求特征值三元的话可以用特征多项式加符号判断不一定要求出精确值。更实用的做法是看对角线元素和行列式的符号。对于三元二次型如果秩为 3那么行列式 0 且对角线元素全正 → 正惯性指数 3行列式 0 且对角线元素不全正 → 正惯性指数 1行列式 0 → 正惯性指数 2这个判断来自特征值乘积等于行列式、特征值和等于迹。行列式为正说明负特征值个数是偶数0 或 2配合迹的符号能进一步确定。第 3 章那个例子矩阵是[ 0 1 1] [ 1 0 -3] [ 1 -3 0]det 0·(0·0 - (-3)(-3)) - 1·(1·0 - (-3)·1) 1·(1·(-3) - 0·1) 0 - 3 - 3 -6 0。行列式为负负特征值个数是奇数只能是 1 个3 个负特征值的话迹会为负而这个矩阵迹为 0。所以正惯性指数是 2负惯性指数是 1。这跟我配方法算出来的 2z₁² - 2z₂² 6z₃² 完全吻合。先独立判断惯性指数再动手配方最后回头对一下这个顺序能把大部分符号错误挡在门外。我自己踩过的坑基本都在符号上——配方法本身不难难的是连着算五六行不出岔子。顺带提一个实操技巧。配方法过程中如果你发现某一步配出来的完全平方前面吃了负号比如写成了 -(y₂ - 2y₃)²那么剩下的部分一定要仔细检查