You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在quspin包中固定张量基的总粒子数?

解决QuSpin张量基固定总粒子数的问题

核心思路

不用user_basis的话,可通过筛选原张量基中符合总粒子数要求的态,再从这些态生成新的合法QuSpin基对象来实现。步骤如下:

  1. 遍历原张量基的所有态,计算每个态对应的费米子数和玻色子数,筛选出总粒子数等于目标值的态索引。
  2. 利用原基的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__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:34:58