用Python可视化量子波函数:5分钟动态理解概率密度

量子力学的抽象数学描述常让人望而生畏,但代码却能将其转化为直观的视觉体验。我们不需要死记硬背薛定谔方程,通过Python的数值计算和可视化工具,可以亲手构建量子世界的动态图像。

1. 环境准备与基础概念

在开始前,确保安装以下Python库:

pip install numpy matplotlib ipywidgets

量子波函数Ψ(x,t)的核心特性:

  • 概率密度:|Ψ(x,t)|²表示粒子出现在位置x的概率
  • 归一化:全空间积分∫|Ψ|²dx = 1
  • 相位无关性:Ψ与e^iθΨ描述同一物理状态

以一维无限深势阱为例,其基态波函数解析解为:

Ψ(x) = √(2/L) * sin(πx/L)  (0 ≤ x ≤ L)

2. 静态波函数可视化

我们先绘制静态波函数及其概率密度:

import numpy as np
import matplotlib.pyplot as plt

L = 1  # 势阱宽度
x = np.linspace(0, L, 1000)

# 基态波函数
def psi_ground(x, L):
    return np.sqrt(2/L) * np.sin(np.pi*x/L)

psi = psi_ground(x, L)
probability_density = np.abs(psi)**2

plt.figure(figsize=(10,6))
plt.plot(x, psi, label='Ψ(x) 波函数')
plt.plot(x, probability_density, label='|Ψ(x)|² 概率密度')
plt.xlabel('位置 x')
plt.title('一维无限深势阱基态')
plt.legend()
plt.grid(True)
plt.show()

关键参数说明:

参数 物理意义 典型值
L 势阱宽度 1 nm
x 位置坐标 0→L
ψ 波函数值 归一化

3. 动态时间演化

加入时间因子展示波函数演化:

from matplotlib.animation import FuncAnimation

hbar = 1.0545718e-34  # 约化普朗克常数
m = 9.10938356e-31    # 电子质量

def psi_time(x, t, L):
    E1 = (np.pi**2 * hbar**2)/(2*m*L**2)  # 基态能量
    return psi_ground(x, L) * np.exp(-1j*E1*t/hbar)

fig, ax = plt.subplots(figsize=(10,6))
line1, = ax.plot(x, np.real(psi_time(x, 0, L)), label='Re[Ψ(x,t)]')
line2, = ax.plot(x, np.abs(psi_time(x, 0, L))**2, label='|Ψ(x,t)|²')

def update(t):
    psi_t = psi_time(x, t*1e-16, L)  # 时间缩放因子
    line1.set_ydata(np.real(psi_t))
    line2.set_ydata(np.abs(psi_t)**2)
    return line1, line2

ani = FuncAnimation(fig, update, frames=100, interval=50)
plt.legend()
plt.show()

注意:实际运行可能需要保存为GIF或使用Jupyter Notebook的%matplotlib notebook模式

4. 多态叠加与干涉

量子叠加态会产生有趣的干涉图案:

# 叠加第一激发态
def psi_excited(x, L):
    return np.sqrt(2/L) * np.sin(2*np.pi*x/L)

# 创建叠加态
def superposition(x, t, L, c1=0.7, c2=0.3):
    E2 = (4*np.pi**2 * hbar**2)/(2*m*L**2)
    return c1*psi_time(x, t, L) + c2*psi_excited(x, L)*np.exp(-1j*E2*t/hbar)

# 可视化代码...

典型叠加态特征:

  1. 概率密度随时间周期性变化
  2. 波节(节点)位置固定不变
  3. 相位差导致干涉条纹移动

5. 三维势阱与高级可视化

扩展到三维立方势阱:

from mpl_toolkits.mplot3d import Axes3D

Lx, Ly, Lz = 1, 1, 1
x = y = z = np.linspace(0, 1, 50)
X, Y, Z = np.meshgrid(x, y, z)

# 三维基态波函数
psi_3d = (np.sqrt(8/(Lx*Ly*Lz)) * 
          np.sin(np.pi*X/Lx) * 
          np.sin(np.pi*Y/Ly) * 
          np.sin(np.pi*Z/Lz))

# 等值面可视化
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, Z, c=psi_3d**2, alpha=0.1)

量子可视化技巧:

  • 使用颜色映射表示相位
  • 等概率密度曲面展示三维分布
  • 交互式控件调节参数

6. 实际应用与问题排查

常见问题解决方案:

问题现象 可能原因 解决方法
图像不更新 时间步长太大 减小Δt或增加帧数
数值溢出 单位制不合适 使用自然单位制
边界异常 离散化不足 增加网格点数

调试建议:

# 检查归一化
integral = np.trapz(np.abs(psi)**2, x)
print(f"归一化积分值: {integral:.6f}")  # 应接近1

在Jupyter中创建交互式控件:

from ipywidgets import interact

@interact(
    n=(1, 5), 
    L=(0.5, 2.0), 
    t=(0, 100)
)
def plot_interactive(n=1, L=1.0, t=0):
    psi_n = np.sqrt(2/L) * np.sin(n*np.pi*x/L)
    plt.plot(x, np.abs(psi_n)**2)
    plt.ylim(0, 3/L)

量子计算中常用的一维谐振子波函数可视化需要采用Hermite多项式,这可以通过scipy.special.hermite实现。对于更复杂的势场,可能需要数值求解薛定谔方程,这时有限差分法或谱方法会更适合。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