Tại sao SciPy eigsh () tạo ra các giá trị riêng sai trong trường hợp dao động điều hòa?


15

Tôi đang phát triển một số mã lớn hơn để thực hiện các tính toán eigenvalue của các ma trận thưa thớt lớn, trong bối cảnh vật lý tính toán. Tôi kiểm tra các thói quen của tôi chống lại bộ dao động điều hòa đơn giản trong một chiều, vì các giá trị riêng được biết đến một cách phân tích. Làm như vậy và so sánh các thói quen của riêng tôi với người giải quyết sẵn có của SciPy, tôi đã bắt gặp sự kỳ lạ được hiển thị trong cốt truyện dưới đây. Tại đây, bạn có thể thấy 100 giá trị riêng được tính toán bằng số và giá trị riêng phân tíchλnbạnmλmộtnmột

Xung quanh eigenvalue số 40, kết quả số thương mại bắt đầu phân kỳ từ những người phân tích. Điều này không làm tôi ngạc nhiên (tôi sẽ không đi vào lý do tại sao ở đây, trừ khi nó xuất hiện trong cuộc thảo luận). Tuy nhiên, điều đáng ngạc nhiên với tôi là eigsh () tạo ra các giá trị riêng suy biến (khoảng số eigenvalue 80). Tại sao eigsh () lại hành xử như vậy đối với một số lượng nhỏ giá trị bản địa như vậy?

nhập mô tả hình ảnh ở đây

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()

Đó là một hành vi rất tò mò. Tôi sẽ kiểm tra nó sau ngày hôm nay.
Rafael Reiter

Tôi tìm thấy câu trả lời. Tóm lại: suy nghĩ của tôi đã sai. Các giải pháp phân tích của bộ dao động điều hòa (HOSZ) là hợp lệ mà không có bất kỳ hạn chế không gian. Tuy nhiên, trong đoạn mã trên, hộp của tôi chạy từ -10 đến 10, do đó, điều này đặt một điều kiện biên cho các giải pháp số. Do đó, eigsh () giải quyết hệ thống được cung cấp chính xác. Với khoảng n = 50 (với n là số lượng tử chính), các giải pháp phân tích không còn nằm trong hộp -10, 10 nữa. Bây giờ (sau một số suy nghĩ), điều này có vẻ rõ ràng. Tuy nhiên, tôi đã không thấy điều đó trong khi xây dựng và thử nghiệm mã.
seb

Điều này vẫn không giải thích được sự thoái hóa, phải không?
seb

Câu trả lời:


12

Sự suy biến của một số giá trị bản địa đối với tôi giống như dấu hiệu của sự phá vỡ thuật toán Lanczos . Thuật toán Lanczos là một trong những phương pháp được sử dụng phổ biến hơn để xấp xỉ các giá trị riêng và hàm riêng của ma trận Hermiti; đó là những gì scipy.eigsh () sử dụng, thông qua một cuộc gọi đến thư viện ARPACK .

Trong số học chính xác, thuật toán Lanczos tạo ra một tập các vectơ trực giao, nhưng trong số học dấu phẩy động, chúng có thể không trực giao và thậm chí trở thành phụ thuộc tuyến tính. Điều thực sự khó chịu là sự mất tính trực giao này xảy ra chính xác khi một trong những giá trị riêng gần đúng đã hội tụ đến một trong những giá trị riêng thực sự - thuật toán phá hoại chính nó, có thể nói. Kết quả là bạn sẽ nhận được một số cặp giá trị riêng gần đó. Có nhiều cách khắc phục khác nhau, ví dụ như sử dụng Gram-Schmidt để buộc bất kỳ người bản địa hội tụ nào phải trực giao ở mỗi bước.

Tuy nhiên, không có phương pháp nào là hoàn hảo, đặc biệt nếu bạn đang cố gắng tính toán toàn bộ phổ của ma trận của mình . Vì vậy, nếu bạn đang cố gắng để có được 50 giá trị riêng nhỏ nhất, bạn có thể tốt hơn là xấp xỉ hàm sóng bằng một vectơ với 100 phần tử và chỉ yêu cầu eigsh()50 mức năng lượng đầu tiên, thay vì sử dụng vectơ có 50 điểm và yêu cầu tất cả của giá trị bản địa.

Nếu bạn muốn đọc thêm, hãy xem Phương pháp số của Yousef Saad cho các vấn đề Eigenvalue lớn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.