如何在quspin包中固定张量基的总粒子数?
解决QuSpin张量基固定总粒子数的问题
核心思路
不用user_basis的话,可通过筛选原张量基中符合总粒子数要求的态,再从这些态生成新的合法QuSpin基对象来实现。步骤如下:
- 遍历原张量基的所有态,计算每个态对应的费米子数和玻色子数,筛选出总粒子数等于目标值的态索引。
- 利用原基的
get_vec()方法提取这些态的矩阵表示,再通过basis.from_array()方法生成新的QuSpin基。
具体代码实现
以你提供的代码为例,假设目标总粒子数N_total=10:
import numpy as np from quspin.basis import spinless_fermion_basis_1d, boson_basis_1d, tensor_basis Lferm=8 Nbosons=20 N_total=10 # 目标总粒子数 # 定义原始张量基 basis_fermion=spinless_fermion_basis_1d(L=Lferm, Nf=range(0,Lferm+1)) basis_boson = boson_basis_1d(L=1, sps=Nbosons+1, Nb=range(0,Nbosons+1)) basis = tensor_basis(basis_fermion, basis_boson) # 1. 筛选符合总粒子数要求的态索引 valid_indices = [] for i in range(basis.Ns): # 分解张量态为费米子态和玻色子态的索引 i_ferm, i_boson = basis.index_split(i) # 获取费米子数 n_ferm = basis_fermion.Nf[i_ferm] # 获取玻色子数 n_boson = basis_boson.Nb[i_boson] # 检查总粒子数是否符合要求 if n_ferm + n_boson == N_total: valid_indices.append(i) valid_indices = np.array(valid_indices) # 2. 提取符合条件的态并生成新基 # 获取这些态的矩阵表示(每行对应一个态) state_array = basis.get_vec(valid_indices).T # 从矩阵生成新的QuSpin基对象 new_basis = basis.from_array(state_array, check_symm=False)
关键细节说明
basis.index_split(i):将张量基的索引i分解为对应子基(费米子、玻色子)的索引,方便分别获取粒子数。basis.get_vec(valid_indices):提取指定索引的态,返回的是列向量形式,转置后变成行向量矩阵,符合from_array的输入要求。check_symm=False:因为我们已经手动筛选了符合条件的态,关闭对称性检查可以加快生成速度,同时避免不必要的错误。
生成的new_basis是标准的QuSpin基对象,可以直接用于构建哈密顿量等后续操作。
内容的提问来源于stack exchange,提问作者Swiss_cheese__
相关产品推荐
相关产品推荐

