题目
编写程序,对一个良态可逆矩阵求逆矩阵(inv);并对一个非方阵(或近似奇异矩阵)计算摩尔-彭罗斯伪逆(Moore-Penrose Pseudoinverse, pinv),验证乘积是否逼近单位矩阵。
输入格式:无需外部输入。
输出格式:分别展示可逆矩阵求逆验证 $A \times A^{-1}$,以及长方阵伪逆验证。
数据范围与约定:数值线性代数。
思路与算法
1. inv 的局限性inv(A) 只能作用于方阵,且当矩阵病态(条件数很大)时,直接求逆会引入巨大舍入误差。在求解方程组时,绝大多数情况应使用反斜杠左除 A \ b 而非 inv(A) * b。
2. pinv 伪逆的普适性pinv(A) 基于奇异值分解(SVD),无论 A 是方阵、长方阵、还是严重奇异退化矩阵,均能计算出最小二乘意义下的最佳广义逆。对于满列秩矩阵满足 $(A^+ A) \approx I$。
3. 工程准则
除非需要明确写出逆算子理论形式,实际数值运算能避开 inv 就避开。
完整程序
% Octave / MATLAB 第28题:矩阵逆与伪逆
% 1. 良态方阵直接求逆
A = [4, 7;
2, 6];
A_inv = inv(A);
I_check = A * A_inv;
fprintf("方阵 A:\n");
disp(A);
fprintf("逆矩阵 inv(A):\n");
disp(A_inv);
fprintf("验证 A * inv(A) (应为单位阵):\n");
disp(I_check);
% 2. 3x2 长方矩阵求伪逆
B = [1, 2;
3, 4;
5, 6];
B_pinv = pinv(B);
fprintf("长方阵 B (3x2):\n");
disp(B);
fprintf("伪逆 pinv(B) (2x3):\n");
disp(B_pinv);
fprintf("验证 B_pinv * B (2x2 单位阵逼近):\n");
disp(B_pinv * B);运行示例
输出:
方阵 A:
4 7
2 6
逆矩阵 inv(A):
0.6000 -0.7000
-0.2000 0.4000
验证 A * inv(A) (应为单位阵):
1.0000e+00 -1.1102e-16
1.1102e-16 1.0000e+00
长方阵 B (3x2):
1 2
3 4
5 6
伪逆 pinv(B) (2x3):
-1.3333 -0.3333 0.6667
1.0833 0.3333 -0.4167
验证 B_pinv * B (2x2 单位阵逼近):
1.0000e+00 2.2204e-16
-6.6613e-16 1.0000e+00