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

توابعی که برای رسم آبجکت‌های گرافیکی استفاده می شوند(مثل plot,figure,...) می توان به نحوی از آنها استفاده کرد که هندلشان را بگیریم.
x = 0:pi/20:2*pi;

hsin = plot(x, sin(x))

hold on

hx = xlabel(’x’)

متغیر hsin هندل آبجکت گراف سینوس است و hx هندل آبجکت تکست. دقت کنید که مقدار این دو هندل از نوع اعشاری است.
1⃣هندل hsin را در یک متغیر ذخیره کنید(hsin_new). حالا متغیر hsin را پاک کنید و مقدار hsin_new را ببینید. تعجب نکنید که hsin_new هیچ مقداری ندارد، چون مادرش از بین رفته است. این نوع ادیس دهی، اندیس دهی با رفرنس است( که هندل های گرافیکی از این دسته هستند). یعنی اگر رفرنس پاک شود، باقی نیز پاک میشوند.
2⃣اگر پنجره گرافیک را ببندیم دیگر hsin و hx هم در کار نخواهدبود. به عبارتی تا زمانی این ها اعتبار دارند که شی گرافیکی وجود داشته باشد.
این آبجکت ها به فراخور نوع عملی که انجام میدهند یک سری ویژگی هم دارند. که اگر بخواهیم آن ها را لیست کنیم از دستور get استفاده میکنیم. برای مثال:
get(hsin)

get(hx)

#For_all , #Graphics
@MatlabTips
🖕🖕🖕🖕
آهنربای شناوری که با چرخش به تعادل رسیده است برای مدت 3 دقیقه یا بیشتر به پرواز در خواهد آمد. نرخ چرخش آهنربای بالایی باید دقیقا برای این پرواز تنظیم شود، نه زیاد نه کم. همچنین وزن جسم در حال پرواز باید 1 گرم باشد تا بین کشش جاذبه و نیروی دافعه آهنربای پایینی که به صورت یک حلقه بزرگ با بدنه چوبی است، تعادلی برقرار شود.
#fun
@MatlabTips
🔵برنامه نویسی تابعی🔵
سطح پیچیدگی:🌑🌑🌑🌑🌑
پیش‌نیاز:یک ذهن کنجکاو
برای:همه


تغییر دادن پارادایم زبان برنامه نویسی به هیچ وجه کار ساده ای نیست. اما وقتی به آن فکر کنید امکانات بسیار زیادی به روی شما گشوده می شود. به همین دلیل تغییر دادن پارادایم مانند یاد گرفتن یک زبان بیگانه دشوار و همواره با تنبلی ذهنی روبروست.
در این قسمت می خواهیم کمی فراتر از آنچه تاکنون آموخته اید برویم و دید گسترده تری از برنامه نویسی را بر روی شما بگشاییم.
تا کنون برخورد ما با توابع به صورت قطعه کد هایی بود که آن ها را صدا زده و خروجی از آن ها می گرفتیم. ورودی و خروجی های آنها همواره اعداد رشته ها آرایه ماتریس سل و خیلی از چیزهای دیگر بود. اما هرگز تابعی را به تابعی پاس نکرده ایم! توابع همواره شهروندان درجه دوم به حساب می آمدند. اما برای اولین بار کریستوفر استراچی(۱) با ایده گرفتن از حساب لامبدا توابع را به عنوان شهروندان درجه اول به دنیای برنامه نویسی معرفی کرد. شاید اسم برنامه نویسی تابعی یا functoinal programming را شنیده باشید. دراین پارادایم برنامه نویسی توابع تنها شهروندان مجاز هستند به این ترتیب چیزی به نام متغیر یا حالت وجود ندارد! اولین سوالی که ممکن است برای شما پیش آمده باشد این است که: اصلا چه نیازی به این روش برنامه نویسی وجود دارد؟
قبل از همه چیز باید گفت که "محاسبه" به معنای ریاضی آن چیزی جز توابع بازگشتی نیست (یکی از تعاریف بنیادی در کنار ماشین تورینگ) که اولین بار توسط آلونزو چرچ معرفی شد. بنابراین فکر کردن به الگوریتم یا محاسبه به روش برنامه نویسی معمول یا دستوری همانقدر معمولی است که محاسبه به روش تابعی یا اعلانی. پس استفاده از یکی به جای دیگری همان سوال را برای رقیبان ایجاد می کند.
از طرفی محاسبه به روش تابعی در بسیاری از مواقع بسیار ساده تر و خلاصه تر انجام می شود. و این یکی از مزیت های این روش است.
ترتیب محاسبه در روش تابعی مهم نیست! این ویژگی برنامه نویسی تابعی را برای برنامه نویسی همروند و موازی بسیار ایده آل می کند.
حالا سوال دیگری پیش می آید: اگر برنامه نویسی تابعی این همه مزایا دارد چرا بیشتر مورد استفاده قرار نمی گیرد؟
جواب ساده است زیرا تمامی این مزایا خود عیب هم هستند. اولین کاربردهای کامپیوتر های دیجیتال صرفا برای ذخیره و بازیابی اطلاعات بود. این کاربرد با برنامه نویسی تابعی جور در نمی آمد. از طرفی برنامه نویسی تابعی در موارد زیادی منجر به تولید کد های طولانی و دشوار می شود. به این دلایل برنامه نویسی معمول یا دستوری قدرت گرفت و بیشتر کدهای امروز به این صورت نوشته می شود. اما برنامه نویسی تابعی مزایای خوبی دارد که تقریبا تمامی زبان های برنامه سازی امروزه به صورت محدود آن را حمایت می کنند. اکنون تقریبا هیچ زبان برنامه نویسی در یک پارادایم کار نمی کند بلکه ملغمه ای از پارادایم های گوناگون است. زبان های امروز دموکراتیک تر بوده و تمامی مفاهیم(اعداد-رشته ها- ماتریسها و توابع) در آنها شهروندان درجه اول محسوب می شوند. متلب هم از این قاعده مستثنا نیست. در قسمت بعد به معرفی چند کاربرد این نوع برنامه نویسی در متلب اشاره می کنیم. همانطور که گفتیم حمایت متلب از برنامه نویسی تابعی محدود و حتی نسبت به زبان های دیگر هم ساده تر است.
—------------------------------------------------
[1] Burstall, R. (2000). Christopher Strachey—understanding programming languages. Higher-Order and Symbolic Computation, 13(1), 51-55.
@MatlabTips
#Lambda_Function , #Functional_Programming
🔵تغییر ویژگی‌های یک شی گرافیکی🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: خواندن پست‌های قبلی مربوط به گرافیک
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : درک set و get

