ฉันมีคำถามสองสามข้อเกี่ยวกับสิ่งต่อไปนี้:
ฉันกำลังพยายามที่จะแก้สมการชโรดิงเงอร์ใน 1D โดยใช้ข้อเหวี่ยงนิโคลสันข้อเหวี่ยงตามด้วยการแปลงเมทริกซ์กลับด้านที่เกิดขึ้น ขณะนี้ปัญหาของฉันได้รับการพัฒนาเป็นปัญหาเกี่ยวกับเงื่อนไขขอบเขตเป็นระยะดังนั้นฉันจึงแก้ไขโค้ดของฉันเพื่อใช้อัลกอริทึม Sherman Morrison
สมมติว่าv
เป็น RHS ของฉันในแต่ละขั้นตอนเมื่อฉันต้องการกลับเมทริกซ์ไตรภาคี ขนาดของv
คือจำนวนจุดกริดที่ฉันมีมากกว่าพื้นที่ เมื่อฉันตั้งค่าv[0]
และv[-1]
ในแง่ของกันและกันตามที่จำเป็นในสถานการณ์ของฉันเป็นระยะสมการของฉันระเบิดขึ้น ฉันไม่สามารถบอกได้ว่าทำไมสิ่งนี้จึงเกิดขึ้น ฉันใช้ python2.7 และ inbuilt ของ scipy เพื่อแก้ไขสมการ
สิ่งนี้ทำให้ฉันถึงคำถามที่สองของฉัน: ฉันใช้หลามเพราะเป็นภาษาที่ฉันรู้จักดีที่สุด แต่ฉันคิดว่ามันค่อนข้างช้า (แม้จะมีการเพิ่มประสิทธิภาพที่เสนอโดย numpy และ scipy) ฉันได้ลองใช้ C ++ เพราะฉันคุ้นเคยกับมันอย่างสมเหตุสมผล ฉันคิดว่าฉันใช้ GSL ซึ่งจะเป็นการเพิ่มประสิทธิภาพ BLAS แต่ไม่พบเอกสารประกอบในการสร้างเวกเตอร์ที่ซับซ้อนหรือแก้เมทริกซ์ tridiagonal ด้วยเวกเตอร์ที่มีค่าที่ซับซ้อนเช่นนั้น
ฉันต้องการวัตถุในโปรแกรมของฉันเนื่องจากฉันรู้สึกว่ามันเป็นวิธีที่ง่ายที่สุดสำหรับฉันที่จะพูดคุยในภายหลังเพื่อรวมการมีเพศสัมพันธ์ระหว่าง wavefunctions ดังนั้นฉันจึงติดกับภาษาเชิงวัตถุ
ฉันลองเขียนตัวแก้เมทริกซ์ tridiagonal matrix ด้วยมือ แต่ฉันพบปัญหาเมื่อฉันทำเช่นนั้นในไพ ธ อน ในขณะที่ฉันมีการพัฒนาในช่วงเวลาที่มากขึ้นด้วยขั้นตอนที่ดีกว่าและดีกว่าข้อผิดพลาดที่สะสมและทำให้ฉันไร้สาระ เมื่อคำนึงถึงสิ่งนี้ฉันตัดสินใจใช้วิธีการที่สร้างขึ้น
คำแนะนำใด ๆ ที่ชื่นชมมาก
แก้ไข: นี่คือตัวอย่างรหัสที่เกี่ยวข้อง สัญกรณ์ถูกยืมมาจากหน้าของ Wikipedia บนสมการเมทริกซ์ tridiagonal (TDM) v คือ RHS ของอัลกอริธึมข้อเหวี่ยงนิโคลสันในแต่ละขั้นตอน เวกเตอร์ a, b และ c เป็นเส้นทแยงมุมของ TDM ขั้นตอนวิธีการแก้ไขสำหรับกรณีที่ระยะห่างจากCFD วิกิพีเดีย ฉันได้ทำการเปลี่ยนชื่อเล็กน้อย สิ่งที่พวกเขาเรียกว่า u, v ฉันได้เรียกว่า U, V (พิมพ์ใหญ่) ฉันเรียกว่าส่วนประกอบเสริม, y คือทางออกชั่วคราวและโซลูชันจริง self.currentState การมอบหมายของ v [0] และ v [-1] เป็นสิ่งที่ทำให้เกิดปัญหาที่นี่และได้รับการแสดงความคิดเห็น คุณอาจเพิกเฉยต่อปัจจัยของแกมม่า พวกเขาเป็นปัจจัยที่ไม่ใช่เชิงเส้นที่ใช้ในการสร้างแบบจำลอง Bose Einstein Condensates
for T in np.arange(self.timeArraySize):
for i in np.arange(0,self.spaceArraySize-1):
v[i] = Y*self.currentState[i+1] + (1-2*Y)*self.currentState[i] + Y*self.currentState[i-1] - 1j*0.5*self.timeStep*potential[i]*self.currentState[i] - self.gamma*1j*0.5*self.timeStep*(abs(self.currentState[i])**2)*self.currentState[i]
b[i] = 1+2*Y + 1j*0.5*self.timeStep*potential[i] + self.gamma*self.timeStep*1j*0.5*(abs(self.currentState[i])**2)
#v[0] = Y*self.currentState[1] + (1-2*Y)*self.currentState[0] + Y*self.currentState[-1] - 1j*0.5*self.timeStep*potential[0]*self.currentState[0]# - self.gamma*1j*0.5*self.timeStep*(abs(self.currentState[0])**2)*self.currentState[0]
#v[-1] = Y*self.currentState[0] + (1-2*Y)*self.currentState[-1] + Y*self.currentState[-2] - 1j*0.5*self.timeStep*potential[-1]*self.currentState[-1]# - self.gamma*1j*0.5*self.timeStep*(abs(self.currentState[-1])**2)*self.currentState[-1]
b[0] = 1+2*Y + 1j*0.5*self.timeStep*potential[0] + self.gamma*self.timeStep*1j*0.5*(abs(self.currentState[0])**2)
b[-1] = 1+2*Y + 1j*0.5*self.timeStep*potential[-1] + self.gamma*self.timeStep*1j*0.5*(abs(self.currentState[-1])**2)
diagCorrection[0], diagCorrection[-1] = - b[0], - c[-1]*a[0]/b[0]
tridiag = np.matrix([
c,
b - diagCorrection,
a,
])
temp = solve_banded((1,1), tridiag, v)
U = np.zeros(self.spaceArraySize, dtype=np.complex64)
U[0], U[-1] = -b[0], c[-1]
V = np.zeros(self.spaceArraySize, dtype=np.complex64)
V[0], V[-1] = 1, -a[0]/b[0]
complement = solve_banded((1,1), tridiag, U)
num = np.dot(V, temp)
den = 1 + np.dot(V, complement)
self.currentState = temp - (num/den)*complement