حل معادله دیفرانسیل در متلب | دستور dsolve
به نام خدا و سلام.
به جلسه سی و هشتم از سری جلسات آموزش متلب خوش آمدید. آموزش نرم افزار متلب از وبسایت متلبپلاس بصورت رایگان ارائه میشود. در این جلسه به آموزش حل معادله ode در متلب میپردازیم. منظور از معادله ode، معادله دیفرانسیل معمولی (Ordinary Differential equation) است. حل تحلیلی معادله دیفرانسیل معمولی با دستور dsolve در این جلسه به طور کامل ارائه میشود. حل معادله دیفرانسیل خطی و غیرخطی و حل دستگاه معادلات دیفرانسیل (در انواع مختلف) از مباحث این جلسهاند.
با متلب پلاس همراه باشید.
حل معادله دیفرانسیل با دستور dsolve در متلب
معادلات دیفرانسیل به دو دسته معمولی (ODE) و با مشتق جزئی (PDE) تقسیم میشوند. در معادلات دیفرانسیل ODE فقط یک متغیر مستقل داریم. به عبارت دیگر، مشتقات فقط برحسب یک متغیر هستند. اما در معادلات دیفرانسیل PDE مشتق برحسب چندین متغیر داریم. در این جلسه به حل معادلات ODE در متلب میپردازیم. علاوهبر آن، معادلات ODE در شرایط خاصی دارای حل تحلیلی اند. در واقع دو نوع حل اصلی برای ODE داریم. حل تحلیلی و حل عددی. تمرکز ما در این جلسه بر حل تحلیلی معادله دیفرانسیل است. حل عددی معادله دیفرانسیل در متلب در جلسه بعد ارائه میشود.
برای حل تحلیلی معادله دیفرانسیل در متلب از دستور dsolve استفاده میکنیم. دستور dsolve(eqn) معادله دیفرانسیل معمولی eqn را بصورت تحلیلی حل میکند. تعریف معادله دیفرانسیل در متلب، بصورت نمادین (سیمبولیک) انجام میشود. برای تعریف کردن مشتق در معادله دیفرانسیل، از اپراتور diff استفاده میکنیم. برای درک بهتر، معادله دیفرانسیل زیر را درنظر بگیرید.
برای حل این معادله دیفرانسیل در متلب بصورت زیر عمل میکنیم.
syms y(x) a
eqn = diff(y,x) == a*y;
dsolve(eqn)
پس از اجرای دستور بالا، داریم:
ans =
C1*exp(a*x)
مشاهده میکنیم که پاسخ معادله دیفرانسیل با یک ثابت C1 ارائه شد. ثابت C1 بدلیل این است که شرایط مرزی (اولیه) معادله دیفرانسیل مشخص نیست. در واقع حل عمومی آن ارائه شدهاست. از درس معادلات دیفرانسیل بخاطر داریم که پاسخ هر معادله دیفرانسیل به تعداد مرتبهاش، ثابت دارد. چون معادله دیفرانسیل بالا مرتبه اول بود، یک ثابت در پاسخ مشاهده شد.
حال یک مثال دیگر از حل معادله دیفرانسیل مرتبه اول در متلب ارائه میکنیم. معادله دیفرانسیل زیر را درنظر بگیرید.
برای حل این ODE در متلب به صورت زیر عمل میکنیم.
syms y(x)
eqn = x* diff(y,x) - 2*y == 2*x^5;
dsolve(eqn)
ans =
(2*x^5)/3 + C2*x^2
در ادامه به حل معادله دیفرانسیل مرتبه 2 و بالاتر میپردازیم.
حل معادله دیفرانسیل مرتبه دوم و بالاتر در متلب
در جلسهی 32 ام آموزش نرم افزار متلب درباره مشتق گیری در متلب صحبت کردیم. دیدیم که برای مشتق مرتبه بالاتر از دستور diff(y,x,n) استفاده میشود. که n مرتبه مشتق است. برای تعریف معادله دیفرانسیل مرتبه بالاتر نیز از همین دستور استفاده میکنیم. مثلا مشتق دوم y نسبت به x بصورت diff(y,x,2) تعریف میشود. حال یک معادله دیفرانسیل مرتبه دوم را در متلب حل میکنیم.
معادله دیفرانسیل زیر را در نظر بگیرید.
برای حل بصورت زیر کدنویسی میکنیم.
syms y(x)
eqn = diff(y,x,2) - 3*diff(y,x) + 2*y == exp(-x);
dsolve(eqn)
ans =
exp(-x)/6 + C6*exp(x) + C7*exp(2*x)
مشاهده میکنید که در پاسخ نهایی، 2 ثابت داریم. این ثوابت بدلیل نداشتن شرایط مرزی (اولیه) در معادله ظاهر شدهاند.
در مثال زیر یک معادله دیفرانسیل مرتبه 4 را با متلب حل میکنیم. این معادله در زیر نشان داده شده:
برای حل در متلب داریم:
syms y(x)
eqn = diff(y,x,4) == y;
dsolve(eqn)
ans =
C102*cos(x) + C101*exp(x) - C103*sin(x) + C100*exp(-x)
در ادامه معادله دیفرانسیل را با درنظر گرفتن شرایط مرزی یا شرایط اولیه حل میکنیم.
حل معادله دیفرانسیل با شرایط مرزی (اولیه) در متلب
برای حل معادله دیفرانسیل با شرط مرزی در متلب از دستور dsolve استفاده میکنیم. این بار شرط مرزی را نیز درون دستور مینویسیم. نوشتار dsolve(eqn,cond) معادله دیفرانسیل eqn را با شرایط cond حل میکند. توجه داریم که شرط (شرایط) مرزی (اولیه) به مرتبه معادله دیفرانسیل بستگی دارد. مرتبه معادله دیفرانسیل هر چقدر که باشد به همان تعداد، شرط مرزی نیاز داریم.
به معادله دیفرانسیل زیر دقت کنید.
برای حل داریم:
syms y(t)
eqn = diff(y,t) == t*y;
cond = y(0) == 1;
dsolve(eqn,cond)
ans =
exp(t^2/2)
اگر به پاسخ دقت کنید، ضریب C دیده نمیشود. چون شرط اولیه را در معادله لحاظ کردیم، مسئله کامل حل شد.
حال یک معادله دیفرانسیل مرتبه دوم با شرایط مرزی را در متلب حل میکنیم. معادله دیفرانسیل زیر را درنظر بگیرید.
برای حل این معادله دیفرانسیل، کد زیر را در متلب مینویسیم.
syms y(x)
Dy = diff(y,x);
eqn = diff(y,x,2) + 2*diff(y,x) - 3*y == 0;
cond1 = y(0) == 1;
cond2 = Dy(0) == 0;
cond = [cond1,cond2];
dsolve(eqn,cond)
ans =
exp(-3*x)/4 + (3*exp(x))/4
حل معادله دیفرانسیل غیرخطی در متلب
معادلات دیفرانسیلی که تاکنون حل کردیم، خطی بودند. در ادامه معادله دیفرانسیل غیرخطی را در متلب حل میکنیم. البته برای حل معادله دیفرانسیل خطی و غیرخطی تفاوتی در اجرای دستور dsolve در متلب نیست. اما معادلات دیفرانسیل غیرخطی در حالتهای زیادی، پاسخ تحلیلی ندارند. روش حل این معادلات، استفاده از حل عددی معادلات دیفرانسیل در متلب است.
معادله دیفرانسیل زیر را درنظر بگیرید.
برای حل این معادله ODE غیرخطی در متلب به صورت زیر عمل میکنیم.
syms y(x)
eqn = diff(y,x) - tan(y) == 0;
cond = y(0) == 1;
dsolve(eqn,cond)
ans =
asin(exp(x + log(sin(1))))
برای نمایش بهتر، پاسخ نهایی را ساده میکنیم.
simplify(ans)
ans =
asin(exp(x)*sin(1))
برای ساده سازی از دستور simplify در متلب استفاده میکنیم. جزئیات این دستور و سایر دستورات در آموزش محاسبات پارامتری در متلب ارائه شده. (برای مطالعه، روی عبارت قرمز رنگ کلیک نمائید.)
پاسخهای خاص معادله دیفرانسیل در متلب
معادله دیفرانسیلهای زیادی در ریاضیات داریم که پاسخ تحلیلی ندارند. برخی از این معادلات را با نام مشخص میشناسیم. مثلا معادله اِیری (Airy)، معادله بسل (Bessel) در انواع خود، معادله لژاندر و… ازین موارد اند. در واقع اینها نامهایی که به توابع خاص اختصاص داده شدهاست. حال ممکن است معادله دیفرانسیلی را در متلب حل کنیم و متلب پاسخی از این معادلات به ما بدهد. پس اگر در پاسخ حل یک معادله دیفرانسیل (و یا موارد دیگر متلب) نام خاصی مشاهده کردید، به این توابع مربوط است. مثال زیر را درنظر بگیرید.
برای حل در متلب، داریم:
syms y(x)
eqn = x^2*diff(y,x,2) + x*diff(y,x) + (x^2-4)*y == 0;
dsolve(eqn)
ans =
C88*besselj(2, x) + C89*bessely(2, x)
به پاسخ ارائه شده توسط متلب دقت کنید. متلب از عبارت besselj و bessely استفاده کردهاست. این توابع به ترتیب بیانگر تابع بسل نوع اول و دوم میباشند.
حل دستگاه معادلات دیفرانسیل در متلب
در مثالهای قبل انواع مختلف معادله دیفرانسیل در متلب ارائه شد. حال به آموزش حل دستگاه معادلات دیفرانسیل در متلب میپردازیم. برای حل دستگاه معادلات دیفرانسیل که شامل eqn1 و eqn2 باشد، دستور dsolve([eqn1,eqn2]) را اجرا میکنیم. دقت کنید که چون پاسخ نیز 2 بخش است، دستور dsolve را با دو خروجی فراخوانی میکنیم. در واقع هر تعداد که معادله داشته باشیم، به همان تعداد خروجی نیز باید درنظر بگیریم.
مثلا دستگاه معادلات دیفرانسیل زیر را درنظر بگیرید.
برای حل با دستور dsolve در متلب، داریم:
syms y(x) z(x)
eqn1 = diff(y,x) == 3*y + 4*z;
eqn2 = diff(z,x) == -4*y + 3*z;
eqn = [eqn1, eqn2];
[y_ans, z_ans] = dsolve(eqn)
y_ans =
C107*cos(4*x)*exp(3*x) + C106*sin(4*x)*exp(3*x)
z_ans =
C106*cos(4*x)*exp(3*x) - C107*sin(4*x)*exp(3*x)
حل دستگاه معادله دیفرانسیل با شرایط مرزی در متلب
افزودن شرایط مرزی (اولیه) در دستگاه معادلات دیفرانسیل مشابه با معادله دیفرانسیل تکی است. مثلا دستگاه ODE قبل را درنظر بگیرید. فرض کنیم شرایط اولیه زیر هم به آن اضافه شود.
برای حل این دستگاه معادله دیفرانسیل با شرایط اولیه در متلب، کد زیر را اجرا میکنیم.
syms y(x) z(x)
eqn1 = diff(y,x) == 3*y + 4*z;
eqn2 = diff(z,x) == -4*y + 3*z;
eqn = [eqn1, eqn2];
cond1 = y(0) == 1;
cond2 = z(0) == 0;
cond = [cond1, cond2];
[y_ans, z_ans] = dsolve(eqn,cond)
y_ans =
cos(4*x)*exp(3*x)
z_ans =
-sin(4*x)*exp(3*x)
به عنوان آخرین مثال در این جلسه، دستگاه معادلات دیفرانسیل 3 تایی زیر را در متلب حل میکنیم.
برای حل، کد زیر را در متلب اجرا میکنیم.
syms u(x) v(x) w(x)
eqn1 = diff(u,x) == u;
eqn2 = diff(v,x) == 5*u - 2*v;
eqn3 = diff(w,x) == 3*v - w;
eqn = [eqn1, eqn2, eqn3];
cond1 = u(0) == 1;
cond2 = v(0) == 1;
cond3 = w(0) == 0.5;
cond = [cond1, cond2, cond3];
[u_ans, v_ans, w_ans] = dsolve(eqn,cond)
u_ans =
exp(x)
v_ans =
(5*exp(x))/3 - (2*exp(-2*x))/3
w_ans =
2*exp(-2*x) - 4*exp(-x) + (5*exp(x))/2
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) معادله دیفرانسیل زیر را بصورت تحلیلی حل کنید.
ode: y’ – tan(y) = 0
تمرین دوم) معادله دیفرانسیل زیر را با شرایط اولیه داده شده حل کنید.
ode: y”-y’=1
condition: y(0)=1, y'(0)=0
تمرین سوم) دستگاه معادلات دیفرانسیل زیر را حل کنید.
Eq1: y’ = y – z
Eq2: z’ = z
Eq3: w’ = 4w – z
BC’s: y(0) = 0, z(0) = 1, w(0) = 1
جمعبندی
جلسه سی و هشتم از سری جلسات آموزش متلب به پایان رسید. این جلسه درباره حل تحلیلی معادله دیفرانسیل در متلب صحبت کردیم. ابتدا به حل معادله دیفرانسیل مرتبه اول، مرتبه دوم و مراتب بالاتر پرداختیم. سپس معادله دیفرانسیل با شرایط اولیه (مرزی) را بررسی کردیم. همچنین توابع خاصی که گاهی در پاسخ معادله دیفرانسیل در متلب ارائه میشوند را معرفی کردیم. در نهایت نیز آموزش حل دستگاه معادلات دیفرانسیل در متلب ارائه شد. در مجموع 11 مثال کاربردی از مبحث معادله دیفرانسیل در متلب حل شد. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
12 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با سلام.بسیار عالی و زیبا بود.تازه علاقه پیدا کردیم به یادگیری متلب
سلام ابوالفضل عزیز
ممنون و متشکریم از نظرت. خیلی خوشحالیم که ازین آموزش راضی بودی و به متلب علاقه مند شدی. در صفحه دوره👈 آموزش متلب 👉رایگان میتونی لیست کامل جلسات متلب رو از صفر تا صد ببینی.
عالی بود
خدا قوت
ممنون، نظر لطف شماست.
بسیار بسیار عالی. خدا خیرتون بده
ممنون، نظر لطف شماست.
عالی بود
سلام
فیلم این جلسات چی شد
درود فراوان
بدلیل زیاد بودن مطالب حوزه معادلات دیفرانسیل در متلب، این جلسه ویدیو نداره و در عوض دوره آموزشی ویدیویی مجزا برای اون ارائه شده.
موفق باشید
سلام
عالی بود
سلام و عرض ادب
خیلی خوشحالیم که ازین آموزش متلب راضی بودی علیرضا جان.
موفق باشی!
عالی عالی عالی