آشنایی با توابع در متلب(جلسه پنجاه و یک)

آشنایی با توابع در متلب
آشنایی با توابع در متلب

در این جلسه می‌خواهیم راجع به تابع‌ها صحبت کنیم و ببینیم تابع اصلا چیست و چگونه در متلب تعریف می‌شود. یک گذر کوتاهی داریم تا جلسات آینده آن را تکمیل کنیم.

آشنایی با توابع در متلب

تابع چگونه تعریف می‌شود؟ در دو جلسه گذشته نیز مثال‌های کوچکی از توابع زدیم و برخی توابع را تعریف کردیم.

تابع به این صورت تعریف می‌شود:

Function [output_args] = untitled (input_args)

اگر بخواهیم تابع را تعریف کنیم، یک Function می‌نویسیم. باید توجه کنیم که output_args را باید داخل براکت قرار دهیم که args مخفف arguments است. output arguments هم می‌شود متغیر خروجی.

توجه کنید که متلب یک زبان برنامه‌نویسی است که می‌تواند چند تا خروجی داشته باشد. S در output_args یعنی چند تا خروجی می‌توانیم برای متلب تعریف کنیم و اینکه می‌توانیم خروجی‌ها را همزمان با هم داشته باشیم.

نمی‌گوییم که در زبان برنامه‌نویسی دیگری نمی‌توان چنین چیزی را مشاهده کنیم ولی در برنامه متلب این موضوع بسیار ساده‌تر است.

و untitled نام تابع است که در واقع در اینجا نامی ندارد و بی نام است در این قسمت تعریف می‌شود.

توجه داشته باشید که نام توابع می‌تواند شامل حروف، اعداد، خط زیر باشد ولی نمی‌تواند با عدد شروع شود. برای مثال در جلسات قبل ما تابعی به نام Getdivisor تعریف کردیم که بهتر است بنویسیم GetD… یعنی یک  D بزرگ قرار دهیم که یعنی از Get جدا می‌شود نه اینکه یک خط تیره قرار دهیم. من ترجیح می‌دهم GetDivisor بنویسیم و به نظر من به این صورت بسیار زیباتر و بهتر است.

بعد از آن input_args را داریم. output_args درون براکت بود و input_args را در پرانتز قرار می‌دهیم که متغیر ورودی هستند.

پس به طور کلی یک Function به این صورت تعریف می‌شود.

اکنون می‌خواهیم در برنامه متلب یک Function یا یک تابع را تعریف کنیم.

می‌خواهیم تابعی را تعریف کنیم که فرمول‌های  و  را به ما می‌دهد.

این فرمول‌ها را توضیح می‌دهیم.

یک مثلث مطابق تصویر فوق داریم که ضلع مقابل زاویه‌ی ۹۰ درجه وتر ما است. وتر برابر است با c و   که اگر یک رادیکال از این فرمول بگیرید، می‌شود

این دو فرمولی است که ما می‌خواهیم آن را به صورت یک تابع درآوریم که روابط فیثاغورث را به ما نشان می‌دهد و در اینجا دو تا input و یک output داریم؛ یعنی دو تا ورودی و یک خروجی داریم. دو تا ورودی ما a و b هستند و c خروجی است.

در فرمول دوم هم به همین صورت است. و توجه داشته باشید که رادیکال گرفتن از  توان ۲ را از بین برده است.

حال می‌خواهیم آن را در برنامه متلب هم اجرا کنیم.

نوشتن یک تابع جدید
نوشتن یک تابع جدید در متلب
ویرایش نام تابع
ویرایش نام تابع
نوشتن نام pythagorean
نوشتن نام pythagorean

 

ابتدا یک Newscript می‌سازیم ‌و نام آن را pythagorean می‌گذاریم. pythagorean یعنی فیثاغورث.

تغییر بنام pythagorean یعنی فیثاغورث
تغییر بنام pythagorean یعنی فیثاغورث

حال function را به صورت زیر تعریف می‌کنیم.

