用 scipy 求解稀疏和复杂的线性系统

Solving sparse and complex linear systems with scipy

下午好,

我正在开发一些数字代码,在关键点上我需要求解一个稀疏线性系统。我已经用真正的浮点数设置并测试了这一切。当我需要求解系统 Ax = b 时会出现问题,其中 A 是稀疏实数矩阵(以 scipy 的 CSR 格式存储)和复杂的 RHS b,存储为 numpy 数组。当我解决系统时,我只得到解决方案的实际值,以及警告

 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/numeric.py:460: 
 ComplexWarning: Casting complex values to real discards the imaginary part 
 return array(a, dtype, copy=False, order=order)

这是一个最小的工作示例:

 import numpy as np
 import scipy.sparse.linalg
 import scipy.sparse

 A = scipy.sparse.csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])

 b = np.array([1,1,1]) +1j*np.array([1,1,1])

 # throws warning and returns erroneous result
 x_complex = scipy.sparse.linalg.spsolve(A,b) 

这是一个 scipy 问题还是我做错了什么?有可能的解决方法吗?任何帮助将不胜感激。

编辑:我发现了一些解决方法,我们可以只用实数右侧求解两个线性系统(做明显的事情,将 RHS 分成实部和虚部)。有没有更好的方法来做到这一点?这会使代码不太清晰。

求解器正在尝试将矩阵和右侧转换为相同的数据类型以便进行计算。由于涉及复数,因此应将它们转换为复数,但由于某种原因,它试图转换为真正的浮点数(错误?或者只是假设矩阵的数据类型是要使用的数据类型)。制作复杂数据类型的A解决了问题:

A = scipy.sparse.csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]], dtype=np.cfloat)

现在解算器returns正确的解,

[-0.16666667-0.16666667j  0.58333333+0.58333333j  0.33333333+0.33333333j]