You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:45:22