یک function داریم. خروجی را در براکت قرار می‌دهیم که c بود و مساوی با اسم آن تابعی که ما داریم یعنی pythagorean است. تابع ما تابع فیثاغورثی است که ما نام آن را pythagorean قرار دادیم. بعد از آن ورودی‌های ما هستند که ورودی‌های ما a و b بودند. توجه داشته باشید که این اسمی که ما برای function انتخاب می‌کنیم، نباید از قبل در برنامه متلب تعریف شده باشد و ؟؟؟ [۰۵:۳۳] باشد. برای اینکه این موضوع را بررسی کنیم، می‌توانید در command window نام تابع را بزنید که ببینید از قبل تعریف شده است یا خیر.

در command window می‌زنیم exist pythagorean که جواب صفر یا یک را می‌دهد که یعنی تعریف نشده است یا شده است.

 

نوشتن برنامه در تابع pythagorean
نوشتن برنامه در تابع pythagorean

و در command window می‌زنیم exist pythagorean و به شما می‌گوید که این نام از قبل در متلب بوده است یا خیر.

فرمولی که داشتیم این بود که گفتیم:c=√(a^2+b^2 )

این فرمول را به این صورت می‌نویسیم: c = sqrt(a^2 + b^2)

و در آخر end را می‌زنیم.

حال می‌خواهیم بدانیم آیا functionای که در اینجا تعریف کردیم، کار می‌کند یا خیر.

در command window نام تابع یعنی pythagorean را وارد می‌کنیم و برای مثال برای ورودی‌های ۳ و ۴ می‌خواهیم خروجی آن را محاسبه کنیم.

به نظر شما خروجی آن چند می‌شود؟ در واقع c را می‌خواهیم.

مشاهده پاسخ فرمول در workspace
مشاهده پاسخ فرمول در workspace

جواب را به سادگی به ما داد.

حال در workspace وقتی مشاهده می‌کنید، نوشته است ans=5

 نوشته است ans=5
نوشته است ans=5

در اینجا ۵ ذخیره شده است اما نه به صورت یک variable یا متغیر. یعنی در اینجا فقط ۵ ذخیره شده است ولی یک متغیر نیست.

ما در اینجا باید به متلب بفهمانیم که می‌خواهیم این یک variable یا متغیر باشد. پس باید چه کاری انجام دهیم؟ باید بگوییم که برای مثال این‌ها را در c یا هر چیزی که بخواهید، بریزد. یعنی pythagorean را برای ۳ و ۴ به صورت زیر در c بریزد.

pythagorean را برای ۳ و ۴ نمایش می دهد
pythagorean را برای ۳ و ۴ نمایش می دهد

در این صورت ما در اینجا یک متغیر را برای تابع pythagorean تعریف کردیم.

یک مثال دیگر بیان می‌کنیم.

 در تصویر فوق یک استوانه داریم که می‌بینیم شعاع آن را با r نشان دادیم و ارتفاعی که این استوانه دارد را با h نشان دادیم. در نتیجه مساحت و حجم استوانه به صورت  و  به دست می‌آید که از دبیرستان باید به خاطر داشته باشید.

توجه کنید که در اینجا چند خروجی و چند ورودی داریم. دو تا ورودی یا دو تا input و دو تا خروجی داریم.

ورودی‌های ما r و h هستند و   یک متغیر ثابت است و خروجی‌های ما A و V هستند. یعنی مساحت و حجم ما خروجی‌های این تابع هستند.

حال می‌خواهیم این را در متلب تعریف کنیم.

توجه کنید که استوانه به انگلیسی می‌شود cylinder و مساحت area و حجم volume

یک function جدید تعریف می‌کنیم.

باز کردن یک تابع جدید
باز کردن یک تابع جدید

به این جا هم دقت کنید که می‌توانید اصلا کار را ساده‌تر کنید. می‌توانید function را در New بزنید و آن را تعریف کنید.

تغییر نام تابع
تغییر نام تابع

نام آن را هم area-volume یعنی مساحت و حجم می‌گذاریم.

