MATLAB - 矩阵求逆
MATLAB - 矩阵求逆与线性系统
Section titled “MATLAB - 矩阵求逆与线性系统”在线性代数中,方阵 A 的逆矩阵,记作 A⁻¹,是一个满足以下关系的矩阵:
A * A⁻¹ = A⁻¹ * A = I
(where I is the identity matrix)一个矩阵必须是方阵(行数和列数相等)且非奇异才能有逆矩阵。如果矩阵的行列式为零,则称该矩阵为奇异矩阵。非奇异矩阵也称为可逆矩阵。
计算逆矩阵:inv() 函数
Section titled “计算逆矩阵:inv() 函数”在 MATLAB 中,您可以使用 inv() 函数计算矩阵的逆。矩阵 A 的逆矩阵即为 inv(A)。
示例:使用 inv()
Section titled “示例:使用 inv()”创建一个脚本文件并输入以下代码以定义一个矩阵并计算其逆矩阵。
% Define a 3x3 square matrixA = [1, 4, 2; 2, 5, 1; 3, 6, 0];
% Calculate the inverse of AA_inv = inv(A);
% Display the original and inverted matricesdisp('Original Matrix A:');disp(A);
disp('Inverse Matrix A_inv:');disp(A_inv);
% Verification: A * A_inv should be the identity matrixidentity_check = A * A_inv;disp('Verification (A * A_inv):');disp(identity_check);运行此脚本时,它将显示以下结果。请注意,由于浮点运算,验证矩阵可能包含非常小的非零值,而不是完美的零。
Original Matrix A: 1 4 2 2 5 1 3 6 0
Inverse Matrix A_inv: -2.0000 4.0000 -2.0000 1.0000 -2.0000 1.0000 -1.0000 2.0000 -1.0000
Verification (A * A_inv): 1.0000 0 0 0 1.0000 0 -0.0000 -0.0000 1.0000最佳实践:不使用 inv() 求解线性系统
Section titled “最佳实践:不使用 inv() 求解线性系统”矩阵求逆的一个常见用途是求解形式为 Ax = b 的线性方程组。虽然数学上将 x = A⁻¹b 视为正确,但这不是在 MATLAB 或任何数值计算环境中推荐的求解方式。
与使用反斜杠运算符 (“) 进行矩阵除法相比,使用 inv(A) 计算显式逆矩阵的计算成本更高,且通常精度较低。
示例:反斜杠运算符 (“)
Section titled “示例:反斜杠运算符 (“)”让我们求解 Ax = b 系统,其中 A 是我们之前的矩阵,b 是一个列向量。
% Define the same matrix AA = [1, 4, 2; 2, 5, 1; 3, 6, 0];
% Define the vector bb = [6; 7; 6];
% --- Inefficient Method ---% Using the inverse functionx_inefficient = inv(A) * b;
% --- Recommended Method ---% Using the backslash operator (matrix left division)x_efficient = A \ b;
disp('Solution using inv(A)*b:');disp(x_inefficient);
disp('Solution using A\b:');disp(x_efficient);对于这个简单案例,两种方法都产生相同的结果,但反斜杠运算符更健壮、更高效,特别是对于大型矩阵。它使用不同的算法(如 LU 分解),这些算法经过优化,可直接求解系统。
Solution using inv(A)*b: 2.0000 1.0000 -1.0000
Solution using A\b: 2.0000 1.0000 -1.0000如果矩阵的行列式为零,则该矩阵的逆不存在。您可以使用 det() 函数检查行列式。
A_singular = [1, 2; 2, 4];det_A_singular = det(A_singular);disp(['Determinant of A_singular is: ', num2str(det_A_singular)]);
% 尝试对奇异矩阵求逆将导致警告。% inv(A_singular)在实践中,数值问题意味着行列式可能是一个非常接近零的极小值,而不是精确的零。检查矩阵是否接近奇异(即病态)的更好方法是使用 cond() 函数计算条件数。条件数非常大表示矩阵是病态的,Ax=b 的解可能不准确。
cond_A = cond(A);cond_A_singular = cond(A_singular);
disp(['Condition number of A: ', num2str(cond_A)]);disp(['Condition number of A_singular: ', num2str(cond_A_singular)]);输出将显示我们行为良好的矩阵 A 的条件数较小,而奇异矩阵 A_singular 的条件数非常大(或 Inf)。
常见错误和调试
Section titled “常见错误和调试”- 错误:矩阵必须是方阵。 如果您尝试对非方阵使用
inv(),则会发生此错误。逆矩阵仅为方阵定义。 - 警告:矩阵接近奇异或缩放不良。 当您对奇异或病态矩阵使用
inv()或 “ 时,会出现此警告。结果可能不可靠。如果您怀疑这种情况,请务必使用cond()检查条件数。 - 乘法维度不正确: 在求解
Ax=b时,请确保A的行数与b中的元素数量匹配。