मेरे पास निम्नलिखित के बारे में कुछ प्रश्न हैं:
मैं क्रैंक निकोलसन विवेक का उपयोग करके 1 डी में श्रोडिंगर समीकरण को हल करने की कोशिश कर रहा हूं, जिसके परिणामस्वरूप ट्रिडियोनियल मैट्रिक्स उत्पन्न होता है। मेरी समस्या अब आवधिक सीमा स्थितियों के साथ एक समस्या के रूप में विकसित हुई है और इसलिए मैंने शर्मन मॉरिसन एल्गोरिथ्म का उपयोग करने के लिए अपने कोड को संशोधित किया है।
मान लीजिए कि v
जब मैं त्रिदोषन मैट्रिक्स को पलटना चाहता हूं, तो प्रत्येक समय कदम पर मेरा आरएचएस है। v
अंतरिक्ष में मेरे द्वारा ग्रिड बिंदुओं की संख्या का आकार है। जब मैं सेट करता हूं v[0]
और v[-1]
एक-दूसरे के संदर्भ में जैसा कि मेरी आवधिक स्थिति में आवश्यक है, मेरा समीकरण चल निकला। मैं नहीं बता सकता कि ऐसा क्यों हो रहा है। मैं समीकरण को हल करने के लिए python2.7 और scipy की इनबिल्ट solution_banded का उपयोग कर रहा हूं।
यह मुझे मेरे दूसरे प्रश्न की ओर ले जाता है: मैंने अजगर का इस्तेमाल किया क्योंकि यह वह भाषा है जिसे मैं सबसे अच्छी तरह से जानता हूं, लेकिन मैं इसे धीमी गति से देखता हूं (यहां तक कि स्तब्ध और डरपोक द्वारा प्रस्तुत अनुकूलन के साथ)। मैंने C ++ का उपयोग करने की कोशिश की है क्योंकि मैं यथोचित परिचित हूं। मैंने सोचा था कि मैं जीएसएल का उपयोग करूंगा जो कि बीएलएएस अनुकूलित होगा, लेकिन जटिल वैक्टर बनाने के लिए कोई दस्तावेज नहीं मिला या ऐसे जटिल मूल्यवान वैक्टर के साथ ट्राइडियोगल मैट्रिक्स का समाधान किया गया।
मैं अपने कार्यक्रम में वस्तुओं को पसंद करूंगा क्योंकि मुझे लगता है कि मेरे लिए सबसे आसान तरीका होगा कि मैं बाद में वेवफंक्शन के बीच युग्मन को शामिल कर सकूं।
मैं हाथ से त्रिदोषन मैट्रिक्स सॉल्वर लिखने की कोशिश कर सकता था, लेकिन जब मैंने अजगर में ऐसा किया तो मैं समस्याओं में भाग गया। जैसे-जैसे मैं बारीक और बारीक समय के कदमों के साथ बड़ा होता गया, त्रुटि जमा होती गई और मुझे बकवास लगता गया। इसे ध्यान में रखते हुए, मैंने इन-बिल्ट विधियों का उपयोग करने का निर्णय लिया।
किसी भी सलाह की बहुत प्रशंसा की जाएगी।
संपादित करें: यहाँ प्रासंगिक कोड स्निपेट है। त्रिकोणीय मैट्रिक्स (TDM) समीकरण पर विकिपीडिया के पृष्ठ से नोटेशन उधार लिया गया है। v हर समय कदम पर क्रैंक निकोलसन एल्गोरिदम का आरएचएस है। वैक्टर ए, बी और सी टीडीएम के विकर्ण हैं। आवधिक मामले के लिए सही एल्गोरिथ्म CFD विकी से है । मैंने थोड़ा नाम बदला है। उन्होंने यू, वी, जिसे मैंने यू, वी (कैपिटलाइज्ड) कहा है। मैं q पूरक कहा जाता है, y अस्थायी समाधान और वास्तविक समाधान self.currentState। V [0] और v [-1] का असाइनमेंट यहां समस्या पैदा कर रहा है और इस तरह से टिप्पणी की गई है। आप गामा के कारकों को अनदेखा कर सकते हैं। वे बोस आइंस्टीन कंडेनसेट को मॉडल करने के लिए उपयोग किए जाने वाले गैर-रैखिक कारक हैं।
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