Tôi có một vài câu hỏi liên quan đến các vấn đề sau:
Tôi đang cố gắng giải phương trình Schrodinger trong 1D bằng cách sử dụng phương pháp phân tách nicolson quây sau đó đảo ngược ma trận tridia chéo kết quả. Vấn đề của tôi bây giờ đã phát triển thành một vấn đề với các điều kiện biên định kỳ và vì vậy tôi đã sửa đổi mã của mình để sử dụng thuật toán Sherman Morrison.
Giả sử v
là RHS của tôi ở mỗi bước khi tôi muốn đảo ngược ma trận ba cực. Kích thước của v
là số điểm lưới tôi có trên không gian. Khi tôi thiết lập v[0]
và v[-1]
xét về nhau theo yêu cầu trong tình huống định kỳ của mình, phương trình của tôi sẽ nổ tung. Tôi không thể nói tại sao điều này xảy ra. Tôi đang sử dụng python2.7 và scipy đã sẵn sàng giải quyết_banded để giải phương trình.
Điều này dẫn tôi đến câu hỏi thứ hai của tôi: Tôi đã sử dụng python vì đó là ngôn ngữ tôi biết rõ nhất, nhưng tôi thấy nó khá chậm (ngay cả với các tối ưu hóa được cung cấp bởi numpy và scipy). Tôi đã thử sử dụng C ++ vì tôi khá quen thuộc với nó. Tôi nghĩ rằng tôi sẽ sử dụng GSL sẽ được tối ưu hóa BLAS, nhưng không tìm thấy tài liệu nào để tạo ra các vectơ phức tạp hoặc giải ma trận tam giác với các vectơ có giá trị phức tạp như vậy.
Tôi muốn các đối tượng trong chương trình của mình vì tôi cảm thấy đó là cách dễ nhất để tôi khái quát hóa sau này để bao gồm khớp nối giữa các hàm sóng do đó tôi gắn bó với ngôn ngữ hướng đối tượng.
Tôi có thể thử viết bộ giải ma trận ba cực bằng tay, nhưng tôi gặp vấn đề khi tôi làm như vậy với python. Khi tôi tiến hóa qua thời gian lớn với các bước thời gian tốt hơn và tốt hơn, lỗi đã tích lũy và khiến tôi vô nghĩa. Ghi nhớ điều này, tôi quyết định sử dụng các phương pháp xây dựng.
Bất cứ lời khuyên được nhiều đánh giá cao.
EDIT: Đây là đoạn mã có liên quan. Ký hiệu được mượn từ trang Wikipedia về phương trình ma trận ba cực (TDM). v là RHS của thuật toán quây nicolson ở mỗi bước thời gian. Các vectơ a, b và c là các đường chéo của TDM. Thuật toán sửa cho trường hợp định kỳ là từ CFD Wiki . Tôi đã thực hiện một chút đổi tên. Cái mà họ gọi là u, v tôi đã gọi là U, V (viết hoa). Tôi đã gọi q là phần bù, y là giải pháp tạm thời và giải pháp thực tế self.cienState. Việc gán v [0] và v [-1] là nguyên nhân gây ra vấn đề ở đây và do đó đã được nhận xét. Bạn có thể bỏ qua các yếu tố của gamma. Chúng là các yếu tố phi tuyến tính được sử dụng để mô hình hóa 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