পর্যায় সীমা শর্তের সাথে শ্রডিংগার সমীকরণ


9

নিম্নলিখিতগুলি সম্পর্কে আমার কয়েকটি প্রশ্ন আছে:

আমি ক্র্যাঙ্ক নিকোলসন বিচক্ষণতা এবং ফলস্বরূপ ত্রিভুজাকৃতির ম্যাট্রিক্সকে উল্টিয়ে দিয়ে 1 ডি তে শ্রডিংগার সমীকরণটি সমাধান করার চেষ্টা করছি। আমার সমস্যা এখন পর্যায়ক্রমিক সীমানা শর্ত নিয়ে একটি সমস্যায় রূপান্তরিত হয়েছে এবং তাই আমি শেরম্যান মরিসন অ্যালগরিদমটি ব্যবহার করার জন্য আমার কোডটি পরিবর্তন করেছি।

ধরুন vআমি যখন ত্রিদুটিভুজ ম্যাট্রিক্সটি উল্টাতে চাই তখন প্রতিটি ধাপে আমার আরএইচএস হয়। আকারটি vহ'ল গ্রিড পয়েন্টগুলির সংখ্যার চেয়ে আমি বেশি স্থান পেয়েছি। যখন আমি সেট v[0]এবং v[-1]একে অপরের হিসাবে আমার পর্যাবৃত্ত অবস্থায় প্রয়োজন বোধ করা হয় পরিপ্রেক্ষিতে, আমার সমীকরণ আপ মারতে লাগল। কেন ঘটছে তা আমি বলতে পারছি না। সমীকরণটি সমাধান করতে আমি পাইথন 2.7 ব্যবহার করছি এবং স্কিপির ইনবিল্ট সলভ_ব্যাংড।

এটি আমার দ্বিতীয় প্রশ্নের দিকে নিয়ে যায়: আমি পাইথনটি ব্যবহার করলাম কারণ এটি আমার সবচেয়ে ভাল ভাষা জানা ভাষা, তবে আমি এটিকে বরং ধীর বলে মনে করি (এমনকি অদ্ভুত এবং ছদ্মবেশী দ্বারা উত্সাহিত অপ্টিমাইজেশন সহ)। আমি সি ++ ব্যবহার করার চেষ্টা করেছি কারণ আমি এর সাথে যুক্তিযুক্তভাবে পরিচিত। আমি ভেবেছিলাম যে আমি জিএসএল ব্যবহার করব যা বিএলএএস অনুকূলিত হবে, তবে জটিল ভেক্টর তৈরি করতে বা ত্রিভুজাকৃতির ম্যাট্রিক্সকে জটিল জটিল মূল্যবান ভেক্টরগুলির সাথে সমাধান করার জন্য কোনও নথিপত্র পাইনি।

আমি আমার প্রোগ্রামে অবজেক্টগুলিকে পছন্দ করব কারণ আমার কাছে মনে হয় পরে তরঙ্গ ফানকের মধ্যে সংযোগ স্থাপনের পক্ষে আমার পক্ষে সাধারণীকরণের সবচেয়ে সহজতম উপায় এটি এইভাবে আমি কোনও অবজেক্ট ওরিয়েন্টেড ভাষায় আঁকছি।

আমি হাতে হাতে ত্রিভুজাকৃতির ম্যাট্রিক্স সলভার লেখার চেষ্টা করতে পারি, তবে অজগরটি করার সময় আমি সমস্যার মধ্যে পড়েছিলাম। আমি সূক্ষ্ম ও সূক্ষ্ম সময়ের সাথে ধীরে ধীরে বিবর্তিত হওয়ার সাথে সাথে ত্রুটিটি জমে এবং আমাকে বাজে কথা বলেছিল। এটি মাথায় রেখে, আমি অন্তর্নির্মিত পদ্ধতিগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছি।

কোন পরামর্শ অনেক প্রশংসা করা হয়।

