张量的三叉积

计算科学 Python 计算物理学 特征值 张量
2021-12-22 22:11:37

我试图在真实空间中计算向量 a、b 和 c 的三重叉积,并在整个空间上进行积分。结果是电子系统的哈密顿术语,因此也有带数的索引(您可以将 a 和 b 视为实空间中波函数的梯度,将 c 视为矢量场): 其中是从 0 到 50 的索引。我可以将三重乘积写为

hnm=an(x)×c(x)×bm(x)dx
nm
A×B×C=B(AC)C(AB)
这应该更快。

所以对于python的第一个术语,我正在做

import numpy as np

N = 50   #  band index
v = 3    # direction x,y,z
g = 30000 # real space grid points

a = np.ones((N,v,g), dtype = 'complex')
b = np.ones((N,v,g), dtype = 'complex')
c = np.ones((v,g), dtype = 'complex')
H_vnn = np.zeros((N,v,N), dtype = 'complex')

for i in range(g):
         H_vnn += np.array([c[v,i]*(np.dot(a[:,:,i],b[:,:,i].T)) for v in range(3)])

当没有遇到内存错误时,它会永远持续下去。我很确定这不是最有效的方法,但我能想到的唯一选择是循环 g 索引,这似乎更广泛。感谢所有人,特别是那些可以帮助我的人

1个回答

尝试这个

import numpy as np

N = 50   #  band index
v = 3    # direction x,y,z
g = 30000 # real space grid points

a = np.ones((g,N,v), dtype = 'complex')
b = np.ones((g,N,v), dtype = 'complex')
c = np.ones((g,v), dtype = 'complex')
H_vnn = np.zeros((N,v,N), dtype = 'complex')

for i in range(g):
    adotb  = np.dot(a[i,:,:],b[i,:,:].T)
    H_vnn += np.array([c[i,v]*adotb) for v in range(3)])