نوشتن برنامه مقدماتی در متلب
نوشتن برنامه مقدماتی در متلب :آموزش متلب
در این بخش یک برنامه مقدماتی در متلب را کدنویسی و اجرا کرده و نتایج خروجی را مشاهده می نماییم.
بخش اول: شروع برنامه نویسی متلب
آموزش متلب این بخش شامل چند برنامه ساده برای آشنایی با برنامهنویسی در متلب است.
۱. نوشتن اولین برنامه
برنامه زیر را بنویسید و آن را اجرا کنید.
۱ ۲ ۳ | a = 3; b = 5; c = a+b |
خروجی این برنامه ۸ خواهد بود.
توجه کنید که نقطه ویرگول (;) در انتهای هر دستور برای جلوگیری از نمایش بصری خروجی به کار میرود. به عبارت دیگر، با گذاشتن نقطه ویرگول در انتهای هر دستور، آن خط از برنامه اصطلاحاً در حالت سکوت قرار میگیرد و در خروجی نمایش داده نمیشود. البته عملیات مورد نظر به صورت کامل انجام میشود. برای کد بالا به سادگی میتوانید نقطه ویرگول بگذارید و نتیجه را ببینید.
۲. مفهوم a = b چیست؟
آموزش متلب در متلب و هر زبان برنامهنویسی دیگر، عبارت «a = b» به معنای «a مساوی با b است» نیست. در واقع، این عبارت محتوای b را در a قرار میدهد. برای تحقیق این مورد، برنامه زیر را بنویسید و نتیجه را ببینید.
۱ ۲ ۳ | a = 3; b = a; b |
احتمالاً همانطور که دیدهاید، نتیجه ۳ خواهد بود.
در واقع باید «متغیرهای» a و b را به عنوان دو ظرف در نظر بگیرید که برچسبهای a و b دارند. در خط اول برنامه، عدد ۳ را در ظرف a قرار دادهایم و در خط بعدی محتوای ظرف a (همان ۳) را در طرف b ریختهایم. توجه کنید که در این صورت، محتوای a تغییری نمیکند. خط سوم نیز محتوای b را نمایش میدهد.
۳. عملگرهای اصلی ریاضی
برنامه زیر را اجرا کنید.
۱ ۲ ۳ | a = 3; b = 9; c = 2*a+b^2–a*b+b/a–10 |
میبینیم که خروجی ۵۳ است. سمت راست خط سوم برنامه شامل چهار عملگر اصلی ریاضی + (جمع)، – (تفریق)، * (ضرب) و / (تقسیم) است. همچنین نماد ^ به معنی «به توانِ» است؛ بنابراین، عبارت “b^2” یعنی b به توانِ ۲.
۴. مفهوم a=b (ادامه)
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ | a = 3; a = a+1; a |
خروجی این برنامه ۴ است. در خط اول، عدد ۳ به متغیر a تخصیص داده میشود. در خط دوم، ابتدا سمت راست (۴=۱+۳) محاسبه شده و بعد از آن به متغیر a تخصیص داده میشود. یعنی عدد ۴ جایگزین ۳ میشود.
۵٫ خروجی قالب بندی شده (Formatted Output)
برنامه زیر را بنویسید و اجرا کنید.
۱ | fprintf(‘Hello’) |
خروجی این کد به صورت زیر خواهد بود:
Hello
۶. خروجی قالب بندی شده
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | a = 3; b = a*a; c = a*a*a; d = sqrt(a); fprintf(‘%4u square equals %4u \r’, a, b) fprintf(‘%4u cube equals %4u \r’, a, c) fprintf(‘The square root of %2u is %6.4f \r’, a, d) |
خروجی این کد به صورت زیر خواهد بود:
۳ square equals 9
3 cube equals 27
The square root of 3 is 1.7321
دستور “fprintf” برای خروجی فرمت شده است. این خروجی در رشته اول درون این دستور در ‘…’ نوشته شده است. عبارت “۴u%” (عدد صحیح ۴ رقمی) و “۶٫۴f%” (عدد حقیقی که تا ۴ رقم اعداد نشان داده میشود) فرمت متغیرهای خروجی را نشان میدهند. دستور “sqrt” در خط چهارم برنامه تابعی است که از متغیر جذر میگیرد.
۷. آرایهها
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
۱ ۲ ۳ | a = [3 6 7]; b = [1 9 4]; c = a + b |
خروجی این برنامه به صورت زیر است:
۴ ۱۵ ۱۱
هر دو متغیر a و b آرایههایی با سه عنصر یا درایه هستند. در خط سوم، عمل “a+b” درایهها یا عناصر متناظر را با یکدیگر جمع میکند.
۸. استخراج یک عنصر از آرایه
برنامه زیر را اجرا کنید.
۱ ۲ ۳ | a = [3 6 7]; b = [1 9 4 5]; c = a(2) + b(4) |
خروجی این برنامه c = 11 است.
اگر b یک آرایه یک بعدی باشد، (b(n درایه nاُم این آرایه خواهد بود. از آنجایی (a(2 برابر با ۶ و (b(4 برابر با ۵ است، نتیجه خط سوم برنامه c=6+5 =11 خواهد بود.
۹٫ یادداشت (Comment)
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ | % % This program demonstrates how to “comment out” % a segment of code % A = 3; B = A*A; % % B = 2*B <—– This statement is not executed % C = A+B |
خروجی این برنامه c=۱۲ است. همانطور که میبینیم، بخشهایی از برنامه که قبل از آنها علامت % قرار میگیرد، تأثیری در اجرای برنامه ندارد و برای نوشتن یادداشتها و نکات مربوط به کد از آن استفاده میشود.
۱۰. ادامه کد در خط بعد
برنامه زیر را اجرا و نتیجه را بررسی کنید.
۱ ۲ | summation1 = 1 + 3 + 5 + 7 ... + ۹ + ۱۱ |
گاهی یک خط یک برنامه طولانی میشود و لازم است برای جلوگیری از بینظمی و درهمریختگی کد، بخشی از آن را به خط بعد منتقل کنیم. برای این کار از سه نقطه “…” بین دو بخش استفاده میکنیم. در حقیقت، کد بالا با کد زیر یکسان است:
۱ | summation1 = 1+3+5+7+9+11 |
۱۱. پاک کردن یک متغیر
برنامه زیر را بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ | c1 = 3; c2 = c1+5; clear c1 c1 |
با اجرای این برنامه با پیغام زیر مواجه خواهید شد:
.’Undefined function or variable ‘c1
این خطا به این دلیل است که متغیر “c1” دیگر وجود ندارد. شما با دستور “clear” این متغیر از حافظه کامپیوترتان حذف کرهاید. توجه کنید که دستور “clear” فقط محتویات متغیر را حذف نمیکند، بلکه خود متغیر را کاملاً حذف میکند. گاهی پیش میآید که برنامهای مینویسید و در آن متغیری دارید که اندازه آن بزرگ است و حافظه را اشغال میکند. با استفاده از دستور “clear” میتوانید آن را حذف کنید. اگر دستور “clear” را بنویسید و بعد از آن نام چند متغیر را (با یک فاصله از هم) بنویسید، همه آن متغیرها حذف خواهند شد. برنامهای بنویسید و این مورد را بررسی کنید.
۱۲. توابع و ثوابت ریاضی
به سادگی میتوان توابع و ثوابت معروف ریاضی را در متلب نوشت. برای مثال، برنامه زیر را بنویسید.
۱ ۲ ۳ | x = pi; y = sin(pi/2) z = exp(–sin(pi/2)) |
خروجی اجرای این برنامه y=1 و z=0.3679 است. همانطور که میبینید، میتوانیم تابعِ تابع و بیشتر از آن را نیز بنویسیم. ابتدا داخلیترین تابع محاسبه میشود و به سمت خارجیترین تابع ادامه پیدا میکند. این مورد را برای برنامه بالا بررسی کنید.
۱۳. نامگذاری یک متغیر
متغیرهای متلب نسبت بین حروف بزرگ و کوچک تمایز قائل میشوند. برای مثال “FARADARS” و “faradars” دو متغیر متفاوت هستند. در نامگذاری متغیر میتوان از زیرین خط یا آندرلاین (_) و یا اعداد نیز به عنوان بخشی از نام نیز استفاده کرد. برای مثال، “FDS_125” یک نام متغیر قابل قبول است. برخی نامها مربوط به ثوابت خاصی هستند که در متلب تعریف شدهاند و مقدار ثابتی دارند. مثلاً “pi” برابر با …۳٫۱۴۱۵۹ است.
۱۴. رسم سریع یک نمودار
برنامه زیر را بنویسید و نتیجه اجرای آن را ببینید.
۱ ۲ ۳ | x = [0:0.1:20]; y = sin(x); plot(x,y) |
خروجی این برنامه شکل زیر است:
خط اول برنامه معادل با بردار [x=[0 0.1 0.2 0.3 … ۱۹٫۸ ۱۹٫۹ ۲۰ است. به این ترتیب، این آرایه ۱۰۱ عنصر دارد. به عبارت دیگر، “۰:۰٫۱:۲۰” به این معنی است که این آرایه از عدد ۰ شروع شده و در هر گام به اندازه مجموع عدد قبلی و ۰٫۱ یک عدد تولید میکند تا به انتهای بازه، یعنی ۲۰، برسد. خط دوم برنامه آرایه 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
برنامه زیر را بنویسید و نتیجه را ببینید.
۱ ۲ ۳ ۴ | b = 3; for k = 1:5 b end |
نتیجه به صورت زیر خواهد بود:
۳
۳
۳
۳
۳
سه خط آخر برنامه بالا یک «حلقه for» را تشکیل میدهند. عبارت اصلی بین دو بخش “for k=1:5” و “end” قرار گرفته و وقتی متغیر k با گام ۱ از ۱ تا ۵ تغییر میکند، عدد مورد نظر ۵ بار تکرار میشود.
۱۶. حلقه for (استفاده از اندیس در محاسبات)
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ | b = 3; for k = 1:5 b^k end |
خروجی این برنامه به صورت زیر است:
۳
۹
۲۷
۸۱
۲۴۳
این خروجیها به صورت ۱^۳، ۲^۳، ۳^۳، ۴^۳ و ۵^۳ محاسبه شدهاند. همانطور که میبینیم، در هر تکرار، مقدار k تغییر میکند و مقدار متناظر با هر تکرار برای محاسبه به کار میرود.
۱۷. حلقه for (تأثیر بیش از یک متغیر در عبارت)
برنامه زیر را اجرا کنید.
۱ ۲ ۳ ۴ ۵ | sum1 = 0; for k = 1:9 sum1 = sum1+k; end sum1 |
خروجی این برنامه ۴۵ است. در واقع، این عدد به صورت ۹+۸+۷+۶+۵+۴+۳+۲+۱ محاسبه شده است. سعی کنید این برنامه را با توجه به مواردی که در بالا یاد گرفتهاید تحلیل کنید.
۱۸. حلقه for (تأثیر بیش از یک متغیر در عبارت)
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ | for k = 1:2:9 sum1 = sum1+k; end sum1 |
خروجی این برنامه ۲۵ است که از مجموع ۹+۷+۵+۳+۱ به دست آمده است. دستور “for k = 1:2:9” به این معنی است که فقط ۵ بار در حلقه حرکت میکنیم. ابتدا ۱=k است. در تکرار بعدی ۲+۱=k خواهد بود و به همین ترتیب ادامه مییابد تا به ۹ برسد.
۱۹. کار با آرایه در حلقه
برنامه زیر را بنویسید.
۱ ۲ ۳ ۴ ۵ ۶ | b = [3 8 9 4 7 5]; sum1 = 0; for k = 1:4 sum1 = sum1+b(k); end sum1 |
خروجی این کد ۲۴ است که به صورت زیر محاسبه شده است:
sum1 = b(1)+b(2)+b(3)+b(4) = 3+8+9+4 = 24
۲۰. کار با آرایه در حلقه
برنامه زیر را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ | b = [3 8 9 4 7 5]; sum1 = 0; for k = 1:2:5 sum1 = sum1+b(k); end sum1 |
خروجی این برنامه عدد ۱۹ است و به صورت زیر محاسبه شده است:
sum1 = b(1)+b(3)+b(5) = 3+9+7 = 19
۲۱. حلقه دوگانه
برنامه زیر را اجرا کنید و با توجه به نکاتی که آموختهاید سعی کنید آن را تحلیل کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | sum1 = 0; for n = 1:2 for m = 1:3 sum1 = sum1+n*m; end end sum1 |
خروجی این برنامه ۱۸ است و به صورت زیر محاسبه میشود:
Sum1 = 1*1+1*2+1*3 +2*1+2*2+2*3 = 18
۲۲. حلقه دوگانه
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ ۵ | for n = 1:2 for m = 1:3 fprintf(‘n = %3u m = %3u \r’, n, m) end end |
خروجی این برنامه به صورت زیر است:
n = 1 m = 1
n = 1 m = 2
n = 1 m = 3
n = 2 m = 1
n = 2 m = 2
n = 2 m = 3
۲۳. استفاده پیچیدهتر از حلقه و اندیس
برنامه زیر را بنویسید و آن را تحلیل کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | b = [2 5 7 4 9 8 3]; c = [2 3 5 7]; sum1 = 0; for k = 1:4 sum1 = sum1+b(c(k)); end sum1 |
خروجی این برنامه ۲۴ است و طبق رابطه زیر محاسبه میشود:
((sum1 = b(c(1))+b(c(2))+b(c(3))+b(c(4
(b(2)+b(3)+b(5)+b(7 =
۵+۷+۹+۳ =
۲۴ =
بخش سوم: شاخهگزینی و شروط
در این بخش چگونگی تعریف شروط در برنامه را معرفی میکنیم.
۲۴. دستور if
برنامه زیر را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ | num1 = 7; if (num1 > 5) fprintf(‘%4u is greater than 5 \r’, num1) else fprintf(‘%4u is less than or equal to 5 \r’, num1) end |
خروجی این کد به صورت زیر نمایش داده میشود:
7 is greater than 5
اگر در برنامه تغییر ایجاد کرده و عبارت “;num1=3” را جایگزین خط اول کنیم، خروجی به صورت زیر نمایش داده میشود:
3 is less than or equal to 5
همانطور که متوجه شدهاید، در این برنامه، اگر num1 بزرگتر از ۵ باشد، عبارت “(fprintf(‘%۴u is greater than 5 \r’, num1” اجرا میشود، و در غیر این صورت، کد “(fprintf(‘%۴u is less than or equal to 5 \r’, num1” اجرا خواهد شد.
۲۵. دستور if – elseif – else
برنامه زیر را بنویسید و آن را اجرا کرده و نتیجه را تحلیل کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ | num1 = 4; if (num1 >= 5) fprintf(‘%4i is greater than or equal to 5 \r’, num1) elseif (num1 > 1) fprintf(‘%4i is less than 5 but greater than 1 \r’, num1) elseif (num1 == 1) fprintf(‘%4i equals 1 \r’, num1) elseif (num1 > –3) fprintf(‘%4i is less than 1 but greater than -3 \r’, num1) else fprintf(‘%4i is less than or equal to -3 \r’, num1) end |
۲۶. مثال محاسبه سال کبیسه
در اینجا با استفاده از برنامهنویسی متلب یک مثال کاربردی را حل میکنیم. میخواهیم برنامهای بنویسیم که تعیین کند یک سال میلادی مشخص کبیسه است یا خیر. برنامه زیر را بررسی کنید. در تقویم میلادی نو سالهایی که بر ۴ بخشپذیر باشند (باقیماندهٔ تقسیم آن سال بر ۴ برابر ۰ باشد) کبیسه هستند، با این استثنا که از میان سالهایی که بر ۱۰۰ بخشپذیرند (سالهای انتهای سده)، تنها آنهایی که بر ۴۰۰ نیز بخشپذیرند کبیسه هستند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ | nyear = 1975; if (mod(nyear, 400) == 0) fprintf(‘%6u is a leap year’, nyear) elseif (mod(nyear,4) == 0) & (mod(nyear,100) ~= 0) fprintf(‘%6u is a leap year’, nyear) else fprintf(‘%6u is not a leap year’, nyear) end |
خروجی برنامه بالا به صورت زیر است:
1975 is not a leap year
سعی کنید سالهای مختلف را در برنامه وارد کرده و نتایج را بررسی کنید.
در خط چهارم برنامه، “&” به معنی «وَ» است. بنابراین، هر دو شرط “(mod(nyaer,4) == 0)” و “(mod(nyear,100) ~= 0)” باید صحیح باشند تا دستور “(fprintf(‘%۶u 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 است. این تابع در بسیاری از کاربردهای مربوط به روشهای عددی مفید است.
۲۷. ترکیب حلقه و شرط
برنامه زیر را در متلب بنویسید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ | sum1 = 0; sum2 = 0; N = 9 for k = 1:N sum1 = sum1+k; if (mod(k,3) == 0) sum2 = sum2+k; end end sum1 sum2 |
اگر این برنامه را اجرا کنید، خروجی به صورت زیر خواهد بود:
sum1 = 45
sum2 = 18
با تحلیل این برنامه خواهید دید که خروجیها به صورت زیر محاسبه شدهاند:
Sum1 = 1+2+3+4+5+6+7+8+9
sum2 = 3+6+9
۲۸. حلقه while
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ ۵ | x = 3; while (x < 100) x = x*3; end x |
خروجی این برنامه x = 243 است. اگر به مفهوم while دقت کنیم، میبینیم که ترکیبی از یک حلقه for و یک if است. در برنامه بالا، تا زمانی که شرط داخل پرانتز (x<100) برقرار باشد، محاسبه در حلقه انجام خواهد شد. بنابراین، مقادیر ۳، ۹، ۲۷، ۸۱ و در نهایت ۲۴۳ برای x محاسبه میشود و چون ۲۴۳ بزرگتر از ۱۰۰ است و دیگر شرط برقرار نیست، محاسبات ادامه پیدا نمیکند.
بخش چهارم: آرایه و ماتریس
در این بخش، با نحوه کار کردن با ماتریسها و آرایهها آشنا میشویم.
۲۹. جمع دو آرایه
برنامه زیر، جمع دو آرایه را نشان میدهد.
۱ ۲ ۳ | a = [2 12 25]; b = [3 7 4]; c = a+b |
خروجی این برنامه به صورت زیر است:
c = 5 19 29
۳۰. جمع دو ماتریس
دو ماتریس را به صورت زیر جمع کنید و نتیجه را ببینید.
۱ ۲ ۳ | a = [3 4; 1 6]; b = [5 2; 11 7]; c = a+b |
خروجی کد بالا به صورت زیر است:
c = 8 6
۱۲ ۱۳
این برنامه، در حقیقت، عملیات زیر را انجام میدهد:
a=[3416],b=[52117]c=a+b=[861213]
۳۱. ضرب یک عدد در آرایه یا ماتریس
برنامه زیر را بنویسید و خروجی آن را بررسی کنید.
۱ ۲ | a = [3 5; 1 4]; b = 2*a |
خروجی این برنامه به صورت زیر است:
b = 6 10
۲ ۸
۳۲. ضرب درایه به درایه دو آرایه یا دو ماتریس با ابعاد مشابه
برنامه زیر را بنویسید و آن را اجرا کنید.
۱ ۲ ۳ | a = [2 3 5]; b = [2 4 9]; c = a.*b |
خروجی این برنامه به صورت زیر است:
c = 4 12 45
نقطه (.) قبل از عملگر ریاضی “*” عملیات را به صورت درایه به درایه انجام میدهد. در این حالت، c به صورت زیر محاسبه خواهد شد:
[(c = [a(1)*b(1) a(2)*b(2) a(3)*b(3
۳۳. ضرب درایه به درایه دو ماتریس
برنامه زیر را در متلب اجرا کنید:
۱ ۲ ۳ | a = [2 3; 1 4]; b = [5 1; 7 2]; c = a.*b |
همانطور که انتظار دارید، خروجی این برنامه برابر است با:
c = 10 3
۷ ۸
۳۴. ضرب مستقیم دو ماتریس (نه درایه به درایه)
برنامه زیر را در متلب بنویسید و به تفاوت آن با مثال قبل دقت کنید.
۱ ۲ ۳ | a = [2 3; 1 4]; b = [5 1; 7 2]; c = a*b |
خروجی برنامه به صورت زیر است:
c = 31 8
۳۳ ۹
مشاهده میکنیم که خروجی این مثال با خروجی مثال قبل تفاوت دارد. در واقع، در این مثال، ضرب ماتریسی انجام شده است.
۳۵. توابع پایه با یک متغیر برداری
برنامه زیر را اجرا کنید.
۱ ۲ | a = [2 3 5]; b = sin(a) |
خروجی این برنامه به صورت زیر است:
b = 0.9092 ۰٫۱۴۱۱ -۰٫۹۵۸۹
همانطور که میبینیم، خروجی برای هر درایه ورودی محاسبه شده و محتوای b به صورت زیر است:
[(sin(2) sin(3) sin(5]
۳۶. مثالی دیگر از توابع پایه با یک متغیر برداری
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ | a = [2 3 5]; b = 2*a.^2+3*a+4 |
خروجی برنامه برابر است با:
b = 18 ۳۱ ۶۹
این خروجی به صورت زیر محاسبه شده است:
[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
۳۷. تعیین محتوای یک آرایه
برای آنکه محتوا و داریههای یک آرایه را تعیین کنیم، میتوانیم مشابه مثال زیر عمل نماییم.
۱ ۲ | a = [0:0.5:4]; a |
اگر برنامه بالا را اجرا کنید، خواهید دید که خروجی آن به صورت زیر خواهد بود:
a = 0 ۰٫۵ ۱ ۱٫۵ ۲ ۲٫۵ ۳ ۳٫۵ ۴
۳۸. استخراج داریه از ماتریس
برنامه زیر را بنویسید و اجرا کنید.
۱ ۲ | A = [3 5; 2 4]; c = 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
۳۹. مثالی از استفاده از اندیس برای یک ماتریس
برنامه زیر را بنویسید و سعی کنید با توجه به مطالبی که گفته شد، خط به خط آن را بررسی و تحلیل کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ | A = [3 5; 2 4]; norm1 = 0; for m = 1:2 for n = 1:2 norm1 = norm1+A(m,n)^2; end end norm1 = sqrt(norm1) |
خروجی این برنامه به صورت زیر است:
norm1 = 7.348
این برنامه نُرم اقلیدسی یک ماتریس را محاسبه میکند.
۴۰. حل دستگاه معادلات خطی
برنامه زیر را اجرا کنید.
۱ ۲ ۳ | A = [4 1 2; 0 3 1; 0 1 2]; b = [17 ; 19 ; 13]; x = inv(A)*b |
نتیجه حاصل از این برنامه به صورت زیر است:
x = ۱
۵
۴
این برنامه، معادله [A]x=b را حل میکند و پاسخ آن برابر است با: x=[A]−۱b.
۴۱. حل دستگاه معادلات خطی
برنامه زیر را بنویسید و اجرا کنید:
۱ ۲ ۳ | A = [4 1 2; 0 3 1; 0 1 2]; b = [17 ; 19 ; 13]; x = A\b |
خروجی این برنامه مشابه مثال قبل است. در اینجا “A\b” معادل همان ” inv(A)*b” است.
بخش پنجم: رسم نمودار
روشهای رسم نمودار در این بخش ارائه شده است.
۴۲. یک مثال ساده از دستور plot
برنامه زیر را در متلب اجرا کنید:
۱ ۲ ۳ | a = [0:0.5:5]; b = 2*a.^2 + 3*a –5; plot(a,b) |
نتیجه اجرای این برنامه شکل زیر خواهد بود:
در دستور “(plot(a,b” آرایه “a” باید شامل دادههای محوری باشد که میخواهیم نمودار را بر حسب آن رسم کنیم (متناظر با محور x). آرایه “b” نیز باید متناظر با مقادیر محور y باشد.
بعد از آنکه نمودار را رسم کردیم، میتوانیم با ابزارهای تعاملی متلب آن را اصلاح کنیم. برای مثال، میتوانیم برچسب (نام) محورهای x و y را به صورت دستی به نمودار اضافه کنیم. همچنین میتوانیم نمودار را =با فرمتهای مختلف (مانند tif ،jpg ،eps و..) ذخیره کنیم.
۴۳. تعیین مشخصات یک شکل: الگو، رنگ و ضخامت خط
برنامه زیر را اجرا و نتیجه را مشاهده کنید.
۱ ۲ ۳ ۴ | a = [0:0.5:5]; b = 2*a.^2 + 3*a –5; plot(a,b,‘-or’,‘MarkerFaceColor’,‘g’,‘LineWidth’,2) xlabel(‘X’); ylabel(‘Y’); legend(‘Test’,‘Location’,‘NorthWest’) |
نتیجه اجرای برنامه بالا شکل زیر خواهد بود:
عبارت ‘or-‘ در دستور plot الگوی خط را تعیین کرده است. این عبارت منجر به خط ممتد با ترکیب نمادهای دایرهای شده است. رنگ این دایرهها سبز است. دلیل وجود این رنگ، نوشتن عبارت ‘g’ برای ‘MarkerFaceColor’ است. شرح یا همان legend نمودار نیز در گوشه بالایی سمت چپ قاب تصویر نوشته شده است. این کار با اختصاص ‘NorthWest’ برای ‘Location’ ایجاد شده است.
۴۴. رسم چند نمودار
برنامه زیر را بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | a = [0:0.5:5]; b = 2*a.^2 + 3*a –5; c = 1.2*a.^2+4*a–3; hold on plot(a,b,‘-or’,‘MarkerFaceColor’,‘g’,‘LineWidth’,2) plot(a,c,‘–ok’,‘MarkerFaceColor’,‘c’,‘LineWidth’,2) xlabel(‘X’); ylabel(‘Y’); legend(‘Curve 1’,‘Curve 2’,‘Location’,‘NorthWest’) |
خروجی این برنامه، نمودار زیر است:
در برنامه بالا، اگر از دستور “hold on” استفاده نکنیم، دستور plot دوم در خط بعد، در قاب نمودار قبلی رسم میشود و نمودار قبلی را حذف میکند.
۴۵. رسم نمادها
دستورات زیر را بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | = [۰:۰٫۵:۵]; b = 2*a.^2 + 3*a –5; c = 1.2*a.^2+4*a–3; hold on plot(a,b,‘or’,‘MarkerFaceColor’,‘g’,‘LineWidth’,2) plot(a,c,‘ok’,‘MarkerFaceColor’,‘c’,‘LineWidth’,2) xlabel(‘X’); ylabel(‘Y’); legend(‘Curve 1’,‘Curve 2’,‘Location’,‘NorthWest’) |
خروجی این برنامه شکل زیر است:
۴۶. رسم چند قاب نمودار در یک تصویر
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ | a = [0:0.5:5]; b = 2*a.^2 + 3*a –5; c = 1.2*a.^2+4*a–3; subplot(1,2,1) plot(a,b,‘-or’,‘MarkerFaceColor’,‘g’,‘LineWidth’,2) xlabel(‘X’); ylabel(‘Y’); legend(‘Curve ‘,‘Location’,‘NorthWest’) subplot(1,2,2) plot(a,c,‘–ok’,‘MarkerFaceColor’,‘c’,‘LineWidth’,2) xlabel(‘X’); ylabel(‘Y’); legend(‘Curve 2’,‘Location’,‘NorthWest’) |
شکل حاصل از اجرای این برنامه به صورت زیر خواهد بود:
بخش ششم: تابع تعریف شده توسط کاربر
در این بخش، روشهای تعریف توابعی را که میتوانید برحسب نیازتان تعریف کنید و در توابع متلب وجود ندارند معرفی میکنیم.
۴۷. چگونه یک تابع را تشکیل دهیم و از آن استفاده کنیم؟
ابتدا، یک برنامه متلب (New Script) را باز میکنیم. برای مثال، نام آن را myfunc1 قرار میدهیم و آن را با پسوند myfunc1.m ذخیره میکنیم. فرض کنید میخواهیم تابع f(x)=2×2+3x+7 را تعریف کنیم. این تابع به صورت زیر در متلب نوشته میشود:
۱ ۲ | function outcome = myfunc1(x) outcome = 2*x^2 + 3*x + 7; |
متغیر “outcome” متغیری است که خودمان آن را تعریف کردهایم و از آن برای برقراری رابطه با پارامتر ورودی “x” استفاده میکنیم. بعد از آنکه تابع مورد نظر را تعریف کردیم، میتوانیم در برنامهها یا توابع دیگری که مینویسیم آن را فراخوانی کنیم. برای مثال، فرض کنید برنامهای با نام mainprog1.m به صورت زیر نوشتهایم:
۱ ۲ ۳ ۴ ۵ | for n = 1:5 x = n*0.1; z = myfunc1(x); fprintf(‘x = %4.2f f(x) = %8.4f \r’,x,z) end |
خروجی این برنامه به صورت زیر است:
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 در نظر بگیرید که به صورت زیر است:
۱ ۲ | function outcome = myfunc2(x,a,b,c) outcome = a*x^2 + b*x + c; |
همانطور که دریافتهاید، این برنامه تابع f(x)=ax2+bx+c را تعریف میکند که ورودیهای آن، b ،a ،x و c هستند.
این تابع را در برنامه دیگری با نام mainprog2.m به کار میبریم:
۱ ۲ ۳ ۴ ۵ | for n = 1:5 x = n*0.1; z = myfunc2(x,2,3,7); fprintf(‘x = %4.2f f(x) = %8.4f \r’,x,z) end |
خروجی برنامه اخیر به صورت زیر است:
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
بخش هفتم: استفاده از فایلها و دستورهای خارجی برای ورودی و خروجی
در این بخش شیوه استفاده از فایلها و دستورات ورودی خارج از برنامه را بیان میکنیم. همچنین نحوه ایجاد فایلها و دستورات در خروجی را بیان خواهیم کرد.
۴۹. باز کردن یک فایل و نوشتن خروجی در آن
برنامه زیر را بنویسید و نتیجه آن را ببینید:
۱ ۲ ۳ ۴ ۵ | fID1 = fopen(‘myoutput1.txt’,‘w’); for n = 1:4 b1 = n ; b2 = n^2 ; b3 = n^3; fprintf(fID1,‘%7u %7u %7u \r’,b1,b2,b3); end |
این برنامه خروجی خاصی که مانند مثالهای قبل قابل رؤیت باشد تولید نمیکند. اما فایلی با نام “myoutput.txt” ایجاد میکند (در همان جایی که متلب ذخیره شده است). محتوای این فایل به صورت زیر است:
۱ ۱ ۱
۲ ۴ ۸
۳ ۹ ۲۷
۴ ۱۶ ۶۴
خط اول برنامه فایلی به نام ‘myoutput1.txt’ را باز میکند و نوع “W” به این معنی است که این فایل “write only” است. پس از اجزای فرمان، متلب یک فایل ID یا شناسه را انتخاب خواهد کرد (که یک عدد است) و آن را در متغیر fID1 قرار خواهد داد. کاربر نیازی به دانستن آن عدد ندارد، اما اگر یک خروجی برای آن فایل باشد، باید از آن به عنوان شناسه استفاده شود.
دستور “(fprintf(fID1,’%۷u %7u %7u \r’,b1,b2,b3” خروجی را به فایلی با ID یا شناسه fID1 هدایت میکند.اگر ID فایل داده نشده باشد، فرمان کوتاه “(fprintf(‘%۷u %7u %7u \r’,b1,b2,b3” خروجی را در مکان پیشفرض نشان خواهد داد.
۵۰. خواندن داده از یک فایل موجود
برنامه زیر را در متلب بنویسید و آن را اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ | fID1 = fopen(‘myoutput1.txt’,‘r’); for n = 1:4 b = fscanf(fID1,‘%7u %7u %7u \r’,3); btotal = b(1)+b(2)+b(3); fprintf(‘%7u + %7u + %7u = %7u \r’, b(1), b(2), b(3), btotal) end |
آموزش متلب نتیجه این کد به صورت زیر است:
۱ + ۱ + ۱ = ۳
۲ + ۴ + ۸ = ۱۴
۳ + ۹ + ۲۷ = ۳۹
۴ + ۱۶ + ۶۴ = ۸۴
فرض میکنیم فایل “myoutput1.txt” قبلاً توسط برنامه بخش ۴۹ ایجاد شده است و به صورت صحیح در همان جایی که برنامه متلب را اجرا میکنیم ذخیره شده است. دستور نخست کد بالا، فایل “myoutput1.txt” را با وضعیت تعیین شده “r” به معنای “read only” باز میکند. دستور “(b = fscanf(fID1,’%۷u%7u %7u \r’,۳” یک رکورد را از فایل خارجی با ID=ID1 با استفاده از فرمت ‘%۷u %7u %7u \r’ میخواند. عدد “۳” بعد از این عبارت مشخص میکند که فقط ۳ عنصر اول این رکورد خوانده شده و در آرایه “b” قرار داده میشوند.
۵۱. ایجاد خط فرمان برای وارد کردن ورودی توسط کاربر
برناامه زیر را بنویسید و اجرا کنید.
۱ ۲ ۳ ۴ ۵ ۶ | num1 = input(‘Enter your age’); if (num1 > 17) fprintf(‘You are eligible to vote’) else fprintf(‘You are not eligible to vote’) end |
برنامه بالا حالتی خاصی از وقتی است که ورودی از یک فایل خارجی خوانده نمیشود، بلکه توسط کاربر و با یک خط فرمان وارد میشود. خروجی برنامه بالا به عددی بستگی دارد که کاربر وارد میکند (در متغیر “num1” ذخیره میگردد) که بزرگتر از ۱۷ است یا کوچکتر از آن.
اگر بخواهیم ورودی یک رشته باشد (مثلاً “YES” یا “Fara Dars”)، باید از گزینه “s” استفاده کرده و آن را به دستور اضافه کنیم. برای مثال “(‘name1 = input(‘Enter your surname’, ‘s”.
دیدگاه ها