我需要将对数复数三对角矩阵的大数(当前为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
方法。但我仍然没有使用我的许多有利特性。
我不需要最佳解决方案,我更喜欢简单,因为我没有足够的时间来测试和验证我的结果。但目前效率太低了。