MatlabTips
892 subscribers
463 photos
73 videos
54 files
304 links
آموزش MATLAB با "استفاده از ویدئو و متن" در سطوح مبتدی تا پیشرفته
پاسخ به سوالات تخصصی:
@roholazandie
Download Telegram
🔵جبر خطی را به MATLAB بیاورید🔵
پیش‌نیاز: مقدمات جبر خطی، مقدمات برنامه نویسی
سطح پیچیدگی:🌕🌑🌑🌑🌑

برای بسیاری از شما پیش آمده است که فرمولی در یک مقاله دیده اید و فهمیده اید(یا حتی نفهمیده اید) اما وقتی می خواهید آن را پیاده سازی کنید ایده ای ندارید. در نهایت با 5 یا 6 حلقه تو در تو برنامه را می نویسید که نه تنها فهم آن سخت است بلکه عیب یابی آن شما را به حد عصبانیت می رساند. مهم ترین دلیل این اتفاق این است که شما فرمول را به درستی به متلب وارد نکرده اید. متلب یک زبان برنامه نویسی مبتنی بر ماتریس هاست بنابراین شما هم باید از امکانات آن استفاده کنید. در غیر این صورت برنامه را با زبان های دیگر می نوشتید. در این سری قصد داریم کمی دقیق تر به متغیر های متلب نگاه کنیم و با مثال همه ی زوایای پنهان متغیرها که بسیار کاربردی هستند را روشن کنیم.
در ریاضی خوانده ایم که حداقل سه نوع متغیر داریم: اسکالر(یک متغیر تک)، بردار(سطری و ستونی) و ماتریس. در MATLAB هم دقیقا همین ها را داریم:

a=3%scalar
x=[1,2,3]% row vector
y=[1;2;3]% column vector
A=[1,2,3;4,5,6]% matrix


به طور کلی وقتی MATLAB بر روی موجودیت دوست داشتنی اش یعنی ماتریس عمل می کند بر روی همه ی اعضای آن عمل می کند و دقیقا همین باعث قدرتمند بودن آن می شود.
حالا حالت های مختلف ضرب را بررسی می کنیم: (در نماد گذاری زیر حروف a,b,c نشان دهنده اسکالر، x نشان دهنده بردار و X نشان دهنده ماتریس است. همچنین سمت چپ فلش نماد ریاضی و سمت راست سینتکس معادل در MATLAB را نشان می دهد)
1- ضرب یک اسکالر(یک متغیر عددی) در اسکالر، بردار و ماتریس:
برنامهMATLAB زیر یک نمونه از این حالات را به ترتیب نشان می دهد:

a = 3;
b = 4;
a * b %scalar by scalar

a = 3;
x = [1, 3, 7];
a * x %scalar by vector

a = 3;
X = [1, 2 ,4 ;5, 2, 3];
a * X %scalar by matrix



1- ضرب بردار در بردار: دو حالت ممکن برای ضرب دو بردار در هم وجود دارد. در حالت اول یک بردار ستونی(N*1) یعنی x در یک بردار سطری ( 1*M) یعنی y ضرب شده و نتیجه یک ماتریس است:
کد MATLAB زیر یک نمونه از این حالت را نشان می دهد:

x = [5, 2, 4];%row vector
y = [3; 1; 2];%column vector

x * y %dot product
y * x %produce a 3*3 matrix


3- ضرب ماتریس در بردار: اگر اندازه های ماتریس و بردار با هم سازگار باشد قابل ضرب کردن هستند. به طور مثال ماتریس N*M یعنی A در یک بردار ستونی M*1 یعنی x ضرب شده است و نتیجه یک بردار ستونی N*1 است:
کد MATLAB زیر یک مثال از این حالت را نشان می دهند:

A = [5, 2, 4; 2, 4, 5];%2*3 matrix
x = [4; 2; 3];%3*1 column vector
A * x %2*1 matrix


4- ضرب ماتریس در ماتریس: در نهایت اگر اندازه های دو ماتریس با هم سازگار باشد قابل ضرب در هم هستند. به طور مثال دو ماتریس با اندازه های N*M و M*P به صورت زیر قابل ضرب در هم هستند:
برنامه زیر یک نمونه را نشان می دهد:

