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

일부 고유 값의 퇴화 는 Lanczos 알고리즘고장의 특징처럼 보입니다 . Lanczos 알고리즘은 Hermitian 행렬의 고유 값과 고유 벡터를 근사화하기 위해 가장 일반적으로 사용되는 방법 중 하나입니다. ARPACK 라이브러리를 호출하여 scipy.eigsh ()가 사용하는 것 입니다.

정확한 산술에서 Lanczos 알고리즘은 일련의 직교 벡터를 생성하지만 부동 소수점 산술에서는 직교가 아니며 선형 적으로 종속 될 수 있습니다. 실제로 성가신 것은 대략적인 고유 값 중 하나가 실제 고유 값 중 하나로 수렴 될 때 정확하게 발생한다는 것입니다. 즉 알고리즘 자체가 방해를받습니다. 결과적으로 근처의 고유 값의 가짜 쌍을 얻게됩니다. 예를 들어 Gram-Schmidt를 사용하여 수렴 된 고유 벡터를 모든 단계에서 직교하도록 강제하는 등 다양한 수정이 있습니다.

그럼에도 불구하고, 특히 행렬의 전체 스펙트럼을 계산하려는 경우 완벽한 방법이 없습니다 . 따라서 50 개의 가장 작은 고유 값을 얻으려고하면 100 개의 요소가있는 벡터로 파동 함수를 근사하고 eigsh()50 포인트가있는 벡터를 사용하고 모두를 요구하는 것보다 처음 50 개의 에너지 레벨 만 요구 하는 것이 좋습니다. 고유 값

자세한 내용을 보려면 큰 고유 값 문제에 대한 Yousef Saad의 수학적 방법을보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.