Python 通过不求逆矩阵求解Ax=

Python 通过不求逆矩阵求解Ax=,python,numpy,matrix,scipy,linear-algebra,Python,Numpy,Matrix,Scipy,Linear Algebra,我需要解一个形式为Ax=By的方程。我知道我不应该通过反转B来解决它,但我不能用scipy.gmres或linalg.solve来解决B^-1Ax=y,因为当我尝试用linalg.inv反转B时它失败了。它返回错误消息“奇异矩阵” 有没有其他方法可以反转矩阵?效率并不重要,因为我只需要做一次。我不想两次解方程,先解T=Ax,然后解x 我会加入用户的建议,而不是反转B,而是遵循两步方法:首先乘以B和y得到一个向量By,然后求解系统a·x=By。以下说明了使用小型阵列作为测试数据的这种方法: fro

我需要解一个形式为Ax=By的方程。我知道我不应该通过反转B来解决它,但我不能用
scipy.gmres
linalg.solve
来解决B^-1Ax=y,因为当我尝试用
linalg.inv
反转B时它失败了。它返回错误消息“
奇异矩阵


有没有其他方法可以反转矩阵?效率并不重要,因为我只需要做一次。我不想两次解方程,先解T=Ax,然后解x

我会加入用户的建议,而不是反转
B
,而是遵循两步方法:首先乘以
B
y
得到一个向量
By
,然后求解系统
a·x=By
。以下说明了使用小型阵列作为测试数据的这种方法:

from numpy import array;
from scipy.sparse import coo_matrix
from scipy.sparse.linalg import gmres

A = coo_matrix((3, 3), dtype=float)
A.setdiag( [ 2, 4, -1 ] )
A.setdiag( [ 2, -0.5 ], 1 )
print( "A", A )

B = coo_matrix((3, 2), dtype=float)
B.setdiag( [ 1, -2 ] )
B.setdiag( [ -0.5, 4 ], -1 )
print( "B", B )

y = array( [ 13, 5 ] )
print( "y", y )

By = B * y
print( "By", By )

x = gmres( A, By )
print( "x", x )

np.linalg.solve(A,B@y)
A,B=2^16x2^16x,y=2^16x1。A、 B和y是给定的矩阵。然后我必须将B和y相乘2^12倍。这是一个循环。
np.linalg.solve
在a为NxN时为O(N^3),因此在您的情况下,这转换为至少2^54次操作,在3GHz下至少需要70天,可能需要更长的时间。如果A是稀疏的、对称的,等等。你可以寻找一个专用的解算器。它是稀疏的,这就是为什么我想使用scipy.gmre来表示(B^-1*A)x=y。或者
scipy.sparse.linalg.gmres(A,B.multiply(y))