A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9, 1; 1, 8, 8, 10; 2, 4, 3, 2];%3*4 matrix

A * B %2*4 matrix

عملیات بر روی ماتریس ها هم قدم مهمی در نوشتن فرمول های پیچیده است. اولین عمل، عمل های نقطه ای هستند. به آن ها نقطه ای گفته می شوند چراکه در MATLAB همراه با یک نقطه ظاهر می شوند. در این نوع عملیات ماتریس ها و بردار ها عنصر به عنصر بر روی هم عمل می کنند به طور مثال اگر بخواهیم دو بردار زیر به صورت عنصر به عنصر در هم ضرب شوند باید نوشت:

x = [5, 2, 4];
y = [3, 2, 9];

x .* y


همچنین برای ضرب عنصر به عنصر دو ماتریس به صورت زیر عمل می کنیم:

A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9; 1, 8, 8];%2*3 matrix

A .* B %3*3 matrix elementwise product


توجه کنید به جای ضرب می توان عملیات دوتایی دیگر مانند توان(^)، تقسیم(/) هم استفاده کرد:

A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9; 1, 8, 8];%2*3 matrix

A .^ B %3*3 matrix elementwise pow

مورد دوم که ممکن است برای شما قدری عجیب تر باشد حالتی است که در آن یک عدد(اسکالر) به توان یک ماتریس(یا بردار) برسد. در این حالت نتیجه به صورت یک ماتریس(یا بردار) است که هر عضو آن آن عدد به توان عنصر متناظر در ماتریس اولیه است. برای فهم موضوع مثال زیر را در نظر بگیرید:

a = 2; %scalar
X = [3, 2, 9; 1, 8, 8];%2*3 matrix

a .^ X %3*3 matrix


@MatlabTips
#Linear_algebra

نویسنده:(A-2)
🔵تاریخچه‌ای کوتاه از MATLAB🔵
پیش‌نیاز: (پیش‌نیاز ندارد)
سطح پیچیدگی:🌒🌑🌑🌑🌑

نرم افزار MATLAB یک زبان برنامه‌نویسی سطح بالا و یک محیط محاسباتی برای مسائل مهندسی و ریاضی است. شالوده و ایده اصلی این نرم‌افزار برای اولین بار توسط آقای کلو مولر (Cleve Moler) در اواخر 1970 شکل گرفت که با هدف دسترسی به پکیج‌های نرم‌افزاری جبرخطی در فورترن (Fortran) بود. نام این نرم‌افزار تلفیق MATrix LABoratory می‌باشد که از جبر خطی منشا یافته است. از آن زمان به بعد MATLAB به عنوان یک ابزار فوق‌العاده برای تست و پیاده‌سازی ایده‌های جدید استفاده می‌شود. این نرم‌افزار دارای قابلیت‌های بی‌نظیر گرافیکی است و نحو (syntax) آن بسادگی قابل درک است. البته قابلیت‌های دیگری چون ODE-solvers، دیالوگ باکس‌ها و دستوراتی برای ساخت GUI(بخوانید "گویی") نیز دارد که کمتر متداول است. همچنین با استفاده از این نرم افزار قادر خواهید بود دستورات به زبان C یا Fortran بنویسید که MATLAB می تواند آن را تفسیر (interpret)کند. برای فهمیدن تمام این ویژگی‌ها ابتدا لازم است که یک آشنایی مقدماتی با دستورات ابتدایی MATLAB داشته باشید.
@MatlabTips
#History
نویسنده : (A-1)
🔵توجه🔵

ممکن است پیام‌های متنی که در کانال گذاشته می‌شود بر روی گوشی‌های شما دچار اشکال شود و کلمات انلگیسی و فارسی جابه جا شوند. در اینصورت سعی کنید از روی لپ‌تاپ یا کامپیوتر رومیزی خود استفاده کنید.
@MatlabTips
#Caution
نویسنده : (A-1)
بازی زندگی (game of life)
پیش نیاز:( آشنایی مقدماتی با برنامه نویسی متلب)
سطح پیچیدگی: 🌕🌕🌑🌑🌑


