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