आवधिक सीमा शर्तों के साथ श्रोडिंगर समीकरण


9

मेरे पास निम्नलिखित के बारे में कुछ प्रश्न हैं:

मैं क्रैंक निकोलसन विवेक का उपयोग करके 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

3
यह आपकी आवधिक सीमा स्थितियों में एक बग की तरह लगता है (पहली नज़र में)। एक कोड स्निपेट पोस्ट करने के लिए देखभाल?
डेविड केचेसन

2
स्टैक एक्सचेंज में आपका स्वागत है! भविष्य में, यदि आपके पास कई प्रश्न हैं, तो आप उन्हें अलग से पूछना चाह सकते हैं।
दान

इसके अलावा: वास्तव में आपका क्या मतलब है "सेट वी [0] और वी [-1] एक दूसरे के संदर्भ में"? क्या आप सॉल्यूशन के बाद वेक्टर तत्वों को एक-दूसरे के बराबर सेट कर रहे हैं, या क्या आप उन्हें युगल करने के लिए एक ऑफ-ट्राइडीऑंगल तत्व का उपयोग कर रहे हैं?
डैन

मैंने ऊपर अपना कोड जोड़ दिया है। अगर कुछ स्पष्ट नहीं है तो कृपया मुझे बताएं। मुझे अगली बार अलग प्रश्न पोस्ट करना याद होगा।
WiFO215

धन्यवाद! स्वरूपण (बहुत लंबी पंक्तियों) के कारण अपने कोड को पढ़ना थोड़ा कठिन है। इसके अलावा, उस हिस्से पर टिप्पणी करना जिसे आप चाहते हैं कि लोग ध्यान दें कि वह भ्रमित है। कॉड आप नीचे दिए गए समीकरणों को लिखते हैं जो आप (MathJax के साथ) अपने कोड के समान अंकन का उपयोग कर हल कर रहे हैं?
डेविड केचेसन

जवाबों:


2

दूसरा सवाल

कोड जिसे स्कैपी / नेम्पी कहा जाता है, आमतौर पर केवल तेज होता है अगर इसे वेक्टर किया जा सकता है; आपको अजगर लूप के अंदर "धीमा" कुछ भी नहीं होना चाहिए। फिर भी, यह बहुत अधिक अपरिहार्य है कि संकलित भाषा में समान पुस्तकालय का उपयोग करने की तुलना में यह कम से कम थोड़ा धीमा होगा।

for i in np.arange(0,self.spaceArraySize-1):
            v[i] = Y*self.currentState[i+1] + (1-2*Y)*self.currentState[i]   ...
            b[i] = 1+2*Y + 1j*0.5*self.timeStep*potential[i] + ...

यह मेरा मतलब है "अजगर लूप में धीमा"। forअधिकांश संख्यात्मक अनुप्रयोगों के लिए पायथन अस्वीकार्य रूप से धीमा है, और स्किपी / नेम्पी इसको बिल्कुल भी प्रभावित नहीं करता है। यदि आप अजगर का उपयोग करने जा रहे हैं, तो इस आंतरिक लूप को एक या दो Numpy / Scipy फ़ंक्शन के रूप में व्यक्त किया जाना चाहिए, जो उन पुस्तकालयों को प्रदान कर सकते हैं या नहीं दे सकते हैं। यदि वे ऐसा कुछ प्रदान नहीं करते हैं जो आपको इस तरह के सरणियों पर पुनरावृत्ति करने की अनुमति देता है और आसन्न तत्वों तक पहुंचता है, तो आप जो करना चाहते हैं उसके लिए अजगर गलत उपकरण है।

इसके अलावा, आप मैट्रिक्स-वेक्टर समाधान के बजाय उलटा कर रहे हैं। मैट्रिक्स-वेक्टर के बाद एक मैट्रिक्स उलटा, मैट्रिक्स-वेक्टर समाधान की तुलना में बहुत धीमा है। यह लगभग निश्चित रूप से आपके कोड को कुछ और की तुलना में धीमा कर रहा है।

