Skip to main content
LibreTexts - Ukrayinska

8.4: Приклад - проблема частинок в коробці

  • Page ID
    79569
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Для демонстрації використання розріджених матриць для розв'язання скінченно-різницевих рівнянь розглянуто одномерну задачу частинки в коробці. Це складається з 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\). Він також виробляє сюжет, показаний нижче, що так само, як і очікувалося.

    clipboard_e22eb5ccea1b06a356221a63fa92954dc.png
    Малюнок\(\PageIndex{1}\): Графіки\(|\psi(x)|^2\) проти\(x\) для задачі частинки в коробці.