MatlabTips
891 subscribers
462 photos
73 videos
54 files
304 links
آموزش MATLAB با "استفاده از ویدئو و متن" در سطوح مبتدی تا پیشرفته
پاسخ به سوالات تخصصی:
@roholazandie
Download Telegram
برای حل این معادله ابتدا تابع سمت راست معادله اول را به صورت یک تابع متلب در آورده و ذخیره می کنیم:
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 به عنوان اولین حل کننده استفاده کنید و در صورت کند بودن یا واگرا شدن به دنبال دیگر روش ها بروید:
در قسمت های بعدی روش هایی برای تبدیل معادلات با درجه بالاتر به درجه پایین و حل در متلب بررسی می شوند.

@MatlabTips
#For_intermediate, #For_advance
#Differential_equations, #Dynamical_systems, #ode45, #ode23
نویسنده:(#A_2)
🔵حل تقریبی معادلات دیفرانسیل مرتبه دوم🔵
سطح پیچیدگی:🌕🌕🌕🌕🌑
پیش‌نیاز:(کد نویسی متوسط)
برای:(متوسط و پیشرفته)


همانطور که گفتیم در این قسمت به حل معادلات دیفرانسیل مرتبه دوم می پردازیم. برای حل معادله دیفرانسیل مرتبه دوم زیر:
از آنجایی که حل کننده ode45 فقط می تواند معادلات مرتبه اول را حل کند باید معادله بالا را به صورت زیر به معادلات مرتبه اول بشکنیم:
همانطور که می بینید، ابتدا دو متغیر تعریف کرده ایم که اولی خود x و دیگری مشتق آن است. با مشتق گرفتن مجدد از این دو متغیر می توان معادله اصلی را شبیه سازی کرد. با این کلک می توان ode45 را برای حل معادلات با مرتبه بالاتر بکار گرفت. برنامه زیر کل معادله را حل می کند و در بازه 0 تا 3 حل میکند.

function second_oder_ode

% SOLVE d2x/dt2+5 dx/dt - 4 x = sin(10 t)
% initial conditions: x(0) = 0, x'(0)=0

t=0:0.001:3; % time scale

initial_x = 0;
initial_dxdt = 0;

[t,x]=ode45( @func, t, [initial_x initial_dxdt] );

plot(t,x(:,1));
xlabel('t'); ylabel('x');

function dxdt=func(t,x)
dxdt_1 = x(2);
dxdt_2 = -5*x(2) + 4*x(1) + sin(10*t);

dxdt=[dxdt_1; dxdt_2];
end
end

نکته ی مهمی که باید به آن توجه کنید این است که وقتی معادله ای با مرتبه بالاتر حل می کنید شرایط اولیه برای مشتق های بالاتر(تا یکی قبل از بالاترین درجه) را باید بدانید.
نمودار زیر نشان دهنده جواب معادله دیفرانسیل بالا است
این معادله نتیجه مستقیم بکاربردن قانون دوم نیوتون در حرکت برای شکل زیر است:
در این شکل m جرم جسم، c سرعت گیر(اصطکاک) و k قدرت فنر است. Wf هم فرکانس نیروی وارده است. با تغییر در این مقادیر میتوانید حالت های مختلف نمودار را ببینید.


@MatlabTips
#For_intermediate, #For_advance
#Differential_equations, #Dynamical_systems, #ode45, #Second_order_ode
نویسنده:(#A_2)
#Video_GUI
ساخت یک شمارنده که با هر بار کلیک رنگ آن بصورت تصادفی تغییر می کند.👆
🔵توابع اینلاین🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیش‌نیاز:(آشنایی مقدماتی با متلب)
برای: مقدماتی

فرض کنید تابع زیر را که بر حسب t است می خواهیم رسم کنیم:
h(t) = cos(8t) + cos(9t);

می توان تابع h را در پنجره فرمان به عنوان یک تابع اینلاین بصورت زیر نمایش داد:
h = inline('cos(8*t) + cos(9*t)')

حالا میخواهیم با نوشتن عبارات مناسب این تابع را رسم کنیم:
x = 0 : pi/40 : 6*pi;
plot(x, h(x)), grid

✔️توجه:
1⃣متغیر tدر تعریف اینلاین تابع h آرگومان ورودی است. این صرفا یک متغیر مشقی است و تنها ورودی یک تابع است. شما می توانید هر طور که مایلید نام متغیرتان را اسم گذاری کنید.

2⃣شما می توانید توابعی با بیش از یک متغیر با فرمت اینلاین تعریف کنید:
f = inline('x.ˆ2 + y.ˆ2', 'x', 'y' );
f(1, 2)
ans =
5

@MatlabTips
#Inline
#For_intermediate
نویسنده: (#A_1)