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