别再死记硬背薛定谔方程了!用Python可视化波函数,5分钟搞懂概率密度
·
用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)
# 可视化代码...
典型叠加态特征:
- 概率密度随时间周期性变化
- 波节(节点)位置固定不变
- 相位差导致干涉条纹移动
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实现。对于更复杂的势场,可能需要数值求解薛定谔方程,这时有限差分法或谱方法会更适合。
更多推荐


所有评论(0)