题目
给定线性方程组:\n2x1 + x2 - 3x3 = -1\n-x1 + 3x2 + 2x3 = 12\n3x1 + x2 - x3 = 4\n编写程序,利用矩阵反斜杠左除运算符 <code>x = A \ b</code> 精确求出未知数向量 x,并验证残差。
输入格式:无需外部输入。
输出格式:输出系数矩阵 A、常数项 b、求解得到的未知数向量 x 以及残差向量 $\|Ax - b\|$。
数据范围与约定:三阶线性方程组。
思路与算法
1. 反斜杠运算符 \
MATLAB/Octave 最著名的符号!A \ b 并不简单等价于 $A^{-1}b$。其内部实现会自动分析 A 的结构:若 A 为三角阵则执行前后回代;若 A 为对称正定阵则执行 Cholesky 分解;一般方阵执行 LU 分解;长方阵执行 QR 分解求最小二乘解。
2. 性能与精度压倒 invA \ b 无论是运行速度还是数值条件数稳定性,都全面大幅领先于 inv(A) * b,工程上严格禁止写 inv(A)*b。
3. 残差校验
求解后通过计算残差范数 norm(A*x - b) 来评估解的物理精确度。
完整程序
% Octave / MATLAB 第29题:左除求解线性方程组 Ax=b
A = [ 2, 1, -3;
-1, 3, 2;
3, 1, -1];
b = [-1; 12; 4]; % 列向量常数项(对应精确解 x=[1;3;2])
% 使用左除运算符反斜杠求解
x = A \ b;
% 计算残差
residual = norm(A * x - b);
fprintf("系数矩阵 A:\n");
disp(A);
fprintf("常数项向量 b:\n");
disp(b');
fprintf("求解结果向量 x:\n");
disp(x');
fprintf("解的分量: x1 = %.4f, x2 = %.4f, x3 = %.4f\n", x(1), x(2), x(3));
fprintf("残差范数 norm(Ax - b): %.2e (逼近机器零)\n", residual);运行示例
输出:
系数矩阵 A:
2 1 -3
-1 3 2
3 1 -1
常数项向量 b:
-1 12 4
求解结果向量 x:
1 3 2
解的分量: x1 = 1.0000, x2 = 3.0000, x3 = 2.0000
残差范数 norm(Ax - b): 0.00e+00 (逼近机器零)