تغییر نام به area-volume
تغییر نام به area-volume

روی آن کلیک می‌کنیم.

کلیک بر روی تابع
کلیک بر روی تابع

در اینجا خودش آمده است برای شما نوشته است و گفته است یک function داریم که بر فرض دو تا output برای آن قرار داده است و دو تا ورودی گذاشته است. مشاهده می‌کنید که علامت % قرار داده است و در مورد area و در مورد این function توضیح داده است. پس توضیحات کلی است که خودتان باید بعدا به یاد داشته باشید. زیرا ممکن است برنامه شما خیلی طولانی باشد و یک توضیحی پایین آن بنویسید بد نیست.

بعد از آن اعمالی است که می‌خواهید روی function داشته باشید و در آخر end را داریم.

 

نوشتن برنامه تابع
نوشتن برنامه تابع

برنامه را مجدد تایپ می نمائیم.

نوشتن اولین تابع ها
نوشتن اولین تابع ها

زیرا اولین functionهایی است که داریم می‌سازیم.

بازکردن تابع جدید
بازکردن تابع جدید
تغییر نام تابع
تغییر نام تابع

نام آن را هم area-volume قرار می‌دهیم.

بازکردن تابع جهت نوشتن برنامه
بازکردن تابع جهت نوشتن برنامه
بازکردن تابع جهت نوشتن برنامه
بازکردن تابع جهت نوشتن برنامه

یک function داریم که خروجی‌های آن area (A) و volume (V) بودند که مساحت و حجم هستند. و برابر می‌شود با اسم تابعی که داریم و ورودی‌ها هم شعاع ‌(r) و ارتفاع (h) هستند.

حال فرمول‌هایی که در این مثال بیان کردیم را وارد می‌کنیم.

فرمول مساحت به صورت زیر است:

A = 2 * pi * r * h + 2 * pi * r^2;

فرمول حجم هم به صورت زیر است:

V = pi * r^2 * h;

و در آخر end را داریم.

اکنون با این فرمول به سادگی می‌توانیم محاسبات را انجام دهیم.

در اینجا به نظر شما چگونه باید مساحت و حجم را به دست آوریم؟ ابتدا باید بگوییم که ما A و V را می‌خواهیم.

و بعد تابع area-volume را برای ورودی‌های ۲ و ۲۰ فراخوانی می‌کنیم.

حجم عدد زیر خواهد بود

مساحت هم عدد زیر خواهد بود.

مشاهده کردید که با تعریف یک function جواب‌ها به سادگی به دست می‌آید.

مشاهده می‌کنید که در workspace هم برای ما به عنوان A و V ذخیره شده است. زیرا در همان اول در A و V ریخته بودیم.

حال فکر می‌کنم تا اینجا دیگر متوجه شده باشید و می‌توانید ویدیو را قطع کنید.

اما برای اینکه به طور کامل مبحث را یاد بگیرید، یک مثال دیگر را هم بیان می‌کنم تا دیگر جلسه اول این فصل را به پایان برسانیم.

برای مثال می‌خواهیم دایره را تعریف کنیم. نام function را دایره یعنی circle قرار می‌دهیم.

می‌خواهیم دایره را تعریف کنیم بنابراین نام function را circle قرار می‌دهیم.

وارد آن می‌شویم.

به اشتباه یکی از کارهای خودم را باز کردم.

حال می‌توانیم آن را دایره ما (ourcircle) ذخیره کنیم.

برای مثال در اینجا می‌خواهیم محیط و مساحت دایره را محاسبه کنیم. شما می‌توانید هر حجم یا شکل دیگری که خواستید را به عنوان تمرین محاسبه کنید. ما در اینجا دایره را محاسبه می‌کنیم.

می‌نویسیم function و خروجی‌‌هایی که می‌خواهیم داشته باشیم محیط (p) و مساحت (a) هستند.

نام تابع ماourcircle  بود و ورودی ما r است. درست است زیرا مساحت دایره می‌شود   که یعنی a خروجی ما است و محیط هم می‌شود  که همان p خروجی ما است.

 پس به این صورت می‌نویسیم:

