如何在循环中归一化本征函数,使总概率密度之和为1?
问题分析
你当前的代码中,LA.eig(H)返回的本征向量矩阵v是正交归一的(当H为厄米矩阵时),因此v@np.conj(v.T)会得到单位矩阵——这意味着每个位置的概率密度为1,每个步骤的总概率等于系统维度数(或空间点数量)。循环steps+1次后,总概率自然等于steps+1(近似为steps)。
要让所有步骤的概率密度之和为1,核心是给每个步骤的概率密度分配归一化权重,确保所有权重之和为1。
解决方案
根据需求,这里提供两种实用的归一化方式:
1. 均匀权重归一化(最常用)
若每个步骤的重要性相同,给每个步骤分配1/(steps+1)的权重(循环从0到steps,共steps+1个步骤),将每个步骤的概率密度乘以权重后累加:
import numpy as np from numpy import linalg as LA # 初始化总概率密度,形状与H一致 total_probdensity = None # 计算每个步骤的权重 num_steps = steps + 1 weight = 1 / num_steps for x in range(0, steps+1): # ... 此处省略构建哈密顿量H的代码 w, v = LA.eig(H) # 计算当前步骤的密度矩阵 probdensity = v @ np.conj(v.T) # 第一次循环时初始化总密度数组 if total_probdensity is None: total_probdensity = np.zeros_like(probdensity) # 累加带权重的概率密度 total_probdensity += probdensity * weight
最终total_probdensity的总概率(迹)将为1,满足需求。
2. 按本征值加权(考虑态的占据概率)
如果需要根据本征值(能量)分配权重(比如玻尔兹曼分布),可以先计算每个本征态的权重,再构建密度矩阵:
import numpy as np from numpy import linalg as LA num_steps = steps + 1 total_probdensity = None beta = 1 # 玻尔兹曼因子,可根据需求调整 for x in range(0, steps+1): # ... 构建H的代码 w, v = LA.eig(H) # 计算玻尔兹曼权重并归一化 weights = np.exp(-beta * w) weights /= np.sum(weights) # 构建带权重的密度矩阵 probdensity = v @ np.diag(weights) @ np.conj(v.T) if total_probdensity is None: total_probdensity = np.zeros_like(probdensity) # 按步骤均匀加权累加 total_probdensity += probdensity / num_steps
这种方式既考虑了本征态的占据概率,也保证了所有步骤的总概率之和为1。
关键补充
LA.eig返回的本征向量是列向量,v@np.conj(v.T)是所有本征态的等权重混合密度矩阵;若只需单个本征态的概率密度,应取v[:,i]对应的列向量计算np.abs(v[:,i])**2。- 若“步骤”指空间点而非时间步,只需将权重改为
1/空间点总数,逻辑完全一致。
内容的提问来源于stack exchange,提问作者userman5000
相关产品推荐
相关产品推荐

