如何用NumPy/SciPy求两不同矩阵零空间交/并的张成维度
计算零空间交与并的张成空间维度
核心原理
- 零空间的交(H∩G):向量x同时属于矩阵A和B的零空间,当且仅当满足Ax=0且Bx=0。这等价于x是**垂直堆叠矩阵
[A; B]**的零空间向量。由于H∩G本身是子空间,其张成空间就是自身,因此dim(span(H∩G))等于该堆叠矩阵的零空间维度。 - 零空间的并的张成(span(H∪G)):这等价于子空间H与G的和空间H+G。利用子空间维度公式:
dim(H+G) = dim(H) + dim(G) - dim(H∩G),其中dim(H)是A的零空间维度,dim(G)是B的零空间维度。
修正后的代码实现
使用SymPy进行精确线性代数计算(避免浮点数精度误差):
import sympy as sp # 定义矩阵A和B A = sp.Matrix([ [2, 0, 3, -1, 2, -1, 6, -4, 7, 8, -1, -4, 7, 0, 0, 0, 0, 7], [-6, -7, -9, 10, 1, 10, -4, 12, -7, 4, -4, 5, -7, 0, 0, 0, 7, 0], [10, 0, 8, -12, -4, -5, -5, -13, 0, 5, 2, 1, 0, 0, 0, 7, 0, 0], [8, 0, 5, -4, 1, -4, 3, -9, 7, 11, 3, -2, 7, 0, 7, 0, 0, 0], [-9, -7, -3, 8, 5, 8, 1, 11, 0, -1, 1, -3, 0, 7, 0, 0, 0, 0] ]) B = sp.Matrix([ [3, 2, 3, -1, 5, -5, 2, 0, -3, 5, 0, 0, 0, 0, 0, 0, 0, 2], [39, 26, 27, -13, 29, -25, -4, -2, -7, 21, 0, 0, 0, 0, 0, 0, 32, 0], [-5, 18, 31, -9, 25, -5, 12, -26, 5, 17, 0, 0, 0, 0, 0, 32, 0, 0], [25, 6, 21, -3, 19, -23, 4, -14, -9, 27, 0, 0, 0, 0, 16, 0, 0, 0], [-3, -6, -3, 1, -5, 1, -4, 2, 3, -1, 0, 0, 0, 4, 0, 0, 0, 0], [-47, -10, -35, 5, -53, 17, 4, -14, 79, -13, 0, 0, 32, 0, 0, 0, 0, 0], [67, 66, 71, -33, 81, -61, 76, -10, -67, 41, 0, 32, 0, 0, 0, 0, 0, 0], [59, 18, 31, -41, 57, -37, 12, 6, -59, 49, 32, 0, 0, 0, 0, 0, 0, 0] ]) # 计算各矩阵的秩 rank_A = A.rank() rank_B = B.rank() # 垂直堆叠A和B combined_matrix = A.col_join(B) rank_combined = combined_matrix.rank() # 计算目标维度 dim_H = 18 - rank_A dim_G = 18 - rank_B dim_HcapG = 18 - rank_combined dim_spanHcupG = dim_H + dim_G - dim_HcapG print(f"dim(span(H∩G)) = {dim_HcapG}") print(f"dim(span(H∪G)) = {dim_spanHcupG}")
原代码失败原因
scipy.linalg.null_space返回的是零空间的一组基向量,但两个零空间的基向量并不一定直接重叠。直接通过元素相等判断An==Bn没有意义——不同的基可以张成重叠的子空间,且交空间的基并非两个基的公共向量。
内容的提问来源于stack exchange,提问作者Nate3384
相关产品推荐
相关产品推荐

