根据线性代数中求解方程组的基本知识,首先应判断系数矩阵的秩是否和增广矩阵的秩相等,若不等,则无解;若有解,根据秩和未知量个数的关系,判断是唯一解还是无穷多解;若为无穷多解,其通解为齐次方程组的通解加非齐次方程组的特解。

求非齐次线性方程组Ax=b的特解,可直接使用命令A\b,求解齐次线性方程组的通解,可以使用函数nullrref来实现。

命令 含义
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;
else
    B = [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 = [];
        else
            disp(\'线性方程组有无穷解!\');
            S_H = null(A,\'r\');%求出齐次方程组的基础解系
            S_P = A\b;  %求非齐次方程组的特解
        end
    end
end

使用Matlab求解方程组

x1+2x22x3+3x4=22x1+4x23x3+4x4=55x1+10x28x3+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=k12100+k21021+07/401/2,k1,k2R