সম্পাদনা: এখানে প্রাসঙ্গিক কোড স্নিপেট। ত্রিদিগোনাল ম্যাট্রিক্স (টিডিএম) সমীকরণের উইকিপিডিয়া পৃষ্ঠা থেকে স্বাক্ষর নেওয়া হয়েছে b v প্রতিটি সময় পদক্ষেপে ক্র্যাঙ্ক নিকোলসন অ্যালগরিদমের আরএইচএস। ভেক্টর a, b এবং c টিডিএম এর কর্ণস। পর্যায়ক্রমিক কেসের জন্য সংশোধিত অ্যালগরিদম সিএফডি উইকি থেকে প্রাপ্ত । আমি একটু নামকরণ করেছি। তারা যা আপনাকে ডেকেছে, v আমি ইউ, ভি (মূলধন) বলেছি। আমি q কে পরিপূরক বলেছি, y অস্থায়ী সমাধান এবং প্রকৃত সমাধানটি সেলফ্রন্ট স্টোর। ভি [0] এবং ভি [-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
স্ট্যাক এক্সচেঞ্জে স্বাগতম! ভবিষ্যতে আপনার যদি বেশ কয়েকটি প্রশ্ন থাকে তবে আপনি তাদের আলাদাভাবে জিজ্ঞাসা করতে পারেন।
ড্যান

এছাড়াও: একে অপরের পরিপ্রেক্ষিতে "সেট v [0] এবং v [-1] এর সঠিক অর্থ কী? সমাধানের পরে কি আপনি ভেক্টর উপাদানগুলিকে একে অপরের সমান স্থির করছেন, না আপনি তাদেরকে জোড়া দেওয়ার জন্য অফ-ট্রিডিয়োনাল উপাদানটি ব্যবহার করছেন?
ড্যান

আমি উপরে আমার কোড যুক্ত করেছি। যদি কিছু অস্পষ্ট থাকে তবে দয়া করে আমাকে জানান। আমি পরের বার পৃথক প্রশ্ন পোস্ট মনে রাখতে হবে।
WiFO215

ধন্যবাদ! ফর্ম্যাটিংয়ের কারণে আপনার কোডটি পড়া কিছুটা কঠিন (খুব দীর্ঘ লাইন)। এছাড়াও, আপনি যে অংশটির দিকে মানুষ মনোযোগ দিতে চান সেই অংশটি মন্তব্য করা বিভ্রান্তিকর। কোড আপনি কি সমীকরণগুলি সমাধান করছেন যা আপনার কোডের মতো একই স্বরলিপি ব্যবহার করে (ম্যাথজ্যাক্স সহ) লিখেছেন?
ডেভিড কেচসন

উত্তর:


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বেশিরভাগ সংখ্যাসূচক অ্যাপ্লিকেশনগুলির জন্য অগ্রহণযোগ্যভাবে ধীর এবং স্কিপি / নম্পি এটিকে মোটেই প্রভাবিত করে না। আপনি যদি অজগর ব্যবহার করতে চলেছেন তবে এই অভ্যন্তরীণ লুপটি এক বা দুটি নম্পি / স্কিপি ফাংশন হিসাবে প্রকাশ করা উচিত, যা those গ্রন্থাগারগুলি সরবরাহ করতে পারে বা না পারে। যদি তারা এমন কিছু সরবরাহ না করে যা আপনাকে এই জাতীয় অ্যারেতে পুনরাবৃত্তি করতে এবং সংলগ্ন উপাদানগুলিতে অ্যাক্সেসের অনুমতি দেয় তবে আপনি যা করতে চান তার জন্য পাইথন একটি ভুল সরঞ্জাম।

এছাড়াও, আপনি ম্যাট্রিক্স-ভেক্টর সমাধানের পরিবর্তে একটি বিপরীতমুখী করছেন। একটি ম্যাট্রিক্স বিপরীততা, তার পরে ম্যাট্রিক্স-ভেক্টর গুণ, ম্যাট্রিক্স-ভেক্টর সমাধানের চেয়ে অনেক ধীর। এটি প্রায় নিশ্চিতভাবেই অন্য কোনও কিছুর চেয়ে আপনার কোডকে ধীর করে দিচ্ছে।

আপনি যদি সি / সি ++ ব্যবহার করতে চান, জটিল রৈখিক বীজগণিতের ক্ষেত্রে জিএসএল এক ধরনের ঘাটতি। আমি হয় সরাসরি BLAS বা LAPACK ব্যবহার করার পরামর্শ দিই বা PETSc বা Trilinos এর মতো লাইব্রেরি ব্যবহার করার পরামর্শ দেব। আপনার যদি এমকেএল ইনস্টল থাকে তবে আপনি এটিও ব্যবহার করতে পারেন। আপনি ফোর্টরান ২০০৮ যাচাই করে দেখতেও পারেন, যা বস্তু-ভিত্তিক।

আপনার ম্যাট্রিকগুলি বিরল, সুতরাং আপনি স্পার লাইব্রেরি ব্যবহার করছেন তা নিশ্চিত করতে চাইবেন।

আমি আরও বলব যে আপনি এখানে যা করছেন তা নিম্ন স্তরের পর্যায়ে যথেষ্ট বলে মনে হচ্ছে যে অবজেক্ট-অভিমুখীকরণ সম্ভবত আপনার প্রাথমিক উদ্বেগ নয়। একটি ফোর্টরান 90+ অ্যারে সম্ভবত আপনার যা প্রয়োজন তার থেকে বেশ সুন্দর মিল এবং F90 সংকলক কিছু লুপকে স্বয়ংক্রিয়ভাবে সমান্তরাল করতে পারে।

এছাড়াও, আপনি অক্টাভে বা মতলব যা দেখতে পারেন তা দেখতে পারেন sparse()। যদি সঠিকভাবে ব্যবহার করা হয় তবে এগুলি বেশ দ্রুত চালাতে সক্ষম হওয়া উচিত।


আমি অবশ্যই ফোর্টরান ২০০৮ এ সন্ধান করব। আমি ইতিমধ্যে 'প্রায় ত্রিভুজাকৃতির' ম্যাট্রিক্স পেয়েছি। আমি উপরে উল্লেখ করেছি যে আমি শেরম্যান মরিসন অ্যালগরিদম ব্যবহার করছিলাম।
WiFO215

আপডেট: আমি স্কেল্যাপে পড়ার চেষ্টা করছি কারণ এটি দেখতে খুব আকর্ষণীয়। এটি এমন একটি বাজে শব্দ ব্যবহার করে ম্যাট্রিকগুলি উল্টাতে দেয় যা আমি "সমান্তরালভাবে" প্রচুর শুনছি। আমি কেবল জানি এটি আমার সমস্ত প্রসেসর ব্যবহার করে এবং তাই এটি দ্রুত চলে যায়, তবে এর বাইরে, আমি এটি সম্পর্কে কি বুঝতে পারি না। পদার্থবিজ্ঞানের পটভূমি থেকে আগত, পাইথন এবং সি এর 101 টি কোর্সের সাথে আমার কাছে কম্পিউটারে একমাত্র এক্সপোজার ছিল এটি কীভাবে ব্যবহার করতে হয় তা শিখতে সময় লাগবে। ডকুমেন্টেশন নিজেই পরিষ্কার পড়া নিজেকে ধার দেয় না।
WiFO215

আপডেট 2: মানুষ! এই স্কেল্যাপ্যাক জিনিসটি সত্যিই জটিল দেখাচ্ছে। ওয়েবসাইটটিতে কী আছে তার মাথা বা লেজ আমি বুঝতে পারি না। আমি কেবল সমস্ত তথ্য সাঁতার করছি।
WiFO215

আপডেট 3: ঠিক আছে, আমি অন্যান্য সুপারিশ পিইটিএসসি এবং ট্রিলিনো পেরিয়েছি। আমার চূড়ান্ত কলটি হ'ল আমি মনে করি না যে এগুলি এখন খুব জটিল দেখায় আমি এগুলি ব্যবহার করব। তার মানে এই নয় যে আমি সেগুলি পড়ব না। আমি এখনই সেগুলি পড়তে শুরু করব, তবে আমি যখন বুঝতে পেরেছি এবং সেগুলি বাস্তবায়নে সক্ষম হয়েছি তখন কয়েক মাস কেটে যাবে। আমার উপরের প্রশ্নগুলির জন্য আমি একটি পৃথক থ্রেড খুলব কারণ এতে আমার অসুবিধা হচ্ছে। তবে এটি পরবর্তী সময়ের জন্য। এখন, আমি কেবল 1 প্রশ্ন মোকাবিলায় ফিরে এসেছি
WiFO215

আমি আমার উত্তর আপডেট করেছি।
ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.