帮我的模型画出类似的量子度规迹与Berry曲率绝对值之差的等值线图import numpy as np
import matplotlib.pyplot as plt
from math import pi, exp
import cmath
# 模型参数
t1 = 1.0
t2 = 0.4 * cmath.exp(1j * 0.37) # 复数值跃迁
t3 = 0.13
# 晶格矢量 (假设二维正方晶格)
lat = np.array([[1.0, 0.0], [0.0, 1.0]])
# 轨道位置 (假设三个轨道位于原点)
orb = np.array([[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]])
def hamiltonian(kx, ky):
"""构建3x3哈密顿量矩阵"""
H = np.zeros((3, 3), dtype=complex)
# 添加跃迁项 (基于提供的跳跃项)
# t1 相关项
H[0, 1] += t1 * (1 + cmath.exp(-1j * kx)) # [0,0] 和 [-1,0]
H[0, 2] += t1 * (1 + cmath.exp(-1j * ky)) # [0,0] 和 [0,-1]
# t2 相关项
H[1, 2] += t2 * (1 + cmath.exp(1j * (kx - ky)) + cmath.exp(-1j * kx)) # [0,0], [1,-1], [-1,0]
H[2, 1] += np.conj(t2) * (1 + cmath.exp(-1j * (kx - ky)) + cmath.exp(1j * kx)) # 厄米共轭
# t3 相关项 (次近邻跳跃)
H[0, 0] += 2 * t3 * (np.cos(kx) + np.cos(ky))
H[1, 1] += 2 * t3 * (np.cos(kx) + np.cos(ky))
H[2, 2] += 2 * t3 * (np.cos(kx) + np.cos(ky))
# 确保哈密顿量是厄米的
H = (H + H.conj().T) / 2
return H
def hamiltonian_deriv(kx, ky, mu):
"""计算哈密顿量对k_mu的导数 (mu=0: kx, mu=1: ky)"""
H_deriv = np.zeros((3, 3), dtype=complex)
if mu == 0: # ∂/∂kx
# t1 项导数
H_deriv[0, 1] += -1j * t1 * cmath.exp(-1j * kx)
H_deriv[0, 2] += 0
# t2 项导数
H_deriv[1, 2] += t2 * (1j * cmath.exp(1j * (kx - ky)) - 1j * cmath.exp(-1j * kx))
# t3 项导数
H_deriv[0, 0] += -2 * t3 * np.sin(kx)
H_deriv[1, 1] += -2 * t3 * np.sin(kx)
H_deriv[2, 2] += -2 * t3 * np.sin(kx)
else: # ∂/∂ky
# t1 项导数
H_deriv[0, 1] += 0
H_deriv[0, 2] += -1j * t1 * cmath.exp(-1j * ky)
# t2 项导数
H_deriv[1, 2] += t2 * (-1j * cmath.exp(1j * (kx - ky)))
# t3 项导数
H_deriv[0, 0] += -2 * t3 * np.sin(ky)
H_deriv[1, 1] += -2 * t3 * np.sin(ky)
H_deriv[2, 2] += -2 * t3 * np.sin(ky)
# 确保导数是厄米的
H_deriv = (H_deriv + H_deriv.conj().T) / 2
return H_deriv
def calc_qgt(kx, ky):
"""计算基态的量子几何张量"""
H = hamiltonian(kx, ky)
# 对角化哈密顿量
E, U = np.linalg.eigh(H)
psi0 = U[:, 0] # 基态波函数
# 计算哈密顿量导数
H_dx = hamiltonian_deriv(kx, ky, 0)
H_dy = hamiltonian_deriv(kx, ky, 1)
# 初始化QGT
Q = np.zeros((2, 2), dtype=complex)
# 使用公式(1.2.24)计算QGT分量
for n in range(1, 3): # 对激发态求和 (n=1,2)
psin = U[:, n]
denom = (E[0] - E[n])**2
# ⟨φ₀|∂ₓH|φₙ⟩
term_x = np.vdot(psi0, H_dx @ psin)
# ⟨φₙ|∂ᵧH|φ₀⟩
term_y = np.vdot(psin, H_dy @ psi0)
Q[0, 0] += term_x * term_y / denom
# 其他分量同理
term_y2 = np.vdot(psin, H_dx @ psi0)
Q[0, 1] += term_x * term_y2 / denom
term_x2 = np.vdot(psi0, H_dy @ psin)
Q[1, 0] += term_x2 * term_y / denom
Q[1, 1] += term_x2 * term_y2 / denom
return Q
# 设置k空间网格
nk = 100 # 网格点数
kx_list = np.linspace(0, 2*pi, nk)
ky_list = np.linspace(0, 2*pi, nk)
tr_g = np.zeros((nk, nk))
# 遍历所有k点
for i, kx in enumerate(kx_list):
for j, ky in enumerate(ky_list):
Q = calc_qgt(kx, ky)
# 取实部得到度规张量g
g = np.real(Q)
# 计算迹
tr_g[j, i] = np.trace(g)
# 绘制热图
plt.figure(figsize=(8, 6))
im = plt.imshow(tr_g, cmap='hot', origin='lower',
extent=[0, 2*pi, 0, 2*pi])
plt.colorbar(im, label='tr(g)')
plt.xlabel('$k_x$')
plt.ylabel('$k_y$')
plt.title('Quantum Metric Trace (tr(g)) for Ground State')
plt.tight_layout()
plt.show()