使用scipy.sparse.linalg线性系统求解器的问题

时间:2017-10-11 14:00:43

标签: python scipy sparse-matrix linear-algebra

我有线性系统要解决,它由大型稀疏矩阵组成。

我一直在使用response = app.requests_session.post( url, headers=generate_ride_headers(session.get('access_token')), json=params ) 库及其scipy.sparse子库来执行此操作,但我无法使用某些线性求解器。

这是一个为我重现问题的工作示例:

linalg

运行此操作会产生以下错误

from numpy.random import random
from scipy.sparse import csc_matrix
from scipy.sparse.linalg import spsolve, minres

N = 10
A = csc_matrix( random(size = (N,N)) )
A = (A.T).dot(A) # force the matrix to be symmetric, as required by minres
x = csc_matrix( random(size = (N,1)) ) # create a solution vector
b = A.dot(x) # create the RHS vector

# verify shapes and types are correct
print('A', A.shape, type(A))
print('x', x.shape, type(x))
print('b', b.shape, type(b))

# spsolve function works fine
sol1 = spsolve(A, b)

# other solvers throw a incompatible dimensions ValueError
sol2 = minres(A, b)

用于调用 raise ValueError('A and b have incompatible dimensions') ValueError: A and b have incompatible dimensions ,即使尺寸明确 兼容。 minres中的其他解算器,例如scipy.sparse.linalgcglsqr都会产生相同的错误。

这是在使用SciPy 0.19的python 3.6.1上运行。

任何人都知道这里发生了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

您的使用与API不兼容!

b上的

spsolve

  

b:ndarray或稀疏矩阵

     

表示等式右边的矩阵或向量。如果一个向量,b.shape必须是(n,)或(n,1)。

允许稀疏b

b上的

minres

  

b:{array,matrix}

     

线性系统的右侧。有形状(N,)或(N,1)。

这里不允许稀疏b!

这同样适用于所提到的非工作解算器(其中lsqr可能有点不同 - > array_like与数组相比)。

这种情况并不少见,因为稀疏的rhs-vectors在很多情况下没有帮助,因此很多数值优化开发者都不支持!

这有效:

sol2 = minres(A, b.todense())

(你得到了我的赞成和赞美,这是一个很好的可重复的例子!)