gusucode.com > 高等数学问题求解源码程序 > CH10/LinearEqs.m

    function [x,e]=LinearEqs(A,b)
%LINEAREQS   线性方程组的求解
% X=LINEAREQS(A,B)  利用MATLAB自带函数求线性方程组AX=B的解X
% [X,E]=LINEAREQS(A,B)  求线性方程组的解X并返回其误差
%
% 输入参数:
%     ---A:方程组的系数矩阵
%     ---B:方程组的右端向量
% 输出参数:
%     ---X:方程组的解
%     ---E:解的误差
%
% See also null, inv(\), pinv

[m,n]=size(A);b=b(:);
if m~=length(b);
    error('系数矩阵A和右端向量b维数不匹配.')
end
r1=rank(A);r2=rank([A b]);
if ~all(b)  % 齐次线性方程组
    if r1==n
        x=zeros(size(b));
    else
        z=null(sym(A));   %解出规范化的化零空间
        k=sym('k%d',[n-r1,1]);   %定义各基础解系对应的系数
        x=z*k;   %原方程的通解
    end
else  % 非齐次线性方程组
    if r1==r2&&r1==n
        disp('方程组是恰定的,有唯一解!')
        x=A\b;
    elseif r1==r2&&r1~=n
        disp('方程组是欠定的,有无穷解!')
        warning off all
        z=null(sym(A));   %解出规范化的化零空间
        x0=sym(A)\b;  %求出一个特解
        k=sym('k%d',[n-r1,1]);   %定义各基础解系对应的系数
        x=x0+z*k;   %原方程的通解
    else
        disp('方程组是超定的,只有最小二乘意义下的解!')
        x=pinv(A)*b;
    end
end
e=norm(double(A*x-b));
web -broswer http://www.ilovematlab.cn/forum-221-1.html