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

اولین موفقیت چشمگیر علم تجربی در قرن 17 توسط آیزاک نیوتون با معرفی قوانین حرکت اجسام و حساب دیفرانسیل و انتگرال بدست آمد. در قلب این نظریات که تا سه قرن پادشاه بی منازع علم بود مفهوم سیستم های دینامیکی قرار دارد. سیستم دینامیکی مجموعه روابطی است که اندرکنش بین دو یا چند متغیر قابل اندازه گیری را بیان می کند. نکته ی مهم در مورد سیستم های دینامیکی آن است که در آن ها تغییرات بی نهایت کوچک با هم مرتبط می شوند. همین بازی کردن با بی نهایت کوچک ها و تغییرات (نرخ تغییر آنها) سنگ بنای حساب دیفرانسیل و انتگرال است. بنابراین معادلات حاکم بر طبیعت به صورت معادلات دیفرانسیل هستند و برای یافتن آینده سیستم باید زمان های بی نهایت کوچک را با هم جمع کرد که به این کار انتگرال گرفتن می گویند.بعد ازحل معادله با داشتن شرایط اولیه می توان مسیر(trajectory) را یافت.
برای درک کلی معادلات دیفرانسیل آنها را در فضای فاز رسم می کنیم. فضای فاز یک فضای ساختگی است که تحول سیستم دینامیکی را نشان می دهد. مثلا فرض کنید یک آونگ دارید که با دو متغیر مکان(x1) و سرعت(x2) مشخص می شود. اگر از یک مکان و سرعت مشخص شروع کنید. آونگ عقب و جلو می رود و سرعت آن زیاد و کم می شود. یعنی به صورت شکل زیر
حالا به این نکته دقت کنید که شما می توانستید هر نقطه ی دیگری را هم به عنوان شرایط اولیه انتخاب کنید که قاعدتا مسیر متفاوتی را طی می کرد. پس کل فضا را می توانید با این خطوط پر کنید. به صورت شکل زیر:
معادلات دیفرانسیل معمولی را می توان به شکل کلی زیر نوشت:
در این جا با نرم افزار متلب سعی می کنیم معادله دیفرانسیل زیر را با استفاده از متلب حل کنیم:

syms f(t) g(t)
eqn1 = diff(f) == 3*f + 4*g;
eqn2 = diff(g) == -4*f + 3*g;
S = dsolve(eqn1, eqn2)
fSol(t) = S.f
gSol(t) = S.g


که در آن دستور syms تعریف کننده متغیر است.نتیجه اعمال solve یک سلول است که جواب های f و g در آن قراردارند. این توابع بدست آمده در معادلات اولیه صدق می کنند. به این نحوه حل، حل تحلیلی می گویند. زیرا ما توانستیم نتایج را به صورت ترکیبی صریح از توابع مقدماتی(مانند مثلثاتی، نمایی و..) بدست آوریم.
سیستم های به صورت بالا را خطی می گویند. زیرا تمامی معادلات سمت راست fi ها به صورت خطی از x1 تا xn هستند. معادلات غیر خطی زیادی هم وجود دارد. به طور مثال معادله آونگ به صورت زیر است:
در اینجا سمت راست معادله دوم به صورت Sin(x1) است که دیگر خطی نیست. حل این نوع معادلات در حالت کلی بسیار دشوار هستند و در بسیاری از مواقع راه حل تحلیلی ندارند. در این موارد مجبوریم از راه حل های عددی استفاده کنیم. در پست های بعدی بیشتر در این مورد بحث می کنیم.

@MatlabTips
#For_intermediate, #For_advance, #Dynamical_systems, #Phase_space
نویسنده: (A-2)
🔵گل آفتابگردان🔵
سطح پیچیدگی: 🌕🌓🌑🌑🌑
پیش نیاز: کدنویسی مقدماتی
برای: (مبتدیان و مقدماتی)

هر موقع در کلاس به مبحث نمودارهای قطبی میرسم سعی میکنم بچه ها را با یک مثال جذاب شگفت زده کنم. به نظرم در این زمینه گل آفتابگردان بهترین مثال است.
آرایش دانه ها در گل آفتابگردان از یک الگوی ریاضی مشخص پیروی می کنند. nامین دانه در مکان r قرار دارد که رابطه آن بصورت زیر است:
و زاویه هر دانه نسبت به مبدا بر حسب رادیان pi*dn/180 است که d مقدار دیورژانس بین هر دو دانه متوالی بر حسب درجه است( مثلا دانه n و n+1). یک گل آفتابگردان ایده آل با d برابر 137.51 درجه ایجاد میشود(واقعا حیرت انگیز است که با مقدار 137 درجه الگو بکلی بهم میریزد).
در این پست میخواهم یک برنامه برای رسم این الگو بنویسم. من این برنامه رو بگونه ای مینویسم که پترن برای محوده وسیعی از مقدار دیورژانس ها تغییر کند و مشاهده کنید که تغییرات کوچک در این دیورژانس چقدر الگو را تغییر میدهد.
n=0:1000;

for d=135:0.1:138
theta = pi*d*n/180;
r = sqrt(n);
h = polar(theta,r,'o');
set(h,'color','red');
pause(0.05)
cla
end

خروجی gif این برنامه در زیر آورده شده است.
@MatlabTips
#For_beginner, #For_intermediate
#Sun_flower, #Polar
نویسنده:(#A_1)
🔵حل تقریبی معادلات دیفرانسیل🔵
سطح پیچیدگی:🌕🌕🌕🌕🌑
پیش‌نیاز:(کد نویسی متوسط)
برای:(متوسط و پیشرفته)

متلب مجموعه ای کامل برای حل دسته ی وسیعی از معادلات دیفرانسیل دارد. در اینجا باز هم تمرکز خود را بر روی معادلات دیفرانسیل خطی می گذاریم. در حل عددی همواره معادله را در یک بازه حل می کنیم و شرایط اولیه را هم مشخص می کنیم. به طور مثال معادله دیفرانسیل زیر را در نظر بگیرید:
برای حل این معادله ابتدا تابع سمت راست معادله اول را به صورت یک تابع متلب در آورده و ذخیره می کنیم:
function f=func1(t,y)
f=-t*y/sqrt(2-y^2);

حالا می توانیم از حل کننده(solver) های ode23 یا ode45 برای حل آن استفاده کنیم. برای اینکار کافی است نام تابع را به عنوان اولین آرگومان به حل کننده پاس دهیم و پس از آن بازه مورد نظر و نیز شرط اولیه را اضافه کنیم:

[tv1 f1]=ode23('func1',[0 5],1);
plot(tv1,f1,'-.')
title('y''=-ty/sqrt(2-y^2), y(0)=1, t in [0, 5]')
grid
axis([0 5 0 1])

نتیجه به صورت زیر می شود:
پیشنهاد می کنیم همین کد را با ode45 هم اجرا کرده و نتیجه را مقایسه کنید. تفاوت در اینجاست که که روش های حل عددی در ode23 و ode45 با هم تفاوت دارند ولی نتایج به هم نزدیک اند. علت قرار دادن حل کننده های متفاوت در متلب این است که گاهی اوقات با توجه به شرایط مساله یک حل کننده بهتر از دیگری است. پیشنهاد می شود(بر اساس تجارب mathwork) از ode45 به عنوان اولین حل کننده استفاده کنید و در صورت کند بودن یا واگرا شدن به دنبال دیگر روش ها بروید: