NumPy数组定义疑问:线性方程组求解结果差异原因探究
问题原因分析及NumPy数组正确定义方式
差异原因
两种求解结果出现偏差的核心问题是最初定义的矩阵A不符合线性方程组系数矩阵的要求,具体分为两种常见情况:
- 矩阵形状错误:把本该是
(n,n)的二维方阵,误定义成了一维数组(如(9,))或非方阵(如(1,9))。np.linalg.solve要求输入的A必须是n阶二维方阵,b是长度为n的一维数组或n×1的列向量,若A形状错误,函数会错误解析方程组结构,导致结果偏离。 - 元素排列错误:将系数矩阵的行和列搞反(即使用了原矩阵的转置)。此时
solve求解的是转置矩阵对应的方程组,自然和原方程组的解不同;而你用矩阵逆求解时,可能手动使用了正确的行排列矩阵,因此得到正确结果。
举个实际例子:假设正确的3×3系数矩阵是
A_correct = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 10] ]) b = np.array([15, 36, 64])
用逆求解np.linalg.inv(A_correct) @ b得到[5., 4., 2.],np.linalg.solve(A_correct, b)也会返回正确结果。但如果误将A定义为转置矩阵A_wrong = A_correct.T,再用solve求解,得到的结果就会完全错误,和你遇到的[-29., 6., 38.]类似。
NumPy数组正确定义方式
定义线性方程组的系数矩阵和右侧向量时,需严格遵循以下规范:
- 系数矩阵A:必须是二维方阵,每个子列表代表方程组的一行(即一个方程的系数),元素顺序与方程中未知数的顺序一致。示例:
import numpy as np # 3阶线性方程组的系数矩阵 A = np.array([ [a11, a12, a13], # 第一个方程:a11*x1 + a12*x2 + a13*x3 = b1 [a21, a22, a23], # 第二个方程:a21*x1 + a22*x2 + a23*x3 = b2 [a31, a32, a33] # 第三个方程:a31*x1 + a32*x2 + a33*x3 = b3 ]) - 右侧向量b:可以是一维数组(推荐)或二维列向量,元素顺序与方程顺序一一对应:
# 一维向量(形状(3,)) b = np.array([b1, b2, b3]) # 或二维列向量(形状(3,1)) b = np.array([[b1], [b2], [b3]]) - 验证矩阵形状:定义后可通过
print(A.shape)检查,确保输出为(n,n)(n为方程组未知数个数),避免形状错误。
内容的提问来源于stack exchange,提问作者toledano
相关产品推荐
相关产品推荐

