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

如何在循环中归一化本征函数,使总概率密度之和为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:01:28