我需要求解 x 的一组 Ax = B 形式的联立方程。我使用了
numpy.linalg.solve
功能,输入 A
和 B
,但出现错误
LinAlgError: Last 2 dimensions of the array must be square
这是我的代码:
A = numpy.matrix([(-0.56, -0.52), (0.44, 0.46), (0.69, 0.71)])
B = [(-0.38, -24.09, 0.0)]
x = numpy.linalg.solve(A, B)
x 的形式应为 (x1,x2,0)。
我该如何解决这个问题?
如果你还没有找到答案,或者将来有人有这个问题。
求解Ax=b:
numpy.linalg.solve
使用LAPACK gesv。正如LAPACK文档中提到的,gesv要求A是正方形:
LA_GESV 计算实数或复数线性方程组 AX = B 的解,其中 A 是方阵,X 和 B 是矩形矩阵或向量。使用行交换的高斯消去法将 A 分解为 A = PL*U ,其中 P 是置换矩阵,L 是单位下三角,U 是上三角。然后使用 A 的因式分解形式来求解上述系统。
如果 A 矩阵不是方阵,则意味着您的变量要么比方程多,要么反之亦然。在这些情况下,可能会出现无解或有无限多个解的情况。决定解空间的是矩阵的秩与列数的比较。因此,您首先必须检查矩阵的秩。
话虽这么说,您可以使用另一种方法来求解线性方程组。我建议看看分解方法,如 LU 或 QR 甚至 SVD。在 LAPACK 中你可以使用
getrs
,在 Python 中你可以使用不同的东西:
scipy.linalg.solve_triangular
numpy.linalg.lstsq
另请查看此处,其中制定并解决了一个简单的示例。
方阵是行数和列数相同的矩阵。您正在做的矩阵是 3 x 2。添加一列零来解决此问题。
发生此错误的另一种常见方式是在
numpy.matrix()
对象上调用旨在按元素执行的操作时。以下示例重现了此错误。在这种情况下, arr
是一个 numpy ndarray,而 mat
是一个 numpy 矩阵对象。如您所见,逐元素求方适用于 arr
,但不适用于 mat
,因为 **2
是一个矩阵平方,相当于点积。要解决这个问题,请将矩阵转换为 ndarray。
import numpy as np
arr = np.array([[1,2]])
mat = np.matrix([[1,2]])
x1 = arr**2 # array([[1, 4]])
y1 = mat**2 # LinAlgError: Last 2 dimensions of the array must be square
y2 = np.array(mat)**2 # array([[1, 4]])