a = pi * r^2;

p = 2 * pi * r;

و در خط آخر end را داریم.

در اینجا توجه داشته باشید که نام تابع را اشتباه وارد کرده بودیم.

در جلسه گذشته گفته بودیم که اسم‌ها باید یکی باشد.

ویرایش نام به ourcircle
ویرایش نام به ourcircle

مشاهده می‌کنید که الان درست شده است.

در جلسه گذشته نیز در این مورد تذکر داده بودیم.

حال تابع را فراخوانی می‌کنیم.

می‌گوییم ourcircle را برای ۱۰ محاسبه کند.

محاسیه با عدد 10
محاسیه با عدد 10

به نظر شما آیا این شیوه فراخوانی درست است؟ چه جوابی به ما می‌دهد؟

آیا هر دو جواب p و a یعنی مساحت و محیط را به ما می‌دهد؟

خیر. مشاهده می‌کنید که هیچ جوابی به ما نداده است. باید چه کاری انجام دهیم؟ باید به صورت با هدف فرابخوانیم. یعنی بگوییم [p , a] = …

البته به خط دوم برنامه هم دقت نکرده بودم که دو تا مساوی قرار داده بودم و اصلا برنامه را اشتباه کرده بود. باید یک مساوی قرار می‌دادیم.

پس با تصحیح این اشتباه برنامه قبلی باید یک خروجی به ما می‌داد.

مشاهده می‌کنید که یک خروجی به ما داده است و دو تا خروجی نداریم.

زیرا بدون هدف آن را فراخواندیم.

حال می‌خواهیم با هدف آن را فراخوانی کنیم.

می‌گوییم که [p a] یعنی خروجی‌هایی که می‌خواهیم برابر است با ourcircle برای عدد ۱۰. اکنون هم در خروجی محیط را می‌دهد و هم مساحت را می‌دهد.

مساحت می‌شود ۳۱۴.۱۵۹۳

و محیط هم می‌شود ۶۲.۸۳۱۹

وقتی که به صورت تصویر زیر فراخوانده بودیم و بدون هدف نوشته بودیم به ما فقط محیط را می‌داد.

پس شما باید توجه داشته باشید که چگونه فرامی‌خواند.

اصلا مهم نیست که حتما باید ‌[p a] قرار دهید. می‌توا‌نید به صورت زیر هم بنویسید.

فراخوانی به سبک دیگر
فراخوانی به سبک دیگر

مشاهده می‌کنید که مساحت را به صورت زیر به دست آورده است.

محاسبه مساحت
محاسبه مساحت

محیط را هم در تصویر زیر مشاهده می‌کنید که چند است.

محاسبه محیط
محاسبه محیط

و اینکه برای مثال اگر بخواهید بگویید که فقط مساحت را محاسبه کند، این را چگونه می‌نویسید؟ می‌توانید در اینجا یک ‍~ قرار دهید و بنویسید که [~ , a] و بعد می‌گوییم که برای مثال جواب تابع را برای ورودی ۱۵ به دست آورد.

قرار دادن علامت ~ و محاسبه با ورودی 15
قرار دادن علامت ~ و محاسبه با ورودی 15

الان مشاهده می‌کنید که فقط خروجی a را به ما داده است.

محاسبه خروجی a
محاسبه خروجی a

اگر به صورت تصویر زیر دو تا ~ قرار دهید، به نظر شما چه اتفاقی می‌افتد؟ این می‌آید کار را برای ما انجام می‌دهد برای مثال شما به صورت زیر می‌نویسید:

قرار دادن علامت~ و محاسبه آن
قرار دادن علامت~ و محاسبه آن

الان چیزی را نشان نمی‌دهد ولی در اصل آمده است محاسبه کرده است. خروجی به ما نمی‌دهد ولی در خودش آن را محاسبه کرده است.

تا جلسات بعد از آموزش انجام پروژه متلب با ما همراه باشید.