Sympy计算含无理数矩阵列空间得到非正交向量问题
SymPy columnspace()返回的列空间基非正交的原因及解决方法
问题描述
计算含无理数(如sqrt(3))的矩阵列空间时,sympy.columnspace()生成的两个向量点积不为0(即V₁ᵀV₂≠0)。给定矩阵A:
A = Matrix([[1.25000000000000, 0.25*sqrt(3), 0.500000000000000, 0, 1.25000000000000, -0.25*sqrt(3)], [0.25*sqrt(3), 0.750000000000000, -0.5*sqrt(3), 0, 0.25*sqrt(3), -0.750000000000000], [0.500000000000000, -0.5*sqrt(3), 2, 0, 0.500000000000000, 0.5*sqrt(3)], [0, 0, 0, 0, 0, 0], [1.25000000000000, 0.25*sqrt(3), 0.500000000000000, 0, 1.25000000000000, -0.25*sqrt(3)], [-0.25*sqrt(3), -0.750000000000000, 0.5*sqrt(3), 0, -0.25*sqrt(3), 0.750000000000000]])
SymPy返回的列空间基为:
V = A.columnspace() V = [Matrix([ [ 1.25], [ 0.25*sqrt(3)], [ 0.5], [ 0], [ 1.25], [-0.25*sqrt(3)]]), Matrix([ [0.25*sqrt(3)], [ 0.75], [-0.5*sqrt(3)], [ 0], [0.25*sqrt(3)], [ -0.75]])]
计算点积结果不为0:
B = V[0].dot(V[1]) B = 0.75*sqrt(3)
即使去除小数消除舍入误差,问题仍存在。
原因
sympy.columnspace()的实现逻辑是直接选取原矩阵的主元列作为列空间的基,这是高斯消元法的自然结果——主元列仅保证线性无关且能张成列空间,正交性并非列空间基的强制要求。
你的矩阵A的前两列本身就不是正交向量,而columnspace()直接将它们作为基返回,因此点积自然不为0,这完全符合函数的设计预期,并非bug。
解决方法
若需要正交化的列空间基,可使用SymPy提供的gram_schmidt()函数对columnspace()返回的结果进行正交化处理:
from sympy import Matrix, sqrt, gram_schmidt # 定义矩阵(用分数替代小数避免精度问题) A = Matrix([ [5/4, sqrt(3)/4, 1/2, 0, 5/4, -sqrt(3)/4], [sqrt(3)/4, 3/4, -sqrt(3)/2, 0, sqrt(3)/4, -3/4], [1/2, -sqrt(3)/2, 2, 0, 1/2, sqrt(3)/2], [0, 0, 0, 0, 0, 0], [5/4, sqrt(3)/4, 1/2, 0, 5/4, -sqrt(3)/4], [-sqrt(3)/4, -3/4, sqrt(3)/2, 0, -sqrt(3)/4, 3/4] ]) # 获取列空间基 col_basis = A.columnspace() # 执行Gram-Schmidt正交化 ortho_basis = gram_schmidt(col_basis) # 验证正交性 print(ortho_basis[0].dot(ortho_basis[1])) # 输出0,说明向量正交
内容的提问来源于stack exchange,提问作者Walgren
相关产品推荐
相关产品推荐

