8.4: Приклад - проблема частинок в коробці
- Page ID
- 79569
Для демонстрації використання розріджених матриць для розв'язання скінченно-різницевих рівнянь розглянуто одномерну задачу частинки в коробці. Це складається з 1D незалежного від часу хвильового рівняння Шредінгера,
\[-\frac{1}{2} \, \frac{d^2\psi}{dx^2} = E\psi(x), \quad 0 \le x \le L,\]
разом з граничними умовами Діріхле
\[\psi(0) = \psi(L) = 0.\]
Аналітичний розчин нам добре відомий; до нормалізаційного фактора власні стани і енергетичні власні значення
\[\psi_m(x) = \sin\Big(m\pi x / L\Big),\quad E_m = \frac{1}{2}\, \left(\frac{m\pi}{L}\right)^2, \quad m = 1, 2, 3, \dots\]
Ми напишемо програму, яка шукає числове рішення. Використовуючи триточкове правило для дискретизації другої похідної, скінченно-різницеві матричні рівняння стають
\[-\frac{1}{2h^2}\begin{bmatrix} -2 & 1 \\ 1 & -2 & \ddots \\ & \ddots & \ddots & 1 \\ & & 1 & -2\end{bmatrix} \begin{bmatrix}\psi_0 \\ \psi_1 \\ \vdots \\ \psi_{N-1}\end{bmatrix} = E \begin{bmatrix}\psi_0 \\ \psi_1 \\ \vdots \\ \psi_{N-1}\end{bmatrix},\]
де
\[h = \frac{L}{N + 1}, \quad \psi_n = \psi\Big(x = h(n+1)\Big)\]
Наступна програма будує матричне рівняння скінченної різниці та відображає перші три розв'язки:
from scipy import * import scipy.sparse as sp import scipy.sparse.linalg as spl import matplotlib.pyplot as plt ## Solve the 1D particle-in-a-box problem for box length L, ## using N discretization points. The parameter nev is the ## number of eigenvalues/eigenvectors to find. Return three ## arrays E, psi, and x. E stores the energy eigenvalues; ## psi stores the (non-normalized) eigenstates; and x stores ## the discretization points. def particle_in_a_box(L, N, nev=3): dx = L/(N+1.0) x = linspace(dx, L-dx, N) I = ones(N) ## Set up the finite-difference matrix. H = sp.dia_matrix(([I, -2*I, I], [-1,0,1]), shape=(N,N)) H *= -0.5/(dx*dx) ## Find the lowest eigenvalues and eigenvectors. E, psi = spl.eigsh(H, k=nev, sigma=-1.0) return E, psi, x def particle_in_a_box_demo(): E, psi, x = particle_in_a_box(1.0, 1000) ## Print the energy eigenvalues. print(E) ## Plot |psi(x)|^2 vs x for each solution found. fig = plt.figure() axs = plt.subplot(1,1,1) for n in range(len(E)): fig_label = "State #" + str(n) plt.plot(x, abs(psi[:,n])**2, label=fig_label, linewidth=2) plt.xlabel('x') plt.ylabel('|psi(x)|^2') ## Shrink the axis by 20%, so the legend can fit. box = axs.get_position() axs.set_position([box.x0, box.y0, box.width * 0.8, box.height]) ## Print the legend. plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) plt.show() particle_in_a_box_demo()
Гамільтонова матриця, яка є тридіагоналлю, побудована у форматі розрідженої матриці DIA. власні значення та власні вектори знайдені з eigsh
, що може бути використано, оскільки гамільтонова матриця, як відомо, є Ермітієвою. Зверніть увагу, що ми викликаємо eigsh
за допомогою параметра sigma
, вказуючи власному розв'язнику знайти власні значення, найближчі за значенням до\(-1.0\):
E, psi = spl.eigsh(H, k=nev, sigma=-1.0)
Це дозволить знайти найнижчі власні значення енергії, оскільки в цьому випадку всі власні значення енергії є позитивними. (Ми використовуємо\(-1.0\) замість 0.0, тому що алгоритм не працює добре, коли сигма
дорівнює рівному нулю.) Якщо присутній негативний потенціал, нам доведеться знайти іншу оцінку для нижньої межі власних значень енергії, і передати її сигмі
.
Крім того, ми могли б назвати eigsh
з входом whic='SA '
. Це скаже власному вирішувачу знайти власне значення з найменшим значенням. Ми уникаємо цього, оскільки алгоритм ARPACK власний розв'язувач відносно неефективний при знаходженні невеликих власних значень, у якому
режимі (і іноді він може навіть не сходитися, якщо k
занадто малий). Як правило, якщо у вас є можливість вивести нижню межу для потрібних власних значень, то краще використовувати сигму
.
Запуск програми виводить найменші власні значення енергії:
[ 4.93479815 19.73914399 44.41289171]
Це добре узгоджується з аналітичними результатами\(E_1 = \pi^2/2 = 4.934802\)\(E_2 = 2\pi^2 = 19.739208\), і\(E_3=9\pi^2/2 = 44.413219\). Він також виробляє сюжет, показаний нижче, що так само, як і очікувалося.