"بازی زندگی" یک مدل ریاضی است که توسط جان کانوی ریاضیدان بریتانیایی اختراع شده است. بازی زندگی یک بازی است که بازیگری ندارد و شرایط آن را وضعیت اولیه مهره ها تعیین می کنند.
جهان در بازی زندگی یک صفحه مشبک دو بعدی است و موجودات این جهان خانه هایی اند که سیاه رنگ اند. زمان این جهان گسسته است و هر نسل از نسل قبل به وجود می آید. در هر قدم سرنوشت هر فرد توسط افراد دور و برش تعیین می شود. تنها 4 قاعده ساده زیر بر این جهان حکمفرماست:
1- هر سلول زنده اگر کمتر از دو نفر در اطرافش باشد از تنهایی میمیرد!
2- هر سلول زنده اگر دو یا سه نفر اطرافش باشد به نسل بعد منتقل می شود.
3- اگر سلول زنده ای بیشتر از 3 نفر در اطرافش باشد از کمبود امکانات و جمعیت زیاد می میرد!
4- هر سلول با دقیقا 3 نفر در اطرافش یک سلول جدید را بوجود می آورد: تولید نسل جدید!
شاید این قواعد ساده به نظر برسد اما همین قوانین به ظاهر ساده الگو های عجیبی را به نمایش می گذارند. پیچیدگی رفتار این سلول ها به حدی زیاد است که بسیاری از باور های پذیرفته شده علمی را به زیر سوال می برد. مهمترین اصلی که بسیار شهودی هم به نظر می رسد وجود یک ناظم یا مدیر برای ایجاد و نگهداری رفتار های پیچیده است. در بازی زندگی پیچیدگی به صورت خود سازمانده(self organized) از درون سادگی به وجود می آید و فرگشت می یابد. دنیل دنت فیلسوف و متخصص علوم شناختی "بازی زندگی" را مثالی از ایجاد ساخت های پیچیده مانند "آگاهی" و "اراده آزاد"(اختیار) از قوانین نسبتا ساده فیزیکی و اندر کنش آن ها به هم می داند.

حالا چگونه این برنامه را پیاده سازی کنیم. اولین نکته آن است که می توان چهار قاعده بالا را به یک قاعده زیر ساده کرد:
"یک سلول زنده با دو همسایه زنده، یا هر سلولی با سه همسایه زنده و در نسل بعد زنده است و در غیر این صورت زنده نیست"
این جمله را می توان به صورت زیر برنامه نویسی کرد:

GRID = neighbours==3 | GRID & neighbours==2;

( به نحوه ی ارتباط آن ها فکر کنید!)

که در آن GRID همان مشبک جهان ماست و neighbours همسایه های هر خانه است.
این بازی به قدری ساده است که شما به راحتی می توانید آن را پیاده سازی کنید. در زیر یک نمونه از برنامه برای بازی زندگی را می بینید:

len = 300;%size of the world
GRID = int8(rand(len,len));
up = [2:len 1];
down = [len 1:len-1]; %the world is round
colormap([0,0,0;0,1,0]);
for i=1:100
neighbours = GRID(up,:) + GRID(down,:) + GRID(:,up) + GRID(:,down) ...
+ GRID(up,up) + GRID(up,down) + GRID(down,up) + GRID(down,down);
GRID = neighbours==3 | GRID & neighbours==2;
image(GRID*30);
pause(0.02);
end


خود متلب هم به صورت آماده این برنامه را پیاده سازی کرده است که با زدن life در خط فرمان می توانید آن را ببینید.(در easter egg های آن)
هر اجرای برنامه یک جهان می سازد. این جهان با تعدادی سلول(افراد) به صورت تصادفی آغاز می شود و ادامه می یابد: سلول ها با هم ترکیب شده و فرزندان جدیدی بوجود می آورند. برخی از قحطی از بین می روند و برخی از آن ها شروع به "مهاجرت" می کنند. الگوهای زیادی در بازی زندگی کشف شده اند. یکی از جالب ترین آن ها الگوی جنگ و فرار است که در آن دو طرف به سمت هم شلیک کرده و تعدادی از سلول ها به صورت زیر فرار می کنند. شکل زیر این الگو را نشان می دهد:

#Game_of_life
#Easter_egg

