首页 / 资讯中心 / 文章详情

第 19 章 · 行列式与逆矩阵

第 19 章 · 行列式与逆矩阵 ★ FEATURED ARTICLE
上一章说解方程组的解有三种情况怎么判断答案藏在行列式和逆矩阵里。本章讲这两个概念以及它们和可逆唯一解的关系。19.1 逆矩阵矩阵的倒数实数里5 的倒数是 1/5因为 5 × (1/5) 1。矩阵也有类似的倒数叫逆矩阵记作 A⁻¹A × A⁻¹ I I 是单位矩阵A 的逆矩阵 A⁻¹ 满足A 乘 A⁻¹ 等于单位矩阵矩阵世界里的1。用逆矩阵解方程如果 A 有逆矩阵那么 Ax b 的解是x A⁻¹ · b因为A⁻¹·(A·x) A⁻¹·b → (A⁻¹·A)·x A⁻¹·b → I·x A⁻¹·b → x A⁻¹·b。但注意虽然数学上对工程上不建议用A.inverse() * b解方程慢且数值不稳定。Eigen 里用A.分解().solve(b)更优。逆矩阵更多用于理解概念。19.2 行列式一个数描述矩阵的缩放倍数每个方阵都有一个行列式determinant记作 det(A) 或 |A|它是一个数。行列式的几何意义以 2×2 为例矩阵表示的变换把面积放大/缩小了多少倍。2×2 矩阵的行列式公式det([ a b ]) a×d - b×c ([ c d ])例det([1 2; 3 4]) 1×4 - 2×3 4 - 6 -2。行列式 0 意味着什么det(A) 0 时矩阵 A 不可逆叫奇异矩阵。这时方程组无解或无穷多解没有唯一解矩阵的变换把空间压扁了面积/体积变成 0det(A) ≠ 0 时A 可逆方程组有唯一解。这就是判断方程组有没有唯一解的关键看行列式是否为 0。这是数学上的判据到了代码里怎么落地以及为什么不能直接写det 019.4 会说。19.3 判断可逆、求解#includeEigen/Dense#includeiostreamintmain(){Eigen::Matrix2d A;A2,1,1,3;// 行列式doubledetA.determinant();std::coutdet(A) detstd::endl;// 5 ≠ 0可逆// 逆矩阵Eigen::Matrix2d AinvA.inverse();std::coutA^{-1} \nAinv\n\n;// 验证 A * A^{-1} Istd::coutA * A^{-1} \nA*Ainv\n\n;return0;}存成ch19.cpp按附录 C.3 编译运行实际输出det(A) 5 A^{-1} 0.6 -0.2 -0.2 0.4 A * A^{-1} 1 0 0 1det(A) 5不为 0所以可逆A * A^{-1}打印出来正好是单位矩阵。有些矩阵相乘回去会得到1 1e-16这种带浮点残渣的结果那是正常现象见第 21 章末尾的说明看的是接近不等于。19.4 矩阵的秩rank秩rank是另一个重要概念矩阵真正包含多少独立信息等于它线性无关的行或列的最大个数。满秩方阵rank 阶数可逆方程组有唯一解秩不足不可逆信息有冗余Eigen::MatrixXdA(3,3);A1,2,3,4,5,6,7,8,9;// 第 3 行 2×第2行 - 第1行线性相关秩不足Eigen::FullPivLUEigen::Matrix3dlu(A);std::coutrank lu.rank()std::endl;// 2不是 3std::coutdet A.determinant()std::endl;// 打印 6.66134e-16不是 0见下面说明这个矩阵数学上的行列式是 0秩是 2不满秩所以不可逆。⚠ 但代码里别写if (det 0)实测 Eigen 5.0 g 16.1上面这段跑出来的其实是rank 2 det 6.66134e-16rank()给的 2 是准确的determinant()给的不是 0而是6.66134e-16这种浮点残渣——机器精度的正常产物原因见第 21 章末尾的说明。所以工程上判断奇异/接近奇异要用秩lu.rank() 矩阵阶数或者带容差的比较std::abs(det) 1e-12绝不能直接和 0 比相等。本书第 29 章 29.5 给出的检查写法就是这种带容差的比较第 30 章则用分解对象的info()和rank()判断成败——都不是拿行列式和 0 比相等。19.5 概念关系总结概念含义关系行列式 det(A)变换的面积/体积缩放倍数0 则不可逆逆矩阵 A⁻¹矩阵的倒数存在 ⟺ det≠0秩 rank(A)独立信息的数量满秩 ⟺ 可逆唯一解方程组恰有一解⟺ 可逆一句话记忆det ≠ 0 ⟺ 满秩 ⟺ 可逆 ⟺ 方程组有唯一解。19.6 小结逆矩阵 A⁻¹ 满足 A·A⁻¹ I是矩阵的倒数。行列式 det(A) 描述变换的缩放倍数0 则不可逆。秩 rank 描述独立信息量满秩才可逆。可逆 ⟺ det≠0 ⟺ 满秩 ⟺ 唯一解。代码里判断奇异用rank()或带容差的比较别写det 0实测会给你6.66134e-16。解方程用.solve()别用.inverse()硬乘。下一章学习特征值与特征向量——矩阵的指纹。练习题计算 2×2 矩阵 [3 1; 1 2] 的行列式判断是否可逆。用 Eigen 求该矩阵的逆矩阵验证 A·A⁻¹ I。求一个行列式为 0 的矩阵提示让两行成比例验证它不可逆。做完留意determinant()实际打印的数——它通常不是 0见 19.4 的说明。用自己的话说说行列式和秩分别描述了矩阵的什么。为什么解方程推荐用.solve()而不是.inverse() * b
阅读完成 · 觉得有帮助?
咨询建站