Я пытаюсь сделать частицу в имитации коробки без потенциального поля. Мне потребовалось некоторое время, чтобы выяснить, что простые явные и неявные методы нарушают эволюцию унитарного времени, поэтому я прибег к Крэнку-Николсону, который должен быть унитарным. Но когда я пытаюсь это сделать, я обнаруживаю, что это не так Я не уверен, что мне не хватает .. Я использовал следующую формулировку:
где T - трехдиагональная матрица Теплица для второй производной по x и
Система упрощается до
Матрицы A и B:
Я просто решаю эту линейную систему для с помощью разреженного модуля. Математика имеет смысл, и я нашел такую же числовую схему в некоторых работах, что заставило меня поверить, что мой код - вот где проблема.
Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz
from scipy.sparse.linalg import spsolve
from scipy import sparse
# Spatial discretisation
N = 100
x = np.linspace(0, 1, N)
dx = x[1] - x[0]
# Time discretisation
K = 10000
t = np.linspace(0, 10, K)
dt = t[1] - t[0]
alpha = (1j * dt) / (2 * (dx ** 2))
A = sparse.csc_matrix(toeplitz([1 + 2 * alpha, -alpha, *np.zeros(N-4)]), dtype=np.cfloat) # 2 less for both boundaries
B = sparse.csc_matrix(toeplitz([1 - 2 * alpha, alpha, *np.zeros(N-4)]), dtype=np.cfloat)
# Initial and boundary conditions (localized gaussian)
psi = np.exp((1j * 50 * x) - (200 * (x - .5) ** 2))
b = B.dot(psi[1:-1])
psi[0], psi[-1] = 0, 0
for index, step in enumerate(t):
# Within the domain
psi[1:-1] = spsolve(A, b)
# Enforce boundaries
# psi[0], psi[N - 1] = 0, 0
b = B.dot(psi[1:-1])
# Square integration to show if it's unitary
print(np.trapz(np.abs(psi) ** 2, dx))