نویسنده: (A-2)
🔵متغیرهای global 🔵
پیش‌نیاز: (آشنایی با متغیر global)
سطح پیچیدگی:🌕🌑🌑🌑🌑

اگرچه استفاده از متغیرهای Globlal برای عملکرد برنامه بسیار مفید است، اما معایبی نیز دارد که در این پست به تعدادی از آنها اشاره می‌کنیم:
1⃣استفاده از متغیرهای Global به عنوان یک عادت بد برنامه‌نویسی تلقی می‌شود. این متغیرها مشکلاتی برای نگهداری کد ایجاد و خطایابی کد را مشکل می‌کنند. پس هنگام استفاده از آنها باید بسیار دقت کرد.

2⃣به جای اینکه متغیرهایی را به عنوان ورودی به توابع پاس دهیم می‌توان از متغیرهای Global استفاده کرد. این کار عملکرد کد را به قیمت خوانایی و نگهداری کد بهبود می‌دهد.

3⃣هنگام تعریف یک متغیر Global باید از دستور global استفاده کنیم. بماند که این کار چقدر خسته‌کننده خواهد شد، اگر هم زمانی یک متغیر Global تعریف کنید و فراموشتان شود که از دستور global استفاده کنید، MATLAB بصورت خودکار آن را بصورت یک متغیر محلی تخصیص می‌‌دهد که بر روی متغیر global شما سایه (shadow) می‌اندازد و مشکلات عدیده‌ای در خطایابی ایجاد خواهد کرد.

4⃣دستور clear global تمام متغیرهای Global را پاک می‌کند، در حالی که clear global myVar تنها myVar را پاک می‌کند. اگر فراموش کنیم اسم متغیری که باید پاک شود بعد از این دستور ذکر کنیم، سهوا تمام متغیرهای Global پاک خواهد شد و مشکلات عجیبی در فاز خطایابی کد ایجاد خواهد کرد.
@MatlabTips
#Global
نویسنده:(A-1)
🔵توجه🔵

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

1⃣ پست‌هایی که برای افراد مبتدی است با هشتک For_beginner#
2⃣ پست‌هایی که برای افراد مقدماتی است با هشتک For_intermediate#
3⃣ پست‌هایی که برای افراد پیشرفته است با هشتک For_advanced#
و البته هر کدام از این دسته بندی های بصورت سریالی است که با دنبال کردن مرتب آنها و حفظ پیوستگی می توانید راحت تر آموزش ببینید.
@MatlabTips
#Caution
نویسنده:(A-1)
🔵توابع ریاضیاتی🔵
سطح پیچیدگی:🌓🌑🌑🌑🌑
پیش‌نیاز:(ندارد)
برای: (مبتدیان)

در نرم افزار متلب تمام توابع ریاضی معمول که در ماشین حساب‌های علمی وجود دارد یافت می‌شود، مانند sin، cos و log (لگاریتم طبیعی).
1⃣ مجذور عدد پی (محیط دایره به قطر آن) را با ( sqrt(pi در متلب می‌توان محاسبه نمود. توجه کنید که متلب مقدار pi را میفهمد چرا که جز یکی از بیشمار توابع داخلی آن است.
>> sqrt(pi)

ans =

1.7725

2⃣ در توابع مثلثاتی مانند ( sin(x دقت داشته باشید که آرگومان X برحسب رادیان است. با ضرب درجه در عدد pi/180 رادیان بدست می‌آید.
>> sin(90*pi/180)

ans =

1

3⃣ تابع نمایی در متلب با (exp(x حاصل میشود. بنابراین عدد e بصورت زیر بدست می‌آید.
>> exp(1)

ans =

2.7183

✔️ از آنجایی که توابع داخلی بیشماری مانند pi و sin وجود دارد، بسیار دقت کنید که متغیرهایی که خودتان تعریف میکنید با این توابع دارای نام یکسان نباشد.
>> pi = 4;
>> sqrt(pi)

ans =

2
>> clear pi
>> sqrt(pi)

ans =

1.7725

دقت کنید که دستور clear تمام متغیرها در workspace را حذف میکند. در صورتی که clear pi تنها متغیر pi را پاک میکند.
@MatlabTips
#Math , #Variable
#For_beginners
نویسنده:(A-1)