گاهی لازم است برنامههای محاسباتی بزرگی بنویسید، در این صورت توصیه میگردد برنامه را بهصورت بخشهای مجزا (در فایلهای مجزا) نوشته و پس از رفع اشکال کامل و ارزیابی صحت اجرا و پاسخهای هر بخش، آنها را در کنار هم قرار دهید.
گاهی پیش میآید که بخشهای مختلف برنامه شما بهصورت مجزا بهخوبی اجرا میگردند، اما زمانی که آنها را در کنار هم قرار میدهید اجرا نمیشوند. علت در نحوه حل دستگاه معادلات توسط روشهای عددی است. بهعنوان یک شرح ساده از علت عدم همگرایی، فرض کنید برنامه شما دارای دو بخش است و هر بخش را در یک فایل مجزا قرار دادهاید. بخش اول دارای 10 معادله و 10 مجهول و بخش دوم دارای 15 معادله و 15 مجهول هستند. در این صورت نرمافزار برای حل بخش اول یک ماتریس 10*10 یعنی یک ماتریس 100 آرایهای را تشکیل داده و با روش سعی و خطای نیوتن رافسون و استفاده از ژاکوبی حل میکند. برای حل بخش دوم، نرمافزار یک ماتریس 15*15 یعنی یک ماتریس 255 آرایهای را حل خواهد نمود. حال اگر شما هر دو بخش را در کنار هم قرار دهید، 25 معادله و 25 مجهول خواهیم داشت و نرمافزار بایستی یک ماتریس 25*25 یعنی یک ماتریس 625 آرایهای را حل نماید. با توجه به پیچیدگیهای حل دستگاه معادلات غیرخطی، حل یک ماتریس 625 آرایهای بسیار مشکلتر و احتمال عدم همگرایی و نرسیدن به جواب بسیار زیاد است. البته نرمافزار بهصورت خودکار اقدام به جداسازی بخشهای مختلف خواهد نمود اما جداسازی دستی با داشتن دانش نسبت به مسئله، خیلی مؤثرتر از جداسازی خودکار است.
برای جداسازی دستی بخشهای مختلف از توانایی فراهمشده در نرمافزار EES به نام زیربرنامه (SUBPROGRAM) استفاده خواهیم نمود.
برای این کار لازم است متغیرهای ورودی و خروجی هر بخش از برنامه را مشخص نمایید. منظور از متغیرهای ورودی، دادههای معلوم هر بخش و متغیرهای خروجی نتایج محاسبات انجامشده است. در برنامه اصلی هر بخش را به شکل SUBPROGRAM تعریف نمایید. برای این کار نامی برای زیربرنامه هر بخش انتخاب کنید و نام متغیرهای ورودی آن بخش را به ترتیب، بعد از یک پرانتز بنویسید، بعد: و بعد متغیرهای خروجی را بنویسید. همه معادلات لازم برای محاسبه آن بخش را در بدنه زیربرنامه قرار داده و زیربرنامه را با دستور END به پایان برسانید. برای همه بخشها همین کار را انجام دهید. حال همه بخشها را در برنامه اصلی با دستور CALL و نام زیربرنامه و متغیرهایش فراخوانی کنید.
در نرمافزار EES هر زیربرنامه حکم یک برنامه جدای EES را دارد که بهصورت جداگانه حل خواهد شد.
فرض کنید محاسبات پروژهای قابل تقسیم به سه بخش s1 تا s3 است که قبلاً هر بخش را بهصورت جداگانه در نرمافزار EES نوشته و تست کردهایم و هر سه ارزیابی شده (ازنظر ابعادی مشکلی ندارند، معادلات بهخوبی نوشتهشده است و از استفاده از معادلاتی که ابهام ریاضی دارند تا حد ممکن استفاده نشده است مثلاً تقسیمبر صفر، جذر اعداد منفی و ….) و بهخوبی جواب میدهند. زمانی که معادلات این سه بخش را بهصورت همزمان اجرا میکنیم، معادلات همگرا نمیگردند و به جواب نخواهیم رسید.
نام بخش | s3 | s2 | s1 |
متغیر ورودی | z1, z2 | y1, y2, y3 | x1, x2 |
متغیر خروجی | y2 | z1 | y1 |
برای نوشتن بخشهای بالا بهصورت زیربرنامه از کد زیر استفاده خواهیم نمود.
SUBPROGRAM s1(x1, x2: y1)
…
END
SUBPROGRAM s2(y1, y2, y3: z1)
…
END
SUBPROGRAM s3(z1, z2: y2)
…
END
x1=1
x2=2
CALL s1(x1, x2: y1)
y3=3
CALL s2(y1, y2, y3: z1)
z2=4
CALL s3(z1, z2: y2)
حل همه بخشها با هم به همگرایی جوابها نمیرسد! 🙁
هر بخش بهصورت مجزا بهخوبی جواب میدهد. 😐
از زیربرنامه استفاده نموده و محاسبات بخشها را به هم متصل مینماییم، امکان همگرایی سادهتر میگردد. 🙂