برنامه نویسی در متلب (MATLAB) — راهنمای گام به گام (+ دانلود فیلم آموزش رایگان)
متلب (MATLAB) یک محیط محاسباتی و زبان برنامهنویسی است که کاربردهای فراوانی در رشتههای مختلف علوم و مهندسی دارد. واژه MATLAB از دو واژه انگلیسی MATRIX به معنای ماتریس و LABORATORY به معنای آزمایشگاه تشکیل شده است، زیرا در آن مبنای محاسبات ماتریسها هستند. در این آموزش با برنامه نویسی متلب آشنا خواهیم شد.
همانطور که میدانید، مهمترین نکته در برنامهنویسی، به هر زبانی، توانایی یادگیری و پیادهسازی الگوریتمها است. بنابراین، پیش از آنکه برنامهنویسی را آغاز کنید باید با مفاهیم و مقدمات الگوریتمها آشنایی داشته باشید.
در این آموزش، برنامهنویسی متلب را به صورت گام به گام بیان میکنیم؛ بدین ترتیب که ابزارها و دستورات اساسی برنامهنویسی در متلب را در قالب سادهترین مثالها ارائه خواهیم کرد. همانطور که گفتیم، این آموزشِ گام به گام مبتنی بر مثال است و برای یادگیری باید هر یک از برنامهها را در متلب نوشته و آن را اجرا کنید. محتوای این آموزش در هفت بخش ارائه میشود.
بخش اول شامل برنامههای سادهای است که برای آشنایی با برنامهنویسی در متلب ارائه شدهاند. در بخش دوم و سوم، شیوه نوشتن حلقهها و شروط در متلب بیان شده است. بخش چهارم به آرایهها و ماتریسها اختصاص دارد و در بخش پنجم نحوه رسم نمودار در متلب ارائه گردیده است.
علاوه بر توابع از پیش تعریف شده متلب، کاربر نیز میتواند بسته به نیاز، توابع مورد نظر خود را تعریف کند. در بخش ششم، تعریف توابع توسط کاربر ارائه شده است. در نهایت، در بخش هفتم چگونگی استفاده از فایلها و دستورهای خارجی برای ورودی و خروجی بیان شده است.
توجه کنید که در ادامه، وقتی میگوییم برنامهای را بنویسید و یا اجرا نمایید، میتوانید یکی از این دو کار را انجام دهید:
- اگر قصد ذخیره برنامهها را ندارید، میتوانید کدها را در قسمت Command Window بنویسید و بعد از نوشتن هر خط از برنامه کلید Enter صفحه کلید را فشار دهید. بدین ترتیب، بعد از نوشتن آخرین خط و فشردن Enter برنامه اجرا میشود.
- اگر میخواهید برنامهها را برای استفادههای بعدی ذخیره کنید، روی New و پس از آن Script کلیک کنید تا Editor باز شود. میتوانید برنامه را در این Editor بنویسید و آن را نامگذاری (به صورت پیشفرض Untitled است) و ذخیره کنید. برای اجرای برنامه باید روی Run کلیک کنید. در این صورت نتیجه اجرای برنامه در Command Window نشان داده خواهد شد.
نکته دیگری که دانستن آن به شما کمک خواهد کرد این است که متلب توابع از پیش تعریف شده زیادی دارد. اگر با عملکرد تابعی آشنایی ندارید، کافی است در Command Window از یکی از دو دستور "help" یا "doc" استفاده کنید. بدین صورت که کلمه help یا doc را نوشته و بعد از یک فاصله نام تابع مورد نظرتان را بنویسید و کلید Enter را فشار دهید. با اجرای این دستورات، تفاوت help و doc را خواهید دید.
بخش اول: شروع برنامه نویسی متلب
این بخش شامل چند برنامه ساده برای آشنایی با برنامهنویسی در متلب است.
۱. نوشتن اولین برنامه
برنامه زیر را بنویسید و آن را اجرا کنید.
1a = 3;
2b = 5;
3c = a+b
خروجی این برنامه ۸ خواهد بود.
توجه کنید که نقطه ویرگول (;) در انتهای هر دستور برای جلوگیری از نمایش بصری خروجی به کار میرود. به عبارت دیگر، با گذاشتن نقطه ویرگول در انتهای هر دستور، آن خط از برنامه اصطلاحاً در حالت سکوت قرار میگیرد و در خروجی نمایش داده نمیشود. البته عملیات مورد نظر به صورت کامل انجام میشود. برای کد بالا به سادگی میتوانید نقطه ویرگول بگذارید و نتیجه را ببینید.
۲. مفهوم a = b چیست؟
در متلب و هر زبان برنامهنویسی دیگر، عبارت «a = b» به معنای «a مساوی با b است» نیست. در واقع، این عبارت محتوای b را در a قرار میدهد.
برای تحقیق این مورد، برنامه زیر را بنویسید و نتیجه را ببینید.
1a = 3;
2b = a;
3b
احتمالاً همانطور که دیدهاید، نتیجه ۳ خواهد بود.
در واقع باید «متغیرهای» a و b را به عنوان دو ظرف در نظر بگیرید که برچسبهای a و b دارند. در خط اول برنامه، عدد ۳ را در ظرف a قرار دادهایم و در خط بعدی محتوای ظرف a (همان ۳) را در طرف b ریختهایم. توجه کنید که در این صورت، محتوای a تغییری نمیکند. خط سوم نیز محتوای b را نمایش میدهد.
۳. عملگرهای اصلی ریاضی
برنامه زیر را اجرا کنید.
1a = 3;
2b = 9;
3c = 2*a+b^2-a*b+b/a-10
میبینیم که خروجی ۵۳ است. سمت راست خط سوم برنامه شامل چهار عملگر اصلی ریاضی + (جمع)، - (تفریق)، * (ضرب) و / (تقسیم) است. همچنین نماد ^ به معنی «به توانِ» است؛ بنابراین، عبارت "b^2" یعنی b به توانِ ۲.
۴. مفهوم a=b (ادامه)
برنامه زیر را بنویسید و اجرا کنید.
1a = 3;
2a = a+1;
3a
خروجی این برنامه ۴ است. در خط اول، عدد ۳ به متغیر a تخصیص داده میشود. در خط دوم، ابتدا سمت راست (4=۱+۳) محاسبه شده و بعد از آن به متغیر a تخصیص داده میشود. یعنی عدد ۴ جایگزین ۳ میشود.
5. خروجی قالب بندی شده (Formatted Output)
برنامه زیر را بنویسید و اجرا کنید.
1fprintf('Hello')
خروجی این کد به صورت زیر خواهد بود:
Hello
۶. خروجی قالب بندی شده
برنامه زیر را بنویسید و اجرا کنید.
1a = 3;
2b = a*a;
3c = a*a*a;
4d = sqrt(a);
5fprintf('%4u square equals %4u \r', a, b)
6fprintf('%4u cube equals %4u \r', a, c)
7fprintf('The square root of %2u is %6.4f \r', a, d)
خروجی این کد به صورت زیر خواهد بود:
دستور "fprintf" برای خروجی فرمت شده است. این خروجی در رشته اول درون این دستور در '...' نوشته شده است.
عبارت "4u%" (عدد صحیح ۴ رقمی) و "6.4f%" (عدد حقیقی که تا ۴ رقم اعداد نشان داده میشود) فرمت متغیرهای خروجی را نشان میدهند. دستور "sqrt" در خط چهارم برنامه تابعی است که از متغیر جذر میگیرد.
۷. آرایهها
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
1a = [3 6 7];
2b = [1 9 4];
3c = a + b
خروجی این برنامه به صورت زیر است:
4 15 11
هر دو متغیر a و b آرایههایی با سه عنصر یا درایه هستند. در خط سوم، عمل "a+b" درایهها یا عناصر متناظر را با یکدیگر جمع میکند.
۸. استخراج یک عنصر از آرایه
برنامه زیر را اجرا کنید.
1a = [3 6 7];
2b = [1 9 4 5];
3c = a(2) + b(4)
خروجی این برنامه c = 11 است.
اگر b یک آرایه یک بعدی باشد، (b(n درایه nاُم این آرایه خواهد بود. از آنجایی (a(2 برابر با ۶ و (b(4 برابر با ۵ است، نتیجه خط سوم برنامه c=6+5 =11 خواهد بود.
9. یادداشت (Comment)
برنامه زیر را بنویسید و اجرا کنید.
1%
2% This program demonstrates how to "comment out"
3% a segment of code
4%
5A = 3;
6B = A*A;
7%
8% B = 2*B <--- This statement is not executed
9%
10C = A+B
خروجی این برنامه c=۱۲ است. همانطور که میبینیم، بخشهایی از برنامه که قبل از آنها علامت % قرار میگیرد، تأثیری در اجرای برنامه ندارد و برای نوشتن یادداشتها و نکات مربوط به کد از آن استفاده میشود.
۱۰. ادامه کد در خط بعد
برنامه زیر را اجرا و نتیجه را بررسی کنید.
1summation1 = 1 + 3 + 5 + 7 ...
2 + 9 + 11
گاهی یک خط یک برنامه طولانی میشود و لازم است برای جلوگیری از بینظمی و درهمریختگی کد، بخشی از آن را به خط بعد منتقل کنیم. برای این کار از سه نقطه "..." بین دو بخش استفاده میکنیم. در حقیقت، کد بالا با کد زیر یکسان است:
1summation1 = 1+3+5+7+9+11
۱۱. پاک کردن یک متغیر
برنامه زیر را بنویسید و آن را اجرا کنید.
1c1 = 3;
2c2 = c1+5;
3clear c1
4c1
با اجرای این برنامه با پیغام زیر مواجه خواهید شد:
.'Undefined function or variable 'c1
این خطا به این دلیل است که متغیر "c1" دیگر وجود ندارد. شما با دستور "clear" این متغیر از حافظه کامپیوترتان حذف کرهاید. توجه کنید که دستور "clear" فقط محتویات متغیر را حذف نمیکند، بلکه خود متغیر را کاملاً حذف میکند.
گاهی پیش میآید که برنامهای مینویسید و در آن متغیری دارید که اندازه آن بزرگ است و حافظه را اشغال میکند. با استفاده از دستور "clear" میتوانید آن را حذف کنید. اگر دستور "clear" را بنویسید و بعد از آن نام چند متغیر را (با یک فاصله از هم) بنویسید، همه آن متغیرها حذف خواهند شد. برنامهای بنویسید و این مورد را بررسی کنید.
۱۲. توابع و ثوابت ریاضی
به سادگی میتوان توابع و ثوابت معروف ریاضی را در متلب نوشت.
برای مثال، برنامه زیر را بنویسید.
1x = pi;
2y = sin(pi/2)
3z = exp(-sin(pi/2))
خروجی اجرای این برنامه y=1 و z=0.3679 است. همانطور که میبینید، میتوانیم تابعِ تابع و بیشتر از آن را نیز بنویسیم. ابتدا داخلیترین تابع محاسبه میشود و به سمت خارجیترین تابع ادامه پیدا میکند. این مورد را برای برنامه بالا بررسی کنید.
۱۳. نامگذاری یک متغیر
متغیرهای متلب نسبت بین حروف بزرگ و کوچک تمایز قائل میشوند. برای مثال "FARADARS" و "faradars" دو متغیر متفاوت هستند. در نامگذاری متغیر میتوان از زیرین خط یا آندرلاین (_) و یا اعداد نیز به عنوان بخشی از نام نیز استفاده کرد.
برای مثال، "FDS_125" یک نام متغیر قابل قبول است. برخی نامها مربوط به ثوابت خاصی هستند که در متلب تعریف شدهاند و مقدار ثابتی دارند. مثلاً "pi" برابر با ...3.14159 است.
۱۴. رسم سریع یک نمودار
برنامه زیر را بنویسید و نتیجه اجرای آن را ببینید.
1x = [0:0.1:20];
2y = sin(x);
3plot(x,y)
خروجی این برنامه شکل زیر است:
خط اول برنامه معادل با بردار [x=[0 0.1 0.2 0.3 ... 19.8 19.9 20 است. به این ترتیب، این آرایه 101 عنصر دارد. به عبارت دیگر، "0:0.1:20" به این معنی است که این آرایه از عدد ۰ شروع شده و در هر گام به اندازه مجموع عدد قبلی و 0.1 یک عدد تولید میکند تا به انتهای بازه، یعنی ۲۰، برسد. خط دوم برنامه آرایه y را برحسب x محاسبه میکند:
[((y = [sin(x(1)) sin(x(2)) sin(x(3)) ... sin(x(200)) sin(x(201
یا
[(y = [sin(0) sin(0.1) sin(0.2) ... sin(19.9) sin(20
خط سوم نیز y را برحسب x رسم میکند.
بخش دوم: حلقهها
حلقهها بخش مهمی از برنامهنویسی را تشکیل میدهند. در این بخش با شیوه نوشتن حلقهها در متلب آشنا میشویم.
۱۵. حلقه با for
برنامه زیر را بنویسید و نتیجه را ببینید.
1b = 3;
2for k = 1:5
3 b
4end
نتیجه به صورت زیر خواهد بود:
3
3
3
3
3
سه خط آخر برنامه بالا یک «حلقه for» را تشکیل میدهند. عبارت اصلی بین دو بخش "for k=1:5" و "end" قرار گرفته و وقتی متغیر k با گام ۱ از ۱ تا ۵ تغییر میکند، عدد مورد نظر ۵ بار تکرار میشود.
۱۶. حلقه for (استفاده از اندیس در محاسبات)
برنامه زیر را بنویسید و اجرا کنید.
1b = 3;
2for k = 1:5
3 b^k
4end
خروجی این برنامه به صورت زیر است:
3
9
27
81
243
این خروجیها به صورت ۱^3، ۲^3، ۳^3، ۴^3 و ۵^3 محاسبه شدهاند. همانطور که میبینیم، در هر تکرار، مقدار k تغییر میکند و مقدار متناظر با هر تکرار برای محاسبه به کار میرود.
۱۷. حلقه for (تأثیر بیش از یک متغیر در عبارت)
برنامه زیر را اجرا کنید.
1sum1 = 0;
2for k = 1:9
3 sum1 = sum1+k;
4end
5sum1
خروجی این برنامه 45 است. در واقع، این عدد به صورت 9+8+7+6+5+4+3+2+1 محاسبه شده است. سعی کنید این برنامه را با توجه به مواردی که در بالا یاد گرفتهاید تحلیل کنید.
۱۸. حلقه for (تأثیر بیش از یک متغیر در عبارت)
برنامه زیر را بنویسید و اجرا کنید.
1for k = 1:2:9
2 sum1 = sum1+k;
3end
4sum1
خروجی این برنامه ۲۵ است که از مجموع 9+7+5+3+1 به دست آمده است. دستور "for k = 1:2:9" به این معنی است که فقط ۵ بار در حلقه حرکت میکنیم. ابتدا 1=k است. در تکرار بعدی 2+1=k خواهد بود و به همین ترتیب ادامه مییابد تا به ۹ برسد.
۱۹. کار با آرایه در حلقه
برنامه زیر را بنویسید.
1b = [3 8 9 4 7 5];
2sum1 = 0;
3for k = 1:4
4 sum1 = sum1+b(k);
5end
6sum1
خروجی این کد ۲۴ است که به صورت زیر محاسبه شده است:
sum1 = b(1)+b(2)+b(3)+b(4) = 3+8+9+4 = 24
۲۰. کار با آرایه در حلقه
برنامه زیر را اجرا کنید.
1b = [3 8 9 4 7 5];
2sum1 = 0;
3for k = 1:2:5
4 sum1 = sum1+b(k);
5end
6sum1
خروجی این برنامه عدد ۱۹ است و به صورت زیر محاسبه شده است:
sum1 = b(1)+b(3)+b(5) = 3+9+7 = 19
۲۱. حلقه دوگانه
برنامه زیر را اجرا کنید و با توجه به نکاتی که آموختهاید سعی کنید آن را تحلیل کنید.
1sum1 = 0;
2for n = 1:2
3 for m = 1:3
4 sum1 = sum1+n*m;
5 end
6end
7sum1
خروجی این برنامه ۱۸ است و به صورت زیر محاسبه میشود:
Sum1 = 1*1+1*2+1*3 +2*1+2*2+2*3 = 18
۲۲. حلقه دوگانه
برنامه زیر را بنویسید و اجرا کنید.
1for n = 1:2
2 for m = 1:3
3 fprintf('n = %3u m = %3u \r', n, m)
4 end
5end
خروجی این برنامه به صورت زیر است:
n = 1 m = 1
n = 1 m = 2
n = 1 m = 3
n = 2 m = 1
n = 2 m = 2
n = 2 m = 3
۲۳. استفاده پیچیدهتر از حلقه و اندیس
برنامه زیر را بنویسید و آن را تحلیل کنید.
1b = [2 5 7 4 9 8 3];
2c = [2 3 5 7];
3sum1 = 0;
4for k = 1:4
5 sum1 = sum1+b(c(k));
6end
7sum1
خروجی این برنامه ۲۴ است و طبق رابطه زیر محاسبه میشود:
((sum1 = b(c(1))+b(c(2))+b(c(3))+b(c(4
(b(2)+b(3)+b(5)+b(7 =
5+7+9+3 =
24 =
بخش سوم: شاخهگزینی و شروط
در این بخش چگونگی تعریف شروط در برنامه را معرفی میکنیم.
۲۴. دستور if
برنامه زیر را اجرا کنید.
1num1 = 7;
2if (num1 > 5)
3 fprintf('%4u is greater than 5 \r', num1)
4else
5 fprintf('%4u is less than or equal to 5 \r', num1)
6end
خروجی این کد به صورت زیر نمایش داده میشود:
اگر در برنامه تغییر ایجاد کرده و عبارت ";num1=3" را جایگزین خط اول کنیم، خروجی به صورت زیر نمایش داده میشود:
همانطور که متوجه شدهاید، در این برنامه، اگر num1 بزرگتر از ۵ باشد، عبارت "(fprintf('%4u is greater than 5 \r', num1" اجرا میشود، و در غیر این صورت، کد "(fprintf('%4u is less than or equal to 5 \r', num1" اجرا خواهد شد.
۲۵. دستور if - elseif - else
برنامه زیر را بنویسید و آن را اجرا کرده و نتیجه را تحلیل کنید.
1num1 = 4;
2if (num1 >= 5)
3 fprintf('%4i is greater than or equal to 5 \r', num1)
4elseif (num1 > 1)
5 fprintf('%4i is less than 5 but greater than 1 \r', num1)
6elseif (num1 == 1)
7 fprintf('%4i equals 1 \r', num1)
8elseif (num1 > -3)
9 fprintf('%4i is less than 1 but greater than -3 \r', num1)
10else
11 fprintf('%4i is less than or equal to -3 \r', num1)
12end
۲۶. مثال محاسبه سال کبیسه
در اینجا با استفاده از برنامهنویسی متلب یک مثال کاربردی را حل میکنیم. میخواهیم برنامهای بنویسیم که تعیین کند یک سال میلادی مشخص کبیسه است یا خیر.
برنامه زیر را بررسی کنید. در تقویم میلادی نو سالهایی که بر ۴ بخشپذیر باشند (باقیماندهٔ تقسیم آن سال بر ۴ برابر ۰ باشد) کبیسه هستند، با این استثنا که از میان سالهایی که بر ۱۰۰ بخشپذیرند (سالهای انتهای سده)، تنها آنهایی که بر ۴۰۰ نیز بخشپذیرند کبیسه هستند.
1nyear = 1975;
2if (mod(nyear, 400) == 0)
3 fprintf('%6u is a leap year', nyear)
4elseif (mod(nyear,4) == 0) & (mod(nyear,100) ~= 0)
5 fprintf('%6u is a leap year', nyear)
6else
7 fprintf('%6u is not a leap year', nyear)
8end
خروجی برنامه بالا به صورت زیر است:
سعی کنید سالهای مختلف را در برنامه وارد کرده و نتایج را بررسی کنید.
در خط چهارم برنامه، "&" به معنی «وَ» است. بنابراین، هر دو شرط "(mod(nyaer,4) == 0)" و "(mod(nyear,100) ~= 0)" باید صحیح باشند تا دستور "(fprintf('%6u is a leap year', nyear" اجرا شود. به طور مشابه، خط عمودی "|" نیز به معنی «یا» است.
همچنین، نمادهای "=~" در خط چهارم به معنی «برابر نیست با» است. از این دست شروط، شش مورد وجود دارد که در دستورات شرطی برای مقایسه دو عدد با هم مورد استفاده قرار میگیرند. این عبارتها به شرح زیر هستند:
A>B | A بزرگتر از B است. |
A<B | A کوچکتر از B است. |
A>=B | A بزرگتر یا مساوی B است. |
A<=B | A کوچکتر یا مساوی B است. |
A==B | A مساوی B است. |
A~=B | A با B برابر نیست. |
تابع "(mod(A,B" باقیمانده تقسیم A بر B را نتیجه میدهد. برای مثال، mod(7,2) = 1 ،mod(10,4) = 2 و mod(25,5) = 0 است. بنابراین، اگر A بر B بخشپذیر باشد، mod(A,B) = 0 است. این تابع در بسیاری از کاربردهای مربوط به روشهای عددی مفید است.
۲۷. ترکیب حلقه و شرط
برنامه زیر را در متلب بنویسید.
1sum1 = 0;
2sum2 = 0;
3N = 9
4for k = 1:N
5 sum1 = sum1+k;
6 if (mod(k,3) == 0)
7 sum2 = sum2+k;
8 end
9end
10sum1
11sum2
اگر این برنامه را اجرا کنید، خروجی به صورت زیر خواهد بود:
sum1 = 45
sum2 = 18
با تحلیل این برنامه خواهید دید که خروجیها به صورت زیر محاسبه شدهاند:
Sum1 = 1+2+3+4+5+6+7+8+9
sum2 = 3+6+9
۲۸. حلقه while
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
1x = 3;
2while (x < 100)
3 x = x*3;
4end
5x
خروجی این برنامه x = 243 است. اگر به مفهوم while دقت کنیم، میبینیم که ترکیبی از یک حلقه for و یک if است. در برنامه بالا، تا زمانی که شرط داخل پرانتز (x<100) برقرار باشد، محاسبه در حلقه انجام خواهد شد.
بنابراین، مقادیر ۳، ۹، ۲۷، ۸۱ و در نهایت ۲۴۳ برای x محاسبه میشود و چون ۲۴۳ بزرگتر از ۱۰۰ است و دیگر شرط برقرار نیست، محاسبات ادامه پیدا نمیکند.
بخش چهارم: آرایه و ماتریس
در این بخش، با نحوه کار کردن با ماتریسها و آرایهها آشنا میشویم.
۲۹. جمع دو آرایه
برنامه زیر، جمع دو آرایه را نشان میدهد.
1a = [2 12 25];
2b = [3 7 4];
3c = a+b
خروجی این برنامه به صورت زیر است:
c = 5 19 29
۳۰. جمع دو ماتریس
دو ماتریس را به صورت زیر جمع کنید و نتیجه را ببینید.
1a = [3 4; 1 6];
2b = [5 2; 11 7];
3c = a+b
خروجی کد بالا به صورت زیر است:
c = 8 6
12 13
این برنامه، در حقیقت، عملیات زیر را انجام میدهد:
۳۱. ضرب یک عدد در آرایه یا ماتریس
برنامه زیر را بنویسید و خروجی آن را بررسی کنید.
1a = [3 5; 1 4];
2b = 2*a
خروجی این برنامه به صورت زیر است:
b = 6 10
2 8
۳۲. ضرب درایه به درایه دو آرایه یا دو ماتریس با ابعاد مشابه
برنامه زیر را بنویسید و آن را اجرا کنید.
1a = [2 3 5];
2b = [2 4 9];
3c = a.*b
خروجی این برنامه به صورت زیر است:
c = 4 12 45
نقطه (.) قبل از عملگر ریاضی "*" عملیات را به صورت درایه به درایه انجام میدهد. در این حالت، c به صورت زیر محاسبه خواهد شد:
[(c = [a(1)*b(1) a(2)*b(2) a(3)*b(3
۳۳. ضرب درایه به درایه دو ماتریس
برنامه زیر را در متلب اجرا کنید:
1a = [2 3; 1 4];
2b = [5 1; 7 2];
3c = a.*b
همانطور که انتظار دارید، خروجی این برنامه برابر است با:
c = 10 3
7 8
۳۴. ضرب مستقیم دو ماتریس (نه درایه به درایه)
برنامه زیر را در متلب بنویسید و به تفاوت آن با مثال قبل دقت کنید.
1a = [2 3; 1 4];
2b = [5 1; 7 2];
3c = a*b
خروجی برنامه به صورت زیر است:
c = 31 8
33 9
مشاهده میکنیم که خروجی این مثال با خروجی مثال قبل تفاوت دارد. در واقع، در این مثال، ضرب ماتریسی انجام شده است.
۳۵. توابع پایه با یک متغیر برداری
برنامه زیر را اجرا کنید.
1a = [2 3 5];
2b = sin(a)
خروجی این برنامه به صورت زیر است:
b = 0.9092 0.1411 -0.9589
همانطور که میبینیم، خروجی برای هر درایه ورودی محاسبه شده و محتوای b به صورت زیر است:
[(sin(2) sin(3) sin(5]
۳۶. مثالی دیگر از توابع پایه با یک متغیر برداری
برنامه زیر را بنویسید و اجرا کنید.
1a = [2 3 5];
2b = 2*a.^2+3*a+4
خروجی برنامه برابر است با:
b = 18 31 69
این خروجی به صورت زیر محاسبه شده است:
[b = [2*(a(1))^2+3*a(1)+4 2*(a(2))^2+3*a(2)+4 2*(a(3))^2+3*a(3)+4
۳۷. تعیین محتوای یک آرایه
برای آنکه محتوا و داریههای یک آرایه را تعیین کنیم، میتوانیم مشابه مثال زیر عمل نماییم.
1a = [0:0.5:4];
2a
اگر برنامه بالا را اجرا کنید، خواهید دید که خروجی آن به صورت زیر خواهد بود:
a = 0 0.5 1 1.5 2 2.5 3 3.5 4
۳۸. استخراج داریه از ماتریس
برنامه زیر را بنویسید و اجرا کنید.
1A = [3 5; 2 4];
2c = A(2,2)+A(1,2)
خروجی این برنامه c=9 است. برای ماتریس A، دستورهای زیر درایه مورد نظر از آن را استخراج میکنند:
A(1,1) = 3, A(1,2) = 5, A(2,1) = 2, A(2,2) = 4
۳۹. مثالی از استفاده از اندیس برای یک ماتریس
برنامه زیر را بنویسید و سعی کنید با توجه به مطالبی که گفته شد، خط به خط آن را بررسی و تحلیل کنید.
1A = [3 5; 2 4];
2norm1 = 0;
3for m = 1:2
4for n = 1:2
5 norm1 = norm1+A(m,n)^2;
6end
7end
8norm1 = sqrt(norm1)
خروجی این برنامه به صورت زیر است:
norm1 = 7.348
این برنامه نُرم اقلیدسی یک ماتریس را محاسبه میکند.
۴۰. حل دستگاه معادلات خطی
برنامه زیر را اجرا کنید.
1A = [4 1 2; 0 3 1; 0 1 2];
2b = [17 ; 19 ; 13];
3x = inv(A)*b
نتیجه حاصل از این برنامه به صورت زیر است:
x = 1
5
4
این برنامه، معادله را حل میکند و پاسخ آن برابر است با: .
۴۱. حل دستگاه معادلات خطی
برنامه زیر را بنویسید و اجرا کنید:
1A = [4 1 2; 0 3 1; 0 1 2];
2b = [17 ; 19 ; 13];
3x = A\b
خروجی این برنامه مشابه مثال قبل است. در اینجا "A\b" معادل همان " inv(A)*b" است.
بخش پنجم: رسم نمودار
روشهای رسم نمودار در این بخش ارائه شده است.
۴۲. یک مثال ساده از دستور plot
برنامه زیر را در متلب اجرا کنید:
1a = [0:0.5:5];
2b = 2*a.^2 + 3*a -5;
3plot(a,b)
نتیجه اجرای این برنامه شکل زیر خواهد بود:
در دستور "(plot(a,b" آرایه "a" باید شامل دادههای محوری باشد که میخواهیم نمودار را بر حسب آن رسم کنیم (متناظر با محور x). آرایه "b" نیز باید متناظر با مقادیر محور y باشد.
بعد از آنکه نمودار را رسم کردیم، میتوانیم با ابزارهای تعاملی متلب آن را اصلاح کنیم. برای مثال، میتوانیم برچسب (نام) محورهای x و y را به صورت دستی به نمودار اضافه کنیم. همچنین میتوانیم نمودار را =با فرمتهای مختلف (مانند tif ،jpg ،eps و..) ذخیره کنیم.
۴۳. تعیین مشخصات یک شکل: الگو، رنگ و ضخامت خط
برنامه زیر را اجرا و نتیجه را مشاهده کنید.
1a = [0:0.5:5];
2b = 2*a.^2 + 3*a -5;
3plot(a,b,'-or','MarkerFaceColor','g','LineWidth',2)
4xlabel('X'); ylabel('Y'); legend('Test','Location','NorthWest')
نتیجه اجرای برنامه بالا شکل زیر خواهد بود:
عبارت 'or-' در دستور plot الگوی خط را تعیین کرده است. این عبارت منجر به خط ممتد با ترکیب نمادهای دایرهای شده است. رنگ این دایرهها سبز است. دلیل وجود این رنگ، نوشتن عبارت 'g' برای 'MarkerFaceColor' است. شرح یا همان legend نمودار نیز در گوشه بالایی سمت چپ قاب تصویر نوشته شده است. این کار با اختصاص 'NorthWest' برای 'Location' ایجاد شده است.
۴۴. رسم چند نمودار
برنامه زیر را بنویسید و آن را اجرا کنید.
1a = [0:0.5:5];
2b = 2*a.^2 + 3*a -5;
3c = 1.2*a.^2+4*a-3;
4hold on
5plot(a,b,'-or','MarkerFaceColor','g','LineWidth',2)
6plot(a,c,'--ok','MarkerFaceColor','c','LineWidth',2)
7xlabel('X'); ylabel('Y'); legend('Curve 1','Curve 2','Location','NorthWest')
خروجی این برنامه، نمودار زیر است:
در برنامه بالا، اگر از دستور "hold on" استفاده نکنیم، دستور plot دوم در خط بعد، در قاب نمودار قبلی رسم میشود و نمودار قبلی را حذف میکند.
۴۵. رسم نمادها
دستورات زیر را بنویسید و آن را اجرا کنید.
1 = [0:0.5:5];
2b = 2*a.^2 + 3*a -5;
3c = 1.2*a.^2+4*a-3;
4hold on
5plot(a,b,'or','MarkerFaceColor','g','LineWidth',2)
6plot(a,c,'ok','MarkerFaceColor','c','LineWidth',2)
7xlabel('X'); ylabel('Y'); legend('Curve 1','Curve 2','Location','NorthWest')
خروجی این برنامه شکل زیر است:
۴۶. رسم چند قاب نمودار در یک تصویر
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
1a = [0:0.5:5];
2b = 2*a.^2 + 3*a -5;
3c = 1.2*a.^2+4*a-3;
4subplot(1,2,1)
5plot(a,b,'-or','MarkerFaceColor','g','LineWidth',2)
6xlabel('X'); ylabel('Y'); legend('Curve ','Location','NorthWest')
7subplot(1,2,2)
8plot(a,c,'--ok','MarkerFaceColor','c','LineWidth',2)
9xlabel('X'); ylabel('Y'); legend('Curve 2','Location','NorthWest')
شکل حاصل از اجرای این برنامه به صورت زیر خواهد بود:
بخش ششم: تابع تعریف شده توسط کاربر
در این بخش، روشهای تعریف توابعی را که میتوانید برحسب نیازتان تعریف کنید و در توابع متلب وجود ندارند معرفی میکنیم.
۴۷. چگونه یک تابع را تشکیل دهیم و از آن استفاده کنیم؟
ابتدا، یک برنامه متلب (New Script) را باز میکنیم. برای مثال، نام آن را myfunc1 قرار میدهیم و آن را با پسوند myfunc1.m ذخیره میکنیم. فرض کنید میخواهیم تابع را تعریف کنیم. این تابع به صورت زیر در متلب نوشته میشود:
1function outcome = myfunc1(x)
2outcome = 2*x^2 + 3*x + 7;
متغیر "outcome" متغیری است که خودمان آن را تعریف کردهایم و از آن برای برقراری رابطه با پارامتر ورودی "x" استفاده میکنیم. بعد از آنکه تابع مورد نظر را تعریف کردیم، میتوانیم در برنامهها یا توابع دیگری که مینویسیم آن را فراخوانی کنیم. برای مثال، فرض کنید برنامهای با نام mainprog1.m به صورت زیر نوشتهایم:
1for n = 1:5
2 x = n*0.1;
3 z = myfunc1(x);
4 fprintf('x = %4.2f f(x) = %8.4f \r',x,z)
5end
خروجی این برنامه به صورت زیر است:
x = 0.10 f(x) = 7.3200
x = 0.20 f(x) = 7.6800
x = 0.30 f(x) = 8.0800
x = 0.40 f(x) = 8.5200
x = 0.50 f(x) = 9.0000
توجه کنید که تابعی که از آن استفاده میکنیم، باید در همان پوشهای از کامپیوتر ذخیره شده باشد که برنامه یا تابع اصلی قرار دارد. متلب به صورت اتوماتیک آن را پیدا کرده و ارتباط لازم بین همه توابع را برقرار میکند.
۴۸. تابعی با چند پارامتر ورودی
تابع زیر را با نام myfunc2.m در نظر بگیرید که به صورت زیر است:
1function outcome = myfunc2(x,a,b,c)
2outcome = a*x^2 + b*x + c;
همانطور که دریافتهاید، این برنامه تابع را تعریف میکند که ورودیهای آن، b ،a ،x و c هستند.
این تابع را در برنامه دیگری با نام mainprog2.m به کار میبریم:
1for n = 1:5
2 x = n*0.1;
3 z = myfunc2(x,2,3,7);
4 fprintf('x = %4.2f f(x) = %8.4f \r',x,z)
5end
خروجی برنامه اخیر به صورت زیر است:
x = 0.10 f(x) = 7.3200
x = 0.20 f(x) = 7.6800
x = 0.30 f(x) = 8.0800
x = 0.40 f(x) = 8.5200
x = 0.50 f(x) = 9.0000
بخش هفتم: استفاده از فایلها و دستورهای خارجی برای ورودی و خروجی
در این بخش شیوه استفاده از فایلها و دستورات ورودی خارج از برنامه را بیان میکنیم. همچنین نحوه ایجاد فایلها و دستورات در خروجی را بیان خواهیم کرد.
۴۹. باز کردن یک فایل و نوشتن خروجی در آن
برنامه زیر را بنویسید و نتیجه آن را ببینید:
1fID1 = fopen('myoutput1.txt','w');
2for n = 1:4
3 b1 = n ; b2 = n^2 ; b3 = n^3;
4 fprintf(fID1,'%7u %7u %7u \r',b1,b2,b3);
5end
این برنامه خروجی خاصی که مانند مثالهای قبل قابل رؤیت باشد تولید نمیکند. اما فایلی با نام "myoutput.txt" ایجاد میکند (در همان جایی که متلب ذخیره شده است). محتوای این فایل به صورت زیر است:
1 1 1
2 4 8
3 9 27
4 16 64
خط اول برنامه فایلی به نام 'myoutput1.txt' را باز میکند و نوع "W" به این معنی است که این فایل "write only" است. پس از اجزای فرمان، متلب یک فایل ID یا شناسه را انتخاب خواهد کرد (که یک عدد است) و آن را در متغیر fID1 قرار خواهد داد. کاربر نیازی به دانستن آن عدد ندارد، اما اگر یک خروجی برای آن فایل باشد، باید از آن به عنوان شناسه استفاده شود.
دستور "(fprintf(fID1,'%7u %7u %7u \r',b1,b2,b3" خروجی را به فایلی با ID یا شناسه fID1 هدایت میکند.اگر ID فایل داده نشده باشد، فرمان کوتاه "(fprintf('%7u %7u %7u \r',b1,b2,b3" خروجی را در مکان پیشفرض نشان خواهد داد.
۵۰. خواندن داده از یک فایل موجود
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
1fID1 = fopen('myoutput1.txt','r');
2for n = 1:4
3 b = fscanf(fID1,'%7u %7u %7u \r',3);
4 btotal = b(1)+b(2)+b(3);
5 fprintf('%7u + %7u + %7u = %7u \r', b(1), b(2), b(3), btotal)
6end
نتیجه این کد به صورت زیر است:
1 + 1 + 1 = 3
2 + 4 + 8 = 14
3 + 9 + 27 = 39
4 + 16 + 64 = 84
فرض میکنیم فایل "myoutput1.txt" قبلاً توسط برنامه بخش ۴۹ ایجاد شده است و به صورت صحیح در همان جایی که برنامه متلب را اجرا میکنیم ذخیره شده است. دستور نخست کد بالا، فایل "myoutput1.txt" را با وضعیت تعیین شده "r" به معنای "read only" باز میکند.
دستور "(b = fscanf(fID1,'%7u%7u %7u \r',3" یک رکورد را از فایل خارجی با ID=ID1 با استفاده از فرمت '%7u %7u %7u \r' میخواند. عدد "3" بعد از این عبارت مشخص میکند که فقط ۳ عنصر اول این رکورد خوانده شده و در آرایه "b" قرار داده میشوند.
۵۱. ایجاد خط فرمان برای وارد کردن ورودی توسط کاربر
برناامه زیر را بنویسید و اجرا کنید.
1num1 = input('Enter your age');
2if (num1 > 17)
3 fprintf('You are eligible to vote')
4else
5 fprintf('You are not eligible to vote')
6end
برنامه بالا حالتی خاصی از وقتی است که ورودی از یک فایل خارجی خوانده نمیشود، بلکه توسط کاربر و با یک خط فرمان وارد میشود. خروجی برنامه بالا به عددی بستگی دارد که کاربر وارد میکند (در متغیر "num1" ذخیره میگردد) که بزرگتر از ۱۷ است یا کوچکتر از آن.
اگر بخواهیم ورودی یک رشته باشد (مثلاً "YES" یا "Fara Dars")، باید از گزینه "s" استفاده کرده و آن را به دستور اضافه کنیم. برای مثال "('name1 = input('Enter your surname', 's".
سلام وقت بخیر
میشه از متلب برای شبیه سازی شبکه های خودرویی vanet استفاده کرد؟
اگر میشه لطفا آموزشش رو بزارید. ممنون
سلام. بسیار مفید بود
سلام و عرض خسته نباشید
یه سوال داشتم خدمتتون
آیا با متلب میشه برنامه اندرویدی ساخت ؟
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
برای ساخت اپلیکیشن اندروید بهترین راه استفاده از اندروید استودیو است که در آن بهطور عمده از زبانهای جاوا و کاتلین استفاده میشود. ممکن است قابلیت عملکردی خاصی وجود داشته باشد که با زبان متلب آن را پیادهسازی کرده باشید و بخواهید آن را به اپلیکیشن خود اضافه کنید. در این صورت راههایی برای این کار وجود دارند. اما بهطور کلی توصیه میشود همیشه از بهترین و سر راستترین راه استفاده شود که در این مورد استفاده از جاوا و کاتلین است.
برای استفاده از کدهای متلب در اپلیکیشن اندرویدی، یک راه استفاده از Matlab Coder است. این ابزار، کدهای متلب را به زبان C تبدیل میکند و سپس میتوانید کدهای C تولید شده را در اپلیکیشن اندرویدیتان ادغام کنید.
یک راه دیگر استفاده از Simulink Support Package for Android Devices برای تبدیل مدل متلب به اپلیکیشن اندرویدی است. در این روش میتوان کدهای متلب را در قالب بلوک تابع متلب تعبیه و از آن به همراه سایر بلوکهای اندرویدی استفاده کرد و اپلیکیشنهای اندرویدی ساخت.
برای شما آرزوی سلامتی و موفقیت داریم.
فوق العاده روان ، ساده و کاربردی ، البته با یک لهجه بسیار شیرین
سلام وحید گرامی.
خوشحالیم که این آموزش برایتان مفید بوده است.
شاد و پیروز باشید.
بسیار عالی و کامل بود
بسیار عالی و خوب بود .
چقدر مفهموی و روان توضیح دادید، دمتون گرم
حتما از آموزشهاتون توی درسم استفاده میکنم
ممنونم از این همه خوبی
سلام.
خوشحالیم که این آموزش برایتان مفید بوده است.
موفق باشید.
بسیار ممنون خیلی لطف کردید
با سلام، برای دریافت پاسخ چند سوال باید با چه کسی تماس گرفت؟
با سلام و تشکر بابت سایت خوب شما فقط لطفا نوشتن برنامه های nمتغیره که در آنها متغیر ها بصورت xiظاهر میشن راهنمایی کنید ممنون از شما
سلام خیلی ممنون از فرادرس با آموزش های جامع و کاملش
یه سوال داشتم ممنون میشم راهنماییم کنید
میخوام یه برنامه بنویسم که با دستور for و if ، مجموع درایه های هر سطر و ستون ماتریس در ابتدای همون سطر و ستون تولید بشه برای مثال یه ماتریس ۵۰*۵۰ با اضافه شدن جمع هر سطر و ستون به ۵۱*۵۱ تبدیل میشه تشکر
سلام خیلی ممنون از فرادرس با آموزش های جامع و کاملش
یه سوال داشتم ممنون میشم راهنماییم کنید
میخوام یه برنامه بنویسم که با دستور for و if ، مجموع درایه های هر سطر و ستون ماتریس در ابتدای همون سطر و ستون تولید بشه برای مثال یه ماتریس ۵۰*۵۰ با اضافه شدن جمع هر سطر و ستون به ۵۱*۵۱ تبدیل میشه تشکر
بسیار بسیار ممنونم
واقعا حداحفظتون کنه کارتون حرف نداره
سلام چطوری می توانم درایه های یک ماتریس که بزرگتر یک هستن علاوه بر شناسایی به یک تبدیل کنم
یادم رفته شد و یاداوری شد.کاملن راضیم.
عالی بود.
احسنت