用SciPy LU分解解线性方程时报expected square matrix错误如何解决
LU分解报错排查与修复
核心报错根源
scipy.linalg.lu_factor仅接受方阵作为输入,要求矩阵的行数与列数完全相等- 之前小矩阵运行正常,是因为手动拼接元素时刚好凑成了行列数相等的方阵;本次构建自定义大矩阵时出现了维度错配:
- 每一行定义了17个元素,对应列数为17
- 矩阵一共定义了10行数据
- 最终
A的shape为(10, 17),属于非方阵,直接触发ValueError: expected square matrix报错
分步修复方案
- 补全矩阵维度
根据实际物理模型调整A的结构,保证行列数完全相等(即n行n列)。手数元素很容易出现行列数不匹配的问题,可以直接打印矩阵shape快速定位:
构建大型稀疏矩阵时,推荐先初始化指定大小的全零矩阵,再按位置赋值非零元素,避免手动拼接行时出现元素数偏差:# 打印矩阵实际维度,替代手动计数 print(A.shape)# 示例:初始化17*17的全零方阵 A = np.zeros((17, 17)) # 按方程逐行填充对应位置的数值 A[0, 0] = math.sin(math.pi / 4) A[0, 1] = 1 A[1, 0] = -math.sin(math.pi / 4) # ... 依次填充所有非零元素 - 匹配右端向量
B的维度
修正后的方阵A为n行n列时,向量B的长度必须为n。当前B的长度为10,调整A的行数后,需要同步补充对应行的方程右端常数项,否则会触发矩阵维度不匹配的报错。 - 修正三角函数的计算逻辑
代码中math.sin(45)的输入单位为弧度,并非角度值,计算得到的结果和预期的45度正弦值偏差极大。如果需要计算45度的正弦值,需要先将角度转为弧度:sin_45deg = math.sin(math.pi / 4)
注意事项
- LU分解仅适用于方阵求解,若实际模型对应的是超定/欠定方程组,不能直接使用
lu_factor,需要改用最小二乘类求解接口 - 大型矩阵求解时可以搭配稀疏矩阵存储格式,减少内存占用
内容的提问来源于stack exchange,提问作者Petra Johansson
相关产品推荐
相关产品推荐

