在Windows系统下编写一个python程序:用变形的Crank-Nicolson公式解一维运动粒子贯穿势垒的薛定谔方程。
时间: 2024-03-08 09:48:11 浏览: 101
好的,下面是在Windows系统下编写的Python程序,用变形的Crank-Nicolson公式解一维运动粒子贯穿势垒的薛定谔方程。请确保您已经安装了Python和必要的库(如NumPy和Matplotlib)。
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义计算参数
h = 1.0
hbar = 1.0
m = 1.0
L = 10.0
num_x = 100
num_t = 1000
dt = 0.01
dx = L / num_x
# 定义势能函数
def V(x):
if x < L / 2:
return 0
else:
return 10
# 初始化波函数
psi = np.zeros((num_x, num_t), dtype=complex)
x = np.linspace(0, L, num_x)
psi[:, 0] = np.exp(-((x-L/4)/2)**2)
# 使用变形的Crank-Nicolson公式求解薛定谔方程
for n in range(num_t-1):
A = np.zeros((num_x, num_x), dtype=complex)
for i in range(1, num_x-1):
A[i, i-1] = -0.5j * hbar * dt / dx**2
A[i, i] = 1 + 1j * hbar * dt / h / 2 + 1j * hbar * dt / dx**2
A[i, i+1] = -0.5j * hbar * dt / dx**2
A[i, i] -= 1j * dt / hbar * (V(x[i]) + V(x[i]) + 2 * V(x[i]) * np.abs(psi[i, n])**2)
A[0, 0] = 1
A[num_x-1, num_x-1] = 1
psi[:, n+1] = np.linalg.solve(A, psi[:, n])
# 绘制波函数随时间的演化图像
fig, ax = plt.subplots()
ax.set_xlabel('x')
ax.set_ylabel(r'$|\psi(x,t)|^2$')
for i in range(0, num_t, 100):
ax.plot(x, np.abs(psi[:, i])**2, label='t={:.2f}'.format(i*dt))
ax.legend()
plt.show()
```
在这个程序中,我们首先定义了计算参数,包括普朗克常数 $\hbar$、粒子质量 $m$、空间范围 $L$、空间网格数 $num_x$、时间步数 $num_t$、时间步长 $dt$ 和空间步长 $dx$。
然后,我们定义了势能函数 $V(x)$,在这个例子中,我们使用的是一个简单的势垒,即在位置 $x=L/2$ 之后,势能为常数 $10$,而在位置 $x<L/2$ 之前,势能为 $0$。
接下来,我们初始化波函数 $\psi(x,0)$,并使用变形的Crank-Nicolson公式求解薛定谔方程。在每个时间步长中,我们首先构建一个矩阵 $A$,然后使用线性代数库中的 `linalg.solve` 函数来解线性方程组 $A\psi_{n+1}=\psi_n$,从而得到下一个时间步长的波函数 $\psi(x, t_{n+1})$。
最后,我们绘制了波函数随时间的演化图像,其中 $|\psi(x,t)|^2$ 表示波函数的概率密度。
注意,由于这个程序使用了复数,因此在绘制图像时我们必须使用 `np.abs(psi[:, i])**2` 来计算波函数的概率密度。
阅读全文