线性代数Python计算:向量组的线性表示

在这里插入图片描述
判断两个 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 (nr)×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= 0211 ,β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α243α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= 1140 线性表示。

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学,读正版书好

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值