我需要反转大量的对称复三对角矩阵(目前是1e6,可能优化到3e3)。矩阵M都非常相似。实际上M是两个参数M(a, b)的函数,我需要计算网格上的逆。在
我现在做的是import numpy as np
from numpy.linalg import inv
N = 40
mat_indices = range(0, N)
a = np.linspace(-5, 5, dtype=np.complex256, num=500)
b = np.linspace(-5, 5, dtype=np.complex256, num=500)
w += 5j * max((w[1] - w[0], eps[1] - eps[0]))
M = np.zeros(a.shape + b.shape + (N, N), dtype=np.complex)
for lay in layers:
M[..., lay, lay] = fa(a[:, np.newaxis]) + fb(b[np.newaxis, :])
for lay in layers[:-1]:
G_latt_inv[..., lay, lay+1] = fsub(a, b)
G_latt_inv[..., lay+1, lay] = fsub(a, b)
M_inv = inv(M)
显然这是一个糟糕的解决方案,我既没有使用对称性也没有使用矩阵的稀疏性。此外,迭代法应该是有利的,因为我的矩阵都非常相似。在
我知道有scipy.sparse,可能我可以用solve方法来b=Unity。但是我仍然没有使用我的许多优点。在
我不需要一个最佳的解决方案,我宁愿简单,因为我没有太多的时间来测试和验证我的结果。但目前它的效率太低了。在