Python求解线性方程组遇LinAlgError:输入数组需至少二维
解决线性方程组求解的LinAlgError问题
咱来一步步拆解你遇到的问题:
错误原因分析
你碰到的LinAlgError: 1-dimensional array given. Array must be at least two-dimensional,核心是两个问题:
- 系数矩阵形状不合法:你构造的
a矩阵前两行有7个元素,但第三行只写了6个——第三个方程明明包含x₆,却漏掉了它的系数1/21。numpy遇到行长度不一致的列表时,会生成一个一维的object数组,而非我们需要的二维数值矩阵,这直接触发了报错。 - 方程组类型不匹配
np.linalg.solve:就算修正了矩阵形状,你当前只有3个方程,但变量有x₀到x₆共7个,这是欠定方程组(方程数<变量数),有无穷多解。而np.linalg.solve只能处理适定方程组(方程数=变量数,即系数矩阵为方阵),所以就算矩阵形状对了,用solve还是会报错。
解决方案
第一步:修正系数矩阵
先把第三行漏掉的x₆系数补上,让每一行都有7个元素,确保a是合法的二维数组:
import numpy as np # 修正后的系数矩阵,第三行补充x6的系数1/21 a = np.array([ [1, 1/10, 1/10, 1/10, 1/10, 0, 0], [0, 1+1/15, 1/15, 1/15, 1/15, 1/15, 0], [0, 1/21, 1+1/21, 1/21, 1/21, 1/21, 1/21] ]) b = np.array([10, 20, 30])
第二步:求解欠定方程组
对于欠定方程组,我们可以用两种常用方法:
方法1:求最小二乘解
如果只需要一个最优近似解(最小二乘意义下),可以用np.linalg.lstsq:
# 求解最小二乘解 x, residuals, rank, singular_values = np.linalg.lstsq(a, b, rcond=None) print("最小二乘解:", x)
方法2:求通解(特解+零空间)
如果需要完整的通解(所有可能的解),可以结合最小二乘特解和零空间基来构造:
from scipy.linalg import null_space # 求特解(最小二乘解) x特解, _, _, _ = np.linalg.lstsq(a, b, rcond=None) # 求零空间基(通解的线性组合部分) 零空间基 = null_space(a) print("特解:", x特解) print("零空间基(共{}个线性无关的向量):".format(零空间基.shape[1])) print(零空间基) # 通解形式:x = x特解 + k1*零空间基[:,0] + k2*零空间基[:,1] + ... + k4*零空间基[:,3] # 其中k1~k4为任意实数
总结
- 先确保系数矩阵的每一行长度一致,生成合法的二维数组;
- 根据方程组类型选择合适的求解函数:适定方程组用
np.linalg.solve,欠定/超定方程组用np.linalg.lstsq或其他专门工具。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

