有唯一解线性方程组求法
对于一般的,有唯一解的线性方程组,我们可以转换成矩阵的形式:
A
x
=
b
Ax=b
Ax=b 则可以用矩阵运算求解x,即x=A\b
有无穷解的线性方程组求法
齐次线性方程组的通解
求解齐次线性方程组基础解系的函数是null
Z=null(A)表示返回矩阵A的基础解系组成的矩阵。Z还满足ZTZ=I
Z=null(A,‘r’)得出的Z不满足ZTZ=I,但得出的矩阵元素多为整数,顾一般都带参数r。
非齐次线性方程组通解
非齐次线性方程组在求出基础解析后还要求一个特解。对于矩阵形式的非齐次线性方程组 A x = b Ax=b Ax=b 特解 x 0 x_0 x0的求法为x0=pinv(A)*b;其中函数pinv的意思是伪逆矩阵。
例如求解线性方程组:
f
(
x
)
=
{
x
1
+
2
x
2
+
2
x
3
=
1
x
2
−
2
x
3
−
2
x
4
=
2
x
1
+
3
x
2
−
2
x
4
=
3
f(x)=\left\{ \begin{aligned} x_1+2x_2+2x_3=1\\ x_2-2x_3-2x_4=2\\ x_1+3x_2-2x_4=3\\ \end{aligned} \right.
f(x)=⎩⎪⎨⎪⎧x1+2x2+2x3=1x2−2x3−2x4=2x1+3x2−2x4=3
由输出结果可知方程的解为
x
=
k
1
[
−
6
2
1
0
]
+
k
2
[
−
4
2
0
1
]
+
[
13
/
77
46
/
77
−
1
/
11
−
40
/
77
]
(
k
1
,
k
2
∈
R
)
x=k_1 \begin{bmatrix} -6\\2\\1\\0\\ \end{bmatrix} +k_2 \begin{bmatrix} -4\\2\\0\\1\\ \end{bmatrix} +\begin{bmatrix} 13/77\\46/77\\-1/11\\-40/77\\ \end{bmatrix} \quad (k_1,k_2 ∈R)
x=k1⎣⎢⎢⎡−6210⎦⎥⎥⎤+k2⎣⎢⎢⎡−4201⎦⎥⎥⎤+⎣⎢⎢⎡13/7746/77−1/11−40/77⎦⎥⎥⎤(k1,k2∈R)
利用Gauss消元法求解线性方程组
在线性代数中,我们主要的方法就是Gauss消元法。MATLAB中将矩阵化为行阶梯型的函数是:
R
=
r
r
e
f
(
A
)
R=rref(A)
R=rref(A)
我们可以用线性代数知识,编写一个函数,给入矩阵A和b,给出方程的解,函数自动判断是有唯一解还是无穷解。
先搭建出函数的框架
function varargout = ZJX_solvebygauss(varargin)
%ZJX_solvebygauss 用高斯消元法解线性方程组
% A是系数矩阵,b是常熟矩阵。varargin={A,b};如果b为0,则不输入b
% varargout=[S flag],S给出结果
% flag为0无解;1唯一解;2齐次通解;3非齐次通解
A=cell2mat(varargin(1));
Alie=length(A);Asum=numel(A);Ahang=Asum/Alie;
if(nargin==2)
b=cell2mat(varargin(2));
else
b(Ahang,1)=0;
end
B=A; B(:,Alie+1)=b;
varargout(1)={S};
if(nargout==2)
varargout(2)={flag};
end
end
现在完成了基本框架的构建,其中varargout等含义参见函数部分的内容。现在我们已经得到了矩阵A、b,A的行数Ahang,A的列数Alie,增广矩阵B。现在在中间的空格位置进行运算。
程序设计
Ar=rank(A); Br=rank(B);
B=rref(B);
if (Ar<Br)
flag=0; S=0;
elseif (Ar==Br && Ar==Alie)
flag=1; S=B(:,Alie+1);
else
%将能构成单位矩阵的列号存储在行向量I中,即存储了极大线性无关向量的编号
%将剩余列号存入行向量C中
for i=1:Ar
for j=1:Alie
if(B(i,j)==1)
I(i)=j;
break
end
end
end
C=setdiff(1:Alie,I);
%由线性代数知识可得基础解系
ILim=length(I); CLim=length(C);
S(Alie,CLim)=0;%初始化S,S行数为A列数,S列数为C的维度
for i=1:CLim
S(C(i),i)=-1;
for j=1:ILim
S(I(j),i)=B(j,C(i));
end
end
if(nargin==1)
flag=2;
else
flag=3;
S(Alie,CLim+1)=0;
for i=1:Ar
S(I(i),CLim+1)=B(i,Alie+1);
end
end
end
测试
同样求之前的方程组通解
{
x
1
+
2
x
2
+
2
x
3
=
1
x
2
−
2
x
3
−
2
x
4
=
2
x
1
+
3
x
2
−
2
x
4
=
3
\left\{ \begin{aligned} x_1+2x_2+2x_3=1\\ x_2-2x_3-2x_4=2\\ x_1+3x_2-2x_4=3\\ \end{aligned} \right.
⎩⎪⎨⎪⎧x1+2x2+2x3=1x2−2x3−2x4=2x1+3x2−2x4=3
如图,带方程b则S最后一列是特解,不带b则没有特解。日后我们可以直接调用这个函数方便求解。而且比较结果我们发现,这样求出来的特解形式要简单一些。