Чому SciPy eigsh () виробляє помилкові власні значення у разі гармонійного осцилятора?


15

Я розробляю якийсь більший код для виконання обчислень власних значень величезних розріджених матриць в контексті обчислювальної фізики. Я перевіряю свої підпрограми проти простого гармонічного осцилятора в одному вимірі, оскільки власні значення добре відомі аналітично. Роблячи це і порівнюючи власну процедуру з вбудованими рішеннями SciPy, я зіткнувся з диваком, відображеним на сюжеті нижче. Тут ви можете побачити перші 100 чисельно обчислених власних значень та аналітичні власні значення λ a n aλнумλана

Навколо власного значення 40, числові результати починають відходити від аналітичних. Це мене не дивує (я не буду вникати, чому тут, якщо це не вийде в дискусії). Однак мене дивує те, що eigsh () створює вироджені власні значення (навколо власного значення 80). Чому eigsh () поводиться так для навіть такої невеликої кількості власних значень?

введіть тут опис зображення

import numpy as np
from scipy.sparse.linalg import eigsh
import myFunctions as myFunc
import matplotlib.pyplot as plt

#discretize x-axis
N = 100
xmin = -10.
xmax = 10.
accuracy = 1e-5
#stepsize
h = (xmax - xmin) / (N + 1.)
#exclude first and last points since we force wave function to be zero there
x = np.linspace(-10. + h,10. - h,N)
#create potential
V = x**2

def fivePoint(N,h,V):
    C0 = (np.ones(N))*30. / (12. * h * h) + V
    C1 = (np.ones(N)) * (-16.) / (12. * h * h)
    C2 = (np.ones(N)) / (12. * h * h)
    H = sp.spdiags([C2, C1, C0, C1, C2],[-2, -1, 0, 1, 2],N,N)
    return H

H = myFunc.fivePoint(N,h,V)
eigval,eigvec = eigsh(H, k=N-1, which='SM', tol=accuracy)

#comparison analytical and numerical eigenvalues
xAxes = np.linspace(0,len(eigval)-1,len(eigval))
analyticalEigval = 2. * (xAxes + 0.5)
plt.figure()
plt.plot(xAxes,eigval, '+', label=r"$\lambda_{num}$")
plt.plot(xAxes,analyticalEigval, label=r"$\lambda_{ana}$")
plt.xlabel("Number of Eigenvalue")
plt.ylabel("Eigenvalue")
plt.legend(loc=4)
plt.title("eigsh()-method: Comparison of $\lambda_{num}$ and $\lambda_{ana}$")
plt.show()

Це дуже допитлива поведінка. Я протестую це пізніше сьогодні.
Рафаель Рейтер

Я знайшов відповідь. Коротше кажучи: моє мислення було неправильним. Аналітичні рішення гармонічного осцилятора (HOSZ) дійсні без будь-яких просторових обмежень. Однак у наведеному вище коді мій ящик працює від -10 до 10, тому це ставить граничну умову для числових рішень. Отже, eigsh () вирішує систему, яку вона задана правильно. Приблизно n = 50 (головне число - квантове число n), аналітичні рішення більше не вміщуються у вікно -10, 10. Зараз (подумавши), це здається очевидним. Однак я цього не бачив під час створення та тестування коду.
seb

але це все ще не пояснює виродження, чи не так?
seb

Відповіді:


12

Виродження деяких власних значень для мене виглядає як ознака розбиття алгоритму Ланцоса . Алгоритм Ланцоса - один з найбільш часто використовуваних методів для наближення власних значень та власних векторів ермітових матриць; це те, що використовує scipy.eigsh () за допомогою виклику до бібліотеки ARPACK .

У точній арифметиці алгоритм Ланцоса виробляє набір ортогональних векторів, але в арифметиці з плаваючою комою вони не можуть бути ортогональними і навіть ставати лінійно залежними. Дійсно дратує те, що ця втрата ортогональності відбувається саме тоді, коли одне з наближених власних значень сходилося до одного з реальних власних значень - алгоритму саботажу, так би мовити. У результаті ви отримаєте кілька помилкових пар власних значень, що знаходяться поблизу. Для цього існують різні виправлення, наприклад, використовуючи Грам-Шмідта, щоб змусити будь-які зведені власні вектори бути ортогональними на кожному кроці.

Тим не менш, жоден метод не є ідеальним, особливо якщо ви намагаєтеся обчислити весь спектр своєї матриці . Отже, якщо ви намагаєтеся отримати 50 найменших власних значень, вам може бути краще наблизити хвильову функцію до вектора зі 100 елементами і запитати лише eigsh()перші 50 енергетичних рівнів, а не використовувати вектор з 50 балами і запитувати все власних значень.

Якщо ви хочете прочитати більше, подивіться чисельні методи Юсефа Саада для великих задач про власне значення .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.