هنگامی که هندل یک شی گرافیکی را گرفتید، می توانید براحتی ویژگی های آن را تغییر دهید. به عنوان یک مثال، یک نمودار سینوسی را رسم کنید و هندل آن را بگیرید:
x = 0:pi/20:2*pi;
hsin = plot(x, sin(x))

ممکن است دوست داشته باشید که نمودارتان قدری ضخیم تر شود. از دستور set استفاده کنید.
set(hsin, ’linewidth’, 4);

ویژگی linewidth تنها یکی از بی شمار ویژگی های شی گرافیکی ماست. برای اینکه تمام این ویژگی ها را ببینیم از دستور get(h) استفاده کنید، که h هندل شی مورد نظر است.
1⃣ شما میتوانید مقدار هر ویژگی را با تابع set تغییر دهید.
set(handle, ‘PropertyName’, PropertyValue)

2⃣اشیا گرافیکی دارای ویژگی های متفاوتی هستند ولی در تعدادی مثل children,parent,type مشترک هستند.

🖊برای تمرین یک نمودار را رسم کرده و هندل آن را در h ذخیره کنید، و با استفاده از دستور get مشخص کنید که parent این هندل کدام است؟
#For_all , #Graphics
@MatlabTips
🔵چگونه متلب را یاد بگیریم🔵

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

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

واقعیت این است که دانشجو قبل از اینکه به این حجم از منابع توجه کند، می بایستی هدفش را تعیین کند. برای مثال دانشجوی ترم دوم که در حال پاس کردن ریاضی 2 می باشد، نیازی نیست که کار با جعبه ابزارهای پردازش تصویر را یاد بگیرد و یا اینکه یک کتاب 300 صفحه ای در مورد متلب مطالعه کند. این دانشجو نیاز به یک راه‌انداز(start-up) دارد. چیزی که آن را با محیط متلب آشنا کند و با چندین مثال کاربردی به کاربر بفهماند که با دستورات پایه‌ای هم میتواند گلیم خودش را از آب بکشد.
دانشجویی که در حال اجرای پروژه کارشناسی ارشد است و برای مثال بر روی پردازش تصویر کار میکند، در صورتی که با متلب آشنایی ندارد، نیازی نیست که ساعت‌ها بر روی مقدمات متلب وقت بگذارد، کافی است که اصول اولیه آن را بیاموزد و help خوانی در متلب را یاد بگیرد که همه اینها شاید با 10 ساعت آموزش حل شود و هزینه‌هایی برای کلاس‌های بیرون نکند.

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

این کتاب های آموزشی قطور در باب متلب بیشتر جنبه رفرنس یا رساله دارد که با وجود اینترنت کار عبث و بیهوده ای است. شما هم برای یک لیوان شیر، جور یک گاو را نکشید. زمان از طلا هم ارزشمندتر است.
دوستدار شما جبار کمالی
@MatlabTips
🔵توابع بی نام🔵
سطح پیچیدگی:🌕🌕🌑🌑🌑
پیش‌نیاز: برنامه نویسی مقدماتی
برای: متوسط و پیشرفته


