根据线性代数中求解方程组的基本知识,首先应判断系数矩阵的秩是否和增广矩阵的秩相等,若不等,则无解;若有解,根据秩和未知量个数的关系,判断是唯一解还是无穷多解;若为无穷多解,其通解为齐次方程组的通解加非齐次方程组的特解。
求非齐次线性方程组Ax=b
的特解,可直接使用命令A\b
,求解齐次线性方程组的通解,可以使用函数null
或rref
来实现。
命令 | 含义 |
---|---|
B = null(A,'r') | 求系数矩阵为A的齐次线性方程组Ax=0的基础解系,结果为有理数,B的列向量即基础解系的列向量 |
Z = null(A) | 求出Ax=0的基础解系后,将基础解系的向量正交单位化,存储在Z中 |
C = rref(A) | 求出矩阵A的行最简形矩阵(reduced row echelon form) |
function [S_H, S_P] = solveLS(A,b)
% 输入参数A:系数矩阵
% 输入参数b:Ax=b的常数项列向量b
% S_H:齐次线性方程组的基础解系
% S_P:非齐次线性方程组的特解
if size(A,1) ~= length(b) %size(A,1)求矩阵的行数error('输入数据错误,请重新输入!');return;
elseB = [A,b]; %增广矩阵rank_A = rank(A); %求系数矩阵的秩rank_B = rank(B); %求增广矩阵的秩if rank_A ~= rank_B %无解情况disp('线性方程组无解!');S_H = [];S_P = [];else if rank_B == size(A,2) %若增广矩阵的秩 = 未知量个数%size(A,2)求矩阵的列数,相当于length(A)disp('线性方程组有唯一解!');S_P = A\b; %求唯一解S_H = [];elsedisp('线性方程组有无穷解!');S_H = null(A,'r');%求出齐次方程组的基础解系S_P = A\b; %求非齐次方程组的特解endend
end
例 使用Matlab求解方程组
⎧⎩⎨x1+2x2−2x3+3x4=22x1+4x2−3x3+4x4=55x1+10x2−8x3+11x4=12
A=[1 2 -2 3; 2 4 -3 4; 5 10 -8 11];
b=[2 5 12]';format rat;
[S_H, S_P]=solveLS(A,b)
运行结果
线性方程组有无穷解!S_H =-2 1
1 0 0 2 0 1 S_P =0 7/4 0 -1/2
该线性方程组有无穷多解,通解为
x=k1⎛⎝⎜⎜⎜−2100⎞⎠⎟⎟⎟+k2⎛⎝⎜⎜⎜1021⎞⎠⎟⎟⎟+⎛⎝⎜⎜⎜07/40−1/2⎞⎠⎟⎟⎟,k1,k2∈R