Matlab随笔之求解线性方程

理论知识补充:

%矩阵除分为矩阵右除和矩阵左除。

%矩阵右除的运算符号为“/”,设A,B为两个矩阵,则“A/B”是指方程X*B=A的解矩阵X。

%矩阵A和B的列数必须是相等。

% 矩阵左除的运算符号为“\”,设A,B为两个矩阵,则“B\A”是指方程B*X=A的解矩阵X。

%矩阵A和B的行数必须是相等。

%求解多项式的解,用roots函数

%求解定解方程组(未知数个数等于方程总数)

%A*x=b 
A=[1,2; 
   3,4]; 
b=[5;11]; 
y=A\b
z=inv(A)*b

 

运行结果:

y =

     1 
     2


z =

     1 
     2

%求解不定方程组(未知数个数大于方程总数)

A=[4,5,1; 
   1,2,3]; 
b=[3;5]; 
x=A\b

运行结果:

x =

         0 
    0.3077 
    1.4615

%求解超定方程组(未知数个数小于方程总数)

 

A=[1,1; 
   -2,-4; 
   1,-2]; 
b=[2;-3;2]; 
x=A\b 

求解输出如下图所示,需要说明时,求得结果是以一最小二乘近似解。

x =

    1.8182 
   -0.1299

%求解奇异方程组(多个方程之间有重复)

 

A=[1,2,1; 
    -2,-4,-2; 
    1,-2,5]; 
b=[6;-12;3]; 
x=A\b 

此时,结果为

警告: 矩阵为奇异工作精度。 
> In test at 5

x =

   NaN 
   NaN 
   NaN

此时,可以做同解异构,如下:

A=[1,2,1; 
   -2,-4,-2; 
    1,-2,5; 
    0,0,0]; 
b=[6;-12;3;0]; 
x=A\b

运行结果为:

 

x =

         0 
    2.2500 
    1.5000

 

 总结:将上面的所有情况封装起来,做成一个函数,代码如下:

function X=solveEquation(A,b)
% 解方程A*x=b
% A为系数方程,b为列向量
[temp1,temp2]=size(b);
if(temp2~=1)%判断b是否为列向量
    disp('b不是列向量!');
    return
end
[c,d]=size(A);%c为方程数,d为未知量个数
if(c~=temp1)
    disp('A,b行数不一致!');
    return
end
if(c==d)
    if(det(A)==0)%奇异方程组
        disp('奇异方程组问题');
        A=[A;zeros(1,d)];
        b=[b;0];
        X=A\b;
        return
    end
    %定解方程组    
    disp('定解方程组问题');
    X=A\b;
    return
elseif(c>d)%超定方程
    disp('超定方程组问题');
    X=A\b;
    return
else
    disp('不定方程问题');
    X=A\b;
    return
end

 

posted @ 2015-01-27 14:52  墨初  阅读(1450)  评论(0编辑  收藏  举报