यदि आप C / C ++ का उपयोग करना चाहते हैं, तो जटिल लीनियर बीजगणित की बात आती है तो जीएसएल की कमी है। मैं या तो सीधे BLAS या LAPACK का उपयोग करने की सलाह दूंगा, या PETSc या ट्रिलिनोस जैसी लाइब्रेरी का उपयोग करूंगा। यदि आपके पास एमकेएल स्थापित है, तो आप उसका भी उपयोग कर सकते हैं। आप फोरट्रान 2008 की भी जाँच कर सकते हैं, जो वस्तु-उन्मुख है।

आपके मैटर्स विरल हैं, इसलिए आप यह सुनिश्चित करना चाहेंगे कि आप स्पार्स लाइब्रेरीज़ का उपयोग करें।

मैं यह भी कहूंगा कि आप यहां जो कर रहे हैं, वह निम्न-स्तर पर पर्याप्त लगता है कि ऑब्जेक्ट-ओरिएंटेशन शायद आपकी प्राथमिक चिंता नहीं होनी चाहिए। एक फोरट्रान 90+ सरणी संभवतः आपके लिए आवश्यक एक अच्छा मैच है, और F90 संकलक कुछ छोरों को ऑटो-समानांतर कर सकते हैं।

इसके अलावा, आप ऑक्टेव या मैटलैब की जांच कर सकते हैं, जिसमें sparse()फ़ंक्शन हैं। यदि ठीक से उपयोग किया जाता है, तो ये बहुत जल्दी चलने में सक्षम होना चाहिए।


मैं निश्चित रूप से फोरट्रान 2008 में देखूंगा। मुझे पहले ही 'लगभग त्रिदोषन' मैट्रिक्स मिल चुका है। मैंने ऊपर उल्लेख किया है कि मैं शर्मन मॉरिसन एल्गोरिथ्म का उपयोग कर रहा था।
WiFO215

अद्यतन: मैं स्कैल्प पर पढ़ने की कोशिश कर रहा हूं क्योंकि यह बहुत दिलचस्प लगता है। यह एक बज़ शब्द का उपयोग करके मैट्र्स को पलटने की अनुमति देता है जो मैं "समानांतर में" बहुत सुन रहा हूं। मुझे पता है कि यह मेरे सभी प्रोसेसर का उपयोग करता है और इसलिए यह तेजी से आगे बढ़ता है, लेकिन इससे परे, मुझे समझ नहीं आता कि यह किस बारे में है। भौतिक विज्ञान की पृष्ठभूमि से आने वाला, मेरे पास कंप्यूटिंग के लिए एकमात्र एक्सपोज़र अजगर और सी। में 101 पाठ्यक्रमों के साथ है। यह सीखने में कि इसका उपयोग करने में कितना समय लगने वाला है। प्रलेखन स्वयं को पढ़ने को साफ करने के लिए उधार नहीं देता है।
WiFO215

अद्यतन 2: यार! यह ScaLAPACK चीज़ वास्तव में जटिल लगती है। मुझे समझ में नहीं आ रहा है कि वेबसाइट पर क्या है। मैं बस सारी जानकारी में तैर रहा हूं।
WiFO215

अद्यतन 3: ठीक है, मैं अन्य सिफारिशों के माध्यम से चला गया हूँ PETSc और Trilinos। मेरा अंतिम आह्वान है कि मुझे नहीं लगता कि मैं अब इनका उपयोग करूंगा क्योंकि वे बहुत जटिल लगते हैं। इसका मतलब यह नहीं है कि मैं उन्हें नहीं पढ़ूंगा। मैं अब उन्हें पढ़ना शुरू कर दूंगा, लेकिन जब तक मैं समझूंगा और उन्हें लागू करने में सक्षम हूं, तब तक महीनों बीत जाएंगे। मैं उपरोक्त प्रश्नों पर अपने प्रश्नों के लिए एक अलग सूत्र खोलूंगा क्योंकि मुझे इससे कठिनाई हो रही है। लेकिन यह बाद के लिए है। अब, मैं केवल 1 प्रश्न से निपटने के लिए वापस आ गया हूं
WiFO215

मैंने अपना उत्तर अपडेट कर दिया है।
दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.