همانطور که در قست قبل اشاره کردیم می توان گاهی با توابع به صورت داده ورودی به توابع دیگر استفاده کرد. این مورد شاید برایتان عجیب باشد اما شما بارها این کار را کرده اید. مشتق گرفتن خود یک تابع است که یک ورودی به صورت تابع گرفته و یک خروجی به صورت تابع به شما می دهد. همچنین انتگرال گرفتن(با شرط بر روی مقدار ثابت) تبدیل فوریه، تبدیل لاپلاس، گرادیان ، کرل، دیورژانس امید ریاضی، واریانس، کوواریانس و تقریبا هر اپراتوری که می شناسید این خاصیت را دارد. با این دید استفاده از تابع به عنوان ورودی دیگر برایتان عجیب نخواهد بود.
در متلب برای تعریف کردن یک تابع بی نام و مشخص کردن آن با یک هندل(دسته) با نحو(syntax) ساده ای روبرو هستیم. به طور مثال می توان تابع مجذور را به صورت زیر تعریف و مشخص کرد:

sqr = @(x) x.^2;


در اینجا sqr یک دسته است و اپراتور @ این دسته را برای ما می سازد. پرانتزی که دقیقا بعد از @ می آید ورودی های تابع را مشخص می کند و بعد از آن فرمول جبری تابع قرار می گیرد. مثلا اگر بخواهیم مجذور 5 را محاسبه کنیم کافی است به صورت زیر عمل کنیم:

a = sqr(5)
>>a =
25


برای مثال می توانیم این تابع را به تابع (اپراتور) انتگرال گیری در یک بازه پاس کنیم و نتیجه را ببنییم:

q = integral(sqr,0,1);


توابع بی نام می توانند مقادیر ضرایبشان را هم در خودشان نگه دارند. برای مثال اگر بنویسیم:

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;


و آنگاه متغیر ها را پاک کنیم و دوباره مقداری به parabola پاس کنیم مقادیر a و b و c همچنان در آن ذخیره شده اند.

clear a b c
x = 1;
y = parabola(x)
y =
31.5000


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

save myfile.mat parabola


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

t = @() datestr(now);
d = t()
d =
26-Jan-2012 15:11:47


یا اینکه چند ورودی داشته باشند:

myfunction = @(x,y) (x.^2 + y.^2 + x.*y);

x = 1;
y = 10;
z = myfunction(x,y)
z =

111


حال اگر بخواهیم یک انتگرال دو گانه بر روی ناحیه مثلثی x>=0 , x<=1 و y>=0 , y<=x بگیریم کافی است حدود را نیز به صورت تابع بی نام پاس کنیم:

myfunction = @(x,y) (x.^2 + y.^2+x.*y);

integral2(myfunction, 0,1,0,@(x) x)


در قسمت بعد چند مثال دیگر هم ذکر می کنیم. اما قبل از آن سعی کنید تا جایی که می توانید با آن بازی کنید تا قدرت و محدودیت هایش را یاد بگیرید.

@MatlabTips
#Lambda_Function , #Anonymous_Function
👆👆👆انرژی جنبشی سه توپ بزرگ در اثر برخورد به توپ کوچک منتقل میشود. نسبت جرم هر جفت توپ باید به گونه‌ای انتخاب شود تا تکانه به شکل مناسبی به توپ های دیگر منتقل شود.
#Fun
@MatlabTips
🔵برداری از هندل‌ها🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: خواندن پست‌های قبلی مربوط به گرافیک
برای: علاقه مندان به مفهوم گرافیک
📝هدف از این پست : درک set و get

اگر یک آبجکت گرافیکی دارای تعدادی فرزند باشد، فرمان get با ویژگی children برداری از هندل هایی را که به فرزندهای آبجکت مادر اشاره میکند برمیگرداند.
به عنوان یک مثال، یک نمودار سینوسی و یک سینوسی که بصورت نمایی میرا می شود در نظر بگیرید:
x = 0:pi/20:4*pi;
plot(x, sin(x))
hold on
plot(x, exp(–0.1*x).*sin(x), ’o’)
hold off

حالا خط زیر را در پنجره فرمان وارد کنید:
hkids = get(gca,'child')

متغیر hkids برداری است که دو المان دارد و حاوی هندل های گرافیکی است که فرزندان آبجکت gca هستند. سوال اینجاست که کدام المان برای کدام آبجکت است؟
واقعیت این است که این بردار ترتیب معکوس دارد. یعنی اولین المان برای آخرین آبجکتی است که ساخته شده است و ... .
برای مثال من میخواهم با استفاده از دستور set ویژگی های این آبجکت ها را تغییر دهم:
set(hkids(1), ’marker’, ’*’)
set(hkids(2), ’linew’, 4)

