เหตุใด SciPy eigsh () จึงสร้างค่าลักษณะเฉพาะที่ผิดพลาดในกรณีของ oscillator ที่มีค่าฮาร์มอนิก


15

ฉันกำลังพัฒนาโค้ดขนาดใหญ่ขึ้นเพื่อทำการคำนวณค่าไอคิวของเมทริกซ์กระจัดกระจายขนาดใหญ่ในบริบทของฟิสิกส์การคำนวณ ฉันทดสอบกิจวัตรของฉันกับออสซิลลาสฮาร์มอนิกง่ายๆในมิติเดียวเนื่องจากค่าลักษณะเฉพาะนั้นเป็นที่รู้จักกันดีในเชิงวิเคราะห์ การทำเช่นนั้นและเปรียบเทียบกิจวัตรของฉันเองกับนักแก้ปัญหา inbuilt ของ SciPy ฉันได้พบกับสิ่งแปลกประหลาดที่แสดงในพล็อตด้านล่าง ที่นี่คุณสามารถดูค่าลักษณะเฉพาะที่คำนวณตัวเลข 100 ตัวแรกและค่าลักษณะเฉพาะเชิงวิเคราะห์λnยูม.λana

ประมาณค่าลักษณะเฉพาะจำนวน 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()

นั่นเป็นพฤติกรรมที่อยากรู้อยากเห็นมาก ฉันจะทดสอบในวันนี้
Rafael Reiter

ฉันพบคำตอบ ในระยะสั้น: ความคิดของฉันผิด โซลูชันการวิเคราะห์ของฮาร์มอนิก oscillator (HOSZ) นั้นใช้ได้โดยไม่มีข้อ จำกัด ทางอวกาศ อย่างไรก็ตามในรหัสข้างต้นกล่องของฉันเริ่มต้นที่ -10 ถึง 10 ดังนั้นสิ่งนี้จะทำให้เงื่อนไขขอบเขตในการแก้ปัญหาเชิงตัวเลข ดังนั้น eigsh () แก้ระบบที่ได้รับอย่างถูกต้อง ที่ประมาณ n = 50 (โดยที่ n เป็นหมายเลขควอนตัมหลัก) โซลูชันการวิเคราะห์ไม่พอดีกับใน -10, 10 กล่องอีกต่อไป ตอนนี้ (หลังจากการคิดบางอย่าง) ดูเหมือนว่าชัดเจน อย่างไรก็ตามฉันไม่เห็นว่าในขณะที่สร้างและทดสอบรหัส
seb

สิ่งนี้ยังไม่ได้อธิบายถึงความเสื่อมโทรม
seb

คำตอบ:


12

เสื่อมบางลักษณะค่าลักษณะเฉพาะที่ฉันชอบจุดเด่นของรายละเอียดของขั้นตอนวิธีการ Lanczos อัลกอริทึม Lanczos เป็นหนึ่งในวิธีที่ใช้กันโดยทั่วไปเพื่อประมาณค่าลักษณะเฉพาะและค่าเฉพาะของเมทริกซ์เฮอร์เมียน มันเป็นสิ่งที่ scipy.eigsh () ใช้ผ่านการเรียกร้องให้มีห้องสมุด ARPACK

ในการคำนวณที่แน่นอนอัลกอริธึม Lanczos สร้างชุดของเวกเตอร์มุมฉาก แต่ในการคำนวณจุดลอยตัวสิ่งเหล่านี้สามารถล้มเหลวในการตั้งฉากและแม้กระทั่งกลายเป็นเชิงเส้นขึ้นอยู่กับ สิ่งที่น่ารำคาญจริงๆก็คือการสูญเสีย orthogonality นี้เกิดขึ้นอย่างแม่นยำเมื่อหนึ่งในค่าลักษณะเฉพาะประมาณได้แปรสภาพเป็นหนึ่งในค่าลักษณะที่แท้จริง - อัลกอริทึมก่อวินาศกรรมตัวเองเพื่อที่จะพูด ผลลัพธ์ก็คือคุณจะได้ค่าลักษณะใกล้เคียงที่น่าเกรงขาม มีการแก้ไขที่หลากหลายสำหรับเรื่องนี้เช่นการใช้ Gram-Schmidt เพื่อบังคับให้ eigenvector ที่รวมกันเป็น orthogonal ในทุกขั้นตอน

อย่างไรก็ตามวิธีการไม่เป็นที่สมบูรณ์แบบโดยเฉพาะอย่างยิ่งถ้าคุณกำลังพยายามที่จะคำนวณทั้งสเปกตรัมของเมทริกซ์ของคุณ ดังนั้นหากคุณกำลังพยายามหาค่าลักษณะเฉพาะที่เล็กที่สุด 50 ค่าคุณอาจจะดีกว่าการประมาณฟังก์ชั่นคลื่นโดยเวกเตอร์ที่มีองค์ประกอบ 100 ชิ้นและขอเฉพาะeigsh()ระดับพลังงาน 50 อันดับแรกแทนที่จะใช้เวกเตอร์ที่มี 50 คะแนนและขอทั้งหมด ของค่าลักษณะเฉพาะ

หากคุณต้องการอ่านรายละเอียดเพิ่มเติมดูที่ Yousef ซาดของวิธีเชิงตัวเลขสำหรับปัญหา eigenvalue ขนาดใหญ่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.