判断两个
n
n
n-维向量组
A
:
α
1
,
α
2
,
⋯
,
α
m
A:\boldsymbol{\alpha}_1,\boldsymbol{\alpha}_2,\cdots,\boldsymbol{\alpha}_m
A:α1,α2,⋯,αm和向量组
B
:
β
1
,
β
2
,
⋯
,
β
l
B:\boldsymbol{\beta}_1,\boldsymbol{\beta}_2,\cdots,\boldsymbol{\beta}_l
B:β1,β2,⋯,βl之间能否线性表示,实际上是判断方程组
A
x
=
β
j
\boldsymbol{Ax}=\boldsymbol{\beta}_j
Ax=βj,
j
∈
{
1
,
2
,
⋯
,
l
}
j\in\{1,2,\cdots,l\}
j∈{1,2,⋯,l}及
B
x
=
α
i
\boldsymbol{Bx}=\boldsymbol{\alpha}_i
Bx=αi,
i
∈
{
1
,
2
,
⋯
,
m
}
i\in\{1,2,\cdots,m\}
i∈{1,2,⋯,m}是否有解。也等价于判断矩阵方程
A
X
=
B
\boldsymbol{AX}=\boldsymbol{B}
AX=B及
B
X
=
A
\boldsymbol{BX}=\boldsymbol{A}
BX=A是否有解。其中,矩阵
A
=
(
α
1
,
α
2
,
⋯
,
α
m
)
\boldsymbol{A}=(\boldsymbol{\alpha}_1,\boldsymbol{\alpha}_2,\cdots,\boldsymbol{\alpha}_m)
A=(α1,α2,⋯,αm),
B
=
(
β
1
,
β
2
,
⋯
,
β
l
)
\boldsymbol{B}=(\boldsymbol{\beta}_1,\boldsymbol{\beta}_2,\cdots,\boldsymbol{\beta}_l)
B=(β1,β2,⋯,βl)。若
A
X
=
B
\boldsymbol{AX}=\boldsymbol{B}
AX=B(或
B
X
=
A
\boldsymbol{BX}=\boldsymbol{A}
BX=A)有解
X
=
(
λ
11
λ
12
⋯
λ
1
l
λ
21
λ
22
⋯
λ
2
l
⋮
⋮
⋱
⋮
λ
m
1
λ
m
2
⋯
λ
m
l
)
\boldsymbol{X}=\begin{pmatrix}\lambda_{11}&\lambda_{12}&\cdots&\lambda_{1l}\\\lambda_{21}&\lambda_{22}&\cdots&\lambda_{2l}\\\vdots&\vdots&\ddots&\vdots\\\lambda_{m1}&\lambda_{m2}&\cdots&\lambda_{ml}\end{pmatrix}
X=
λ11λ21⋮λm1λ12λ22⋮λm2⋯⋯⋱⋯λ1lλ2l⋮λml
(或
X
=
(
λ
11
λ
12
⋯
λ
1
m
λ
21
λ
22
⋯
λ
2
m
⋮
⋮
⋱
⋮
λ
l
1
λ
l
2
⋯
λ
l
m
)
\boldsymbol{X}=\begin{pmatrix}\lambda_{11}&\lambda_{12}&\cdots&\lambda_{1m}\\\lambda_{21}&\lambda_{22}&\cdots&\lambda_{2m}\\\vdots&\vdots&\ddots&\vdots\\\lambda_{l1}&\lambda_{l2}&\cdots&\lambda_{lm}\end{pmatrix}
X=
λ11λ21⋮λl1λ12λ22⋮λl2⋯⋯⋱⋯λ1mλ2m⋮λlm
),则向量组
B
B
B(
A
A
A)可由
A
A
A(
B
B
B)组线性表示
β
j
=
λ
1
j
α
1
+
λ
2
j
α
2
+
⋯
+
λ
m
j
α
m
,
j
=
1
,
2
,
⋯
,
l
\boldsymbol{\beta}_j=\lambda_{1j}\boldsymbol{\alpha}_1+\lambda_{2j}\boldsymbol{\alpha}_2+\cdots+\lambda_{mj}\boldsymbol{\alpha}_m,j=1,2,\cdots,l
βj=λ1jα1+λ2jα2+⋯+λmjαm,j=1,2,⋯,l
(
或
α
i
=
λ
1
i
β
1
+
λ
2
i
β
2
+
⋯
+
λ
l
i
β
l
,
i
=
1
,
2
,
⋯
,
m
)
(\text{或}\boldsymbol{\alpha}_i=\lambda_{1i}\boldsymbol{\beta}_1+\lambda_{2i}\boldsymbol{\beta}_2+\cdots+\lambda_{li}\boldsymbol{\beta}_l,i=1,2,\cdots,m)
(或αi=λ1iβ1+λ2iβ2+⋯+λliβl,i=1,2,⋯,m)
否则,
B
B
B(或
A
A
A)不能由
A
A
A(或
B
B
B)线性表示。
虽然我们可以通过重复调用博文《线性方程组的通解》定义的函数mySolve解方程组
A
x
=
β
j
\boldsymbol{Ax}=\boldsymbol{\beta}_j
Ax=βj,
j
∈
{
1
,
2
,
⋯
,
l
}
j\in\{1,2,\cdots,l\}
j∈{1,2,⋯,l}(
B
x
=
α
i
\boldsymbol{Bx}=\boldsymbol{\alpha}_i
Bx=αi,
i
∈
{
1
,
2
,
⋯
,
m
}
i\in\{1,2,\cdots,m\}
i∈{1,2,⋯,m}),从而解矩阵方程
A
X
=
B
\boldsymbol{AX}=\boldsymbol{B}
AX=B及
B
X
=
A
\boldsymbol{BX}=\boldsymbol{A}
BX=A。但是,此处在有解的情形下只需得到特解就能满足需求,故将mySolve函数简化为如下的matrixSolve函数。
import numpy as np #导入numpy
def matrixSolve(A,B):
m,n=A.shape #读取A的行数、列数
_,n1=B.shape #读取B的列数
X=np.array([]) #解集初始化为空
C=np.hstack((A, B)) #连接A、B
r, order=rowLadder(C, m, n) #变换为行阶梯阵
simplestLadder(C, r) #变换为最简行阶梯阵
index=np.where(abs(C[:,n:])>1e-10) #对应B的非零元素分布
r1=max(index[0])+1 #rank(A,B)
if r==r1: #rankA=rank(A,B)
X=np.vstack((C[:r,n:], #解集
np.zeros((n-r,n1))))
X=X[order,:]
return X
程序的第2~15行定义matrixSolve函数,解矩阵方程
A
X
=
B
\boldsymbol{AX}=\boldsymbol{B}
AX=B。参数A和B分别表示矩阵
A
\boldsymbol{A}
A和
B
\boldsymbol{B}
B(也可视为列向量组
A
A
A和列向量组
B
B
B)。
第3~5行分别读取A的行数m和列数n、B的列数n1,并将解集X初始化为空。
第6行调用numpy(第1行导入)函数hstack,将A和B横向连接成C表示矩阵
(
A
,
B
)
(\boldsymbol{A},\boldsymbol{B})
(A,B)。第7行调用博文《消元法与矩阵初等变换》定义的函数rowLadder将C转换成行阶梯阵,同时计算出rank
A
\boldsymbol{A}
A为r,跟踪变换中交换列而引起的未知量顺序order。第8行调用博文《消元法与矩阵初等变换》定义的simplestLadder函数,最终将C转换成最简行阶梯阵。第9行寻求对应B的非零元素分布情况,第10行计算B部分的最后非零行的下标加1(Python数组下标从0开始编排)得出rank
(
A
,
B
)
(\boldsymbol{A},\boldsymbol{B})
(A,B)为r1。
第11~14行的if语句对有解情形(rank
A
=
\boldsymbol{A}=
A=rank
(
A
,
B
)
(\boldsymbol{A},\boldsymbol{B})
(A,B))计算解集X。第12~13行调用numpy函数vstack,将C的最简行阶梯矩阵中前r个非零行对应B的部分(C[:r,n:])纵向叠加
(
n
−
r
)
×
n
1
(n-r)\times n_1
(n−r)×n1的零阵(np.zeros((n-r,n1)))形成解集X。第14行用order调整未知量顺序。
例1 利用上述程序定义的matrixSolve函数,验证结论:向量组
B
:
β
1
=
(
2
1
1
2
)
,
β
2
=
(
0
−
2
1
1
)
,
β
3
=
(
4
4
1
3
)
B:\boldsymbol{\beta}_1=\begin{pmatrix}2\\1\\1\\2\end{pmatrix},\boldsymbol{\beta}_2=\begin{pmatrix}0\\-2\\1\\1\end{pmatrix},\boldsymbol{\beta}_3=\begin{pmatrix}4\\4\\1\\3\end{pmatrix}
B:β1=
2112
,β2=
0−211
,β3=
4413
可由向量组
A
:
α
1
=
(
0
1
2
3
)
,
α
2
=
(
3
0
1
2
)
,
α
3
=
(
2
3
0
1
)
A:\boldsymbol{\alpha}_1=\begin{pmatrix}0\\1\\2\\3\end{pmatrix},\boldsymbol{\alpha}_2=\begin{pmatrix}3\\0\\1\\2\end{pmatrix},\boldsymbol{\alpha}_3=\begin{pmatrix}2\\3\\0\\1\end{pmatrix}
A:α1=
0123
,α2=
3012
,α3=
2301
,线性表示,但向量组A不能由向量组B线性表示。
import numpy as np #导入numpy
from fractions import Fraction as Q #导入Fraction
np.set_printoptions(formatter={'all':lambda x: #设置数组输出格式
str(Q(x).limit_denominator())})
a1=np.array([0,1,2,3],dtype='float') #向量组a1,a2,a3
a2=np.array([3,0,1,2],dtype='float')
a3=np.array([2,3,0,1],dtype='float')
b1=np.array([2,1,1,2],dtype='float') #向量组b1,b2,b3
b2=np.array([0,-2,1,1],dtype='float')
b3=np.array([4,4,1,3],dtype='float')
A=np.hstack((a1.reshape(4,1), #矩阵A
a2.reshape(4,1),a3.reshape(4,1)))
B=np.hstack((b1.reshape(4,1), #矩阵B
b2.reshape(4,1),b3.reshape(4,1)))
X=matrixSolve(A,B) #解方程AX=B
print(X)
X=matrixSolve(B,A) #解方程BX=A
print(X)
根据代码内各行注释,不难理解本程序。运行程序,输出
[[1/4 1/4 1/4]
[1/2 1/2 1/2]
[1/4 -3/4 5/4]]
[]
这表明,
A
X
=
B
\boldsymbol{AX}=\boldsymbol{B}
AX=B有解,即向量组
B
B
B可由向量组
A
A
A线性表示:
β
1
=
1
4
α
1
+
1
2
α
2
+
1
4
α
3
\boldsymbol{\beta}_1=\frac{1}{4}\boldsymbol{\alpha}_1+\frac{1}{2}\boldsymbol{\alpha}_2+\frac{1}{4}\boldsymbol{\alpha}_3
β1=41α1+21α2+41α3,
β
2
=
1
4
α
1
+
1
2
α
2
−
3
4
α
3
\boldsymbol{\beta}_2=\frac{1}{4}\boldsymbol{\alpha}_1+\frac{1}{2}\boldsymbol{\alpha}_2-\frac{3}{4}\boldsymbol{\alpha}_3
β2=41α1+21α2−43α3,
β
3
=
1
4
α
1
+
1
2
α
2
+
5
4
α
3
\boldsymbol{\beta}_3=\frac{1}{4}\boldsymbol{\alpha}_1+\frac{1}{2}\boldsymbol{\alpha}_2+\frac{5}{4}\boldsymbol{\alpha}_3
β3=41α1+21α2+45α3。但
B
X
=
A
\boldsymbol{BX}=\boldsymbol{A}
BX=A无解,故向量组
A
A
A不能由向量组
B
B
B线性表示。
函数matrixSolv也可以用来判断一个向量能否由组向量线性表示。
例2 用matrixSolve函数,验证结论:向量
β
=
(
1
0
3
1
)
\boldsymbol{\beta}=\begin{pmatrix}1\\0\\3\\1\end{pmatrix}
β=
1031
能由向量组
α
1
=
(
1
1
2
2
)
,
α
2
=
(
1
2
1
3
)
,
α
3
=
(
1
−
1
4
0
)
\boldsymbol{\alpha}_1=\begin{pmatrix}1\\1\\2\\2\end{pmatrix},\boldsymbol{\alpha}_2=\begin{pmatrix}1\\2\\1\\3\end{pmatrix},\boldsymbol{\alpha}_3=\begin{pmatrix}1\\-1\\4\\0\end{pmatrix}
α1=
1122
,α2=
1213
,α3=
1−140
线性表示。
import numpy as np #导入numpy
from fractions import Fraction as Q #导入Fraction
np.set_printoptions(formatter={'all':lambda x: #设置数组输出格式
str(Q(x).limit_denominator())})
a1=np.array([1,1,2,2],dtype='float') #向量组A
a2=np.array([1,2,1,3],dtype='float')
a3=np.array([1,-1,4,0],dtype='float')
b=np.array([1,0,3,1],dtype='float') #向量b
A=np.hstack((a1.reshape(4,1),a2.reshape(4,1) #矩阵A
,a3.reshape(4,1)))
X=matrixSolve(A,b.reshape(4,1)) #解方程AX=b
print(X)
运行程序,输出
[[ 2]
[-1]
[ 0]]
这意味着向量
β
\boldsymbol{\beta}
β可由向量组
A
:
α
1
,
α
2
,
α
3
A:\boldsymbol{\alpha}_1,\boldsymbol{\alpha}_2,\boldsymbol{\alpha}_3
A:α1,α2,α3线性表示为
β
=
2
α
1
−
α
2
+
0
α
3
\boldsymbol{\beta}=2\boldsymbol{\alpha}_1-\boldsymbol{\alpha}_2+0\boldsymbol{\alpha}_3
β=2α1−α2+0α3。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。