题目

编写程序,对一个良态可逆矩阵求逆矩阵(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