我编写了一个 Python 代码,用于计算具有横向场的伊辛模型的状态密度矩阵,然后计算系统的冯·诺依曼熵。问题是状态密度矩阵随着 $2^N$ 增长,其中 N 是晶格中的自旋数。该程序在 N = 14 之前运行良好,但在 N = 15 时就会崩溃。需要注意的是,我使用 Google Colab 来运行代码,并且有 12.7 GB 的可用 RAM。有人可以帮助我优化代码以运行更大的矩阵吗?
import numpy as np
import matplotlib.pyplot as plt
from qutip import sigmax, sigmaz, qeye, tensor, Qobj, entropy_vn
def hamiltonian(N, lambd):
sx = sigmax()
sz = sigmaz()
si = qeye(2)
H = 0
for i in range(N):
H -= lambd * tensor([sx if j == i or j == (i+1)%N else si for j in range(N)])
H -= tensor([sz if j == i else si for j in range(N)])
return H
def reduced_density_matrix(psi, N):
rho = psi.ptrace(0) # Partial trace to get the reduced density matrix
return rho
def von_neumann_entropy(N, lambd):
H = hamiltonian(N, lambd)
eigvals, eigvecs = H.eigenstates()
ground_state = eigvecs[0]
rho_i = reduced_density_matrix(ground_state, N)
S_vn = entropy_vn(rho_i) # Compute the von Neumann entropy
return S_vn
# Plotting the von Neumann entropy for various values of N
Ns = range(2, 16) # Values of N from 2 to 15
lambd = 1.0 # Transverse field strength
entropies = []
for N in Ns:
S_vn = von_neumann_entropy(N, lambd)
entropies.append(S_vn)
plt.figure(figsize=(10, 6))
plt.plot(Ns, entropies, marker='o')
plt.xlabel('Number of Spins (N)')
plt.ylabel('Von Neumann Entropy')
plt.title('Von Neumann Entropy vs. Number of Spins for Transverse Field Ising Model')
plt.grid(True)
plt.show()
我尝试使用以下方法仅计算第一个特征值:
H.eigenstates(eigvals=1, sparse=True)
但它只适用于 N = 14,对于更高的 N 值,它仍然不起作用。我还尝试进行插值/外推,但不是一个很好的近似,我想精确计算密度矩阵。
我测试了您的代码,并注意到,删除
eigvals=1
并仅使用稀疏矩阵,可能会导致内存使用量严重下降。我不知道发生了什么导致 eigvals=1
消耗如此多的内存,但删除它就可以了。
顺便说明一下,如果您需要更多 RAM,请考虑使用 Linux SWAP 内存。这是将 HD 或 SSD 的一部分用作辅助 RAM 内存的有用方法。它会比较慢,但可以作为实际 RAM 的替代品。