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

时间:2016-12-29 20:06:10

标签: numpy scipy sparse-matrix

下午好,

我正在开发一些数字代码,在一个关键点我需要解决一个稀疏的线性系统。我已经设置了所有这些并使用实际浮点数进行测试。当我需要求解系统时会出现问题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分成实部和虚部)。有没有更好的方法来做到这一点?它会使代码不那么清晰。

1 个答案:

答案 0 :(得分:3)

求解程序试图将矩阵和右侧转换为相同的数据类型以进行计算。由于涉及到复杂的数字,它们应该被转换为复杂的,但由于某种原因,它试图转换为实际浮点数(一个错误?或者只是假设矩阵的数据类型是要使用的数据类型)。制作复杂数据类型的A解决了这个问题:

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

现在解算器返回正确的解决方案

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