پی نوشت: gca مخفف graphic current axes است و اشاره میکند به چهارچوب مختصات که خود آبجکتی است که فرزند دارد و پدر آن پنجره figure است.
#Graphics , #Set, #Get, #For_all
@MatlabTips
قبل از دستکاری آبجکت ها
بعد از دستکاری. به پهنای خطوط و مارکر دقت کنید.
🔵کدتان را با دیگران شریک شوید اما از آن محافظت کنید🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: آشنایی اندک با ام فایل
برای:متوسط
📝هدف از این پست : یاد گرفتن یک تکنیک برای رمز کردن کدی که در متلب نوشته اید.


شاید برای خیلی از شماها پیش آمده که برنامه ای نوشته اید و برای آن واقعا وقت یا هزینه کرده اید و از طرفی کسی از شما میخواهد که برنامه تان را در اختیارش قرار دهید(دوست، استاد یا ....). اصلا برای کسی کاری انجام داده اید و میخواهید قبل از اینکه هزینه را از او بگیرید به طرف مقابل اثبات کنید که همه خروجی‌ها بر وفق مراد است. قطعا شما نمی توانید فایل متنی(mfile) را تحویل دهید، چون آنوقت شما چیزی جز یک بازنده نخواهید بود.
هنگامی که متلب یک فایل را اجرا میکند، ابتدا آن را کامپایل کرده(به زبان سطح پایینی تبدیل میکند) و سپس از آن لحظه به بعد با زبان خودش برنامه شما را اجرا میکند دقت کنید که برنامه ای که شما مینویسید پلی است بین انسان و ماشین که متلب این مسیر را بر روی دوش میکشد.
1⃣ متلب این قابلیت را دارد که کد کامپیل شده را بصورت یک فایل به شما تحویل دهد. این فایل با پسوند p (به معنی protected) تولید میکند.
2⃣به هیچ طریقی نمیتوان محتویات درونی pکد را دید. ممکن است طرف مقابل قدری اندوهگین شود، اما چه کسی به اندوه یک انسانی که به خودش زحمت نوشتن یک برنامه نمیدهد، اهمیت میدهد؟؟ هیچکس. پس از کد خود محافظت کنید.
مثال:
function y=TestPcode(x)

% This function test pcode
y=x.^2+10;

حالا میخواهیم نسخه p را بسازیم.
pcode('TestPcode')

اگر یک فولدر از فایل های متنی را بخواهید pکد کنید، کافی است آدرس فولدر را به تابع pcode دهید. باقی را بگذارید به عهده متلب.
#Pcode, #For_intermidiate
@MatlabTips
MathIsEveryWhere!!
#Fun
@MatlabTips
🔵استراتژی‌هایی برای استفاده بهینه از مموری🔵
سطح پیچیدگی:🌕🌓🌑🌑🌑
پیش‌نیاز: کد نویسی متوسط
برای:متوسط
📝هدف از این پست : بررسی نکاتی که در مدیریت حافظه به کار خواهد آمد.

1⃣برای صرفه‌جویی در مموری(Memory) هنگامی که متغیرهایی تعریف میکنیم بهتر است به نکات زیر دقت کنیم:
2⃣از تعریف متغیرهای موقتی با اندازه‌های بزرگ پرهیز کنید و بعد از آنکه کارتان تمام شد آنها را پاک کنید.
3⃣هنگامی که با آرایه‌هایی با اندازه ثابت کار میکنید، آنها را پیش تخصیص کنید.
4⃣ابتدا ماتریس‌های بزرگ را پیش تخصیص کنید(در پست بعدی تشریح خواهم کرد).
5⃣متغیرها را با یک ماتریس خالی ([]) تخصیص دهید یا با استفاده از دستور clear کارشان را یکسره کنید.
6⃣تا جایی که میتوانید از یک متغیر دوباره استفاده کنید و از تعریف متغیرهای جدید اجتناب کنید(البته دقت کنید که متغیری که قبلا از نوع رشته بوده جایز نیست که مقدار عددی را در آن بریزید).
#Memory, #Preallocate, #For_intermediate
@MatlabTips
🔵چگونگی همگرا شدن چندجمله‌ای‌های تیلور🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز: آشنایی با چندجمله‌ای‌های تیلور
برای: مبتدی
📝هدف از این پست : درک هندسی از موضوع

در ویدئوی زیر خواهید دید چگونه با زیاد شدن جملات بسط تیلور برای تابعی که می خوایم بسطش بدیم، نمودار بسط به نمودار تابع هم بزدیک و نزدیک‌تر میشه.
#MathTips
@MatlabTips