
使用 sympy 的 solve_linear_system 求解线性方程组时,若矩阵维度与符号数量不匹配会触发 assertionerror;根本原因在于函数要求增广矩阵列数等于未知量个数加 1,且符号必须以解包形式传入。
使用 sympy 的 solve_linear_system 求解线性方程组时,若矩阵维度与符号数量不匹配会触发 assertionerror;根本原因在于函数要求增广矩阵列数等于未知量个数加 1,且符号必须以解包形式传入。
sympy.solve_linear_system 是专为增广矩阵(augmented matrix)设计的求解器,其输入矩阵 system 必须是形状为 (m, n) 的 SymPy Matrix,其中 n = len(symbols) + 1 —— 即最后一列代表常数项(右侧值),其余 len(symbols) 列对应各未知数的系数。
在你的示例中:
M = sym.Matrix(np.eye(2016)) # 形状为 (2016, 2016)
symbols = sym.symbols('a0:2015') # 共 2015 个符号:a0, a1, ..., a2014此时 M.shape[1] == 2016,而 len(symbols) + 1 == 2016,看似满足条件。但问题出在调用方式上:
❌ 错误写法(传递符号元组):
sym.solve_linear_system(M, symbols) # symbols 是一个 tuple,被视为单个参数
这导致函数内部将 symbols 当作一个整体参数处理,len(symbols) 实际被计算为 1(因为只传入了一个 tuple),从而触发断言失败:
assert system.shape[1] == len(symbols) + 1 # → 2016 == 1 + 1 → False
✅ 正确写法(解包符号序列):
import sympy as sym
import numpy as np
# 构造 2016×2016 单位矩阵作为系数矩阵(注意:需扩展为增广矩阵!)
# 若求解的是 M·x = 0,则增广矩阵应为 [M | 0],即添加全零列
M_aug = sym.Matrix.hstack(sym.eye(2016), sym.zeros(2016, 1)) # 形状 (2016, 2017)
# 定义 2016 个未知数(与方程数一致)
symbols = sym.symbols('a0:2016') # a0, a1, ..., a2015 → 共 2016 个
# 关键:使用 * 解包符号元组,使每个符号作为独立参数传入
solution = sym.solve_linear_system(M_aug, *symbols)
print(solution) # 应返回 {a0: 0, a1: 0, ..., a2015: 0}⚠️ 重要注意事项:
- solve_linear_system 要求输入必须是增广矩阵(即含常数项列),不能直接传入纯系数矩阵;
- 符号数量必须严格等于未知变量个数,且需通过 *symbols 解包传参;
- 对于超大规模系统(如 2000+ 变量),SymPy 符号求解可能极其缓慢或内存溢出;生产环境中建议改用数值方法(如 numpy.linalg.solve)或稀疏求解器(如 scipy.sparse.linalg.spsolve),仅在需要精确有理数解时保留符号计算;
- 若实际需求是求解 Ax = b,推荐更健壮的接口:sym.linsolve((A, b), symbols),它对输入格式更宽容,且支持多种输出形式。
总结:断言错误不是维度计算错误,而是参数传递语义误解所致。牢记 *symbols 是调用该函数的强制约定,并确保矩阵已按增广格式构造。

















