فیلم آموزشی تابع شرطی if از نرم افزار گمز (GAMS) رو مشاهده میکنید!
در این فیلم آموزشی قصد داریم یکی دیگر از کاربردهای نرم افزار گمز (GAMS)، یعنی نحوه نوشتن توابع شرطی (تابع if) در مدلهای نرمافزار گمز (GAMS) رو با هم مرور کنیم!
فرض کنید در مدلی که نوشتید دادههایی دارید! که که اگر شرط خاصی برقرار باشه اون دادهها مقدار میگیرن! برای مثال پارامتری رو تصور کنید که بر اساس مجموعهای (که در قسمت set تعریف کردهاید!) نوشته شده است! حال پارامتری که تعریف کرده اید فقط برای مقادیر خاصی از آن مجموعه مقدار میگیرد! برای مثال اگر شماره اندیس ضریب ۲ باشد پارامتر مقدار میگیرد! خب همین شرط رو با تابع شرطی if تعریف میکنیم! و در ادامه این دستور به پارامتر مقدار دهی میکنیم!
در این فیلم آموزشی مثالی که میخوایم بررسی کنیم ایجاد یک ماتریس بالا مثلثی هست! شرط ماتریس بالا مثلثی اینه که شماره ستون بزرگتر یا مساوی شماره سطر باشه! خب حالا اگه اندیس سطر رو با i و اندیس ستون رو با j نشون بدیم[!] شرط برای ایجاد ماتریس بالا مثلثی اینه که اندیس j از اندیس i بزرگتر باشه! به نوعی j>=i !!
خب این شرط رو با دستور if تعریف میکنیم! سپس به پارامتری که قراره باهاش ماتریس رو تعریف کنیم مقدار دهی میکنیم!
نکتهای که حائز اهمیت است اینه که همانند حلقهها (در آموزشهای قبلی به آنها پرداختیم! برای مشاهده اون مطلب به اینجا مراجعه کنید) از تابع شرطی if برای تعریف روابط نمیشه استفاده کرد! منظور از روابط توابع هدف و محدودیتها میباشد!
خب با یک مثال، سعی میکنیم مبحثِ تابع شرطی if رو براتون توضیح بدیم!
فرض کنید قراره یک ماتریس بالا مثلثی درست کنیم (ماتریس بالا مثلثی، ماتریسی است که درایههای زیر قطرش صفراند، اما روی قطر و بالای قطر میتونه غیر صفر باشه!)
و در ضمن میخوایم درایههایی که قراره عدد توش قرار بگیره رو برابر قرار بده با جمعِ شماره ردیف و ستون! یعنی چی؟ یعنی اولاً همونطور که گفتیم، قراره یه عده رو طبق تعریف بالا مثلثی صفر بذاریم (درایههای زیر قطر اصلی!)، حالا از بین اونایی که میتونن غیرصفر باشن، تصمیم داریم تا مقدارشون رو برابر قرار بدیم با جمع عدد ستون و ردیف! یعنی برای درایه موجود در سطر اول، و ستون دوم، مقدارش رو برابر قرار بدیم با:
1 + 2 = 3
خب تا اینجا مسئله رو تعریف کردیم، بریم سراغ خود کارهایی که باید برای نوشتن کد این مسئله انجام بدیم!
set i /1*5/ j /1*5/; parameter d(i,j); loop((i,j), if (ord(i)<=ord(j)), d(i,j)=ord(i)+ord(j); ); ); display d;
در خط اول و دوم، دو اندیس i و j رو تعریف کردیم که از 1 تا 5 مقدار میگیرن!
در خط سوم، اومدیم و پارامتری به اسم d(i,j) تعریف کردیم!
در خط چهارم، میگیم: یه حلقه بزن روی (i,j) و داخل حلقه یه سری کارها میکنیم که در ادامه توضیح میدم! (ما قبلاً برای loop یک آموزش قرار دادیم که میتونید برای مشاهده اون مطلب به اینجا مراجعه کنید)
توجه: برای loop در خط 4 یه دونه پرانتز باز کردیم، متناظر با همین پرانتز، یه پرانتز در خط 8 میبندیم!
خب حالا داخل حلقه یا loop اومدیم یه شرط تعریف کردیم! گفتیم اگر شماره ردیف کوچکتر مساوی شماره ستون بود (توجه کنید که این شرط در ماتریس، عملاً داره به روی قطر اصلی و بالای قطر اصلی اشاره میکنه! یعنی این خاصیت قطر اصلی است که شماره ردیف و شماره ستون باهم برابرن! و همچنین این خاصیت بالای قطر اصلی است که شماره ردیف از شماره ستون کوچکتره!)، داشتیم میگفتیم…! پس داریم میگیم: اگر شماره ردیف کوچکتر مساوی شماره ستون بود، بیا و درایه (i,j) از d(i,j) رو برابر قرار بده با مجموع شماره ردیف و شماره ستون!
توجه: در خط 5، یک پرانتز برای if باز کردیم، و متناظر با آن، در خط 7 یک پرانتز بستیم!
در خط 9 هم میگیم، اون d که تعریف کردیم (همون d(i,j)) رو نشون بده! (display=نمایش دادن)
دانلود فیلم آموزشی با لینک مستقیم
توجه: برای دانلود فیلم آموزشی فوق، بر روی لینک دانلود راست کلیک کرده و سپس Save Link As … را انتخاب نمایید!
با ما کولاک کنید …
تعداد دیدگاه | 0 |
تاریخ انتشار | 19/08/2018 |
تاریخ بروزرسانی | 19/08/2018 |