دانشجویان مهندسی صنایع

Industrial Engineering Students

دانشجویان مهندسی صنایع

Industrial Engineering Students

حل عددی معادله دیفرانسیل در متلب به کمک ODE

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

1- حل عددی

2- حل تحلیلی

تابع مخصوص حل عددی در متلب ode هستش که نمونه های مختلفی داره مثل ode45 و یا ode23 و...

اما تابع مخصوص حل تحلیلی برای معادله دیفرانسیل در متلب dsolve هستش که فعلا در این پست به اون نمی پردازیم.


حال به بیان چگونگی استفاده از ode برای حل معادله دیفرانسیل می پردازیم. البته باید بهتون بگم که ما از ode45 استفاده می کنیم. خود متلب هم در help  گفته که برای شروع کار با ode45 مسئلتون رو حل کنید اگر که جواب نداد از ode23 و اگر که جواب نداد از دیگر توابع ode استفاده کنید. می تونید بروید تو قسمت help نرم افزار و با جستجو کردن عبارت ode راهنمای متلب رو در این مورد بخونید.

فرض کنید معادله دیفرانسیل مقابل با شرایط مرزی داده شده را می خواهیم حل کنیم:

y''+y'+y=cos(x)

y(0)=0

y'(0)=1

ما می دانیم که جواب معادله سینوس میشه. اما می خواهیم بدونیم متلب چه جوابی رو به ما میده.

ابتدا باید بهتون بگم که ode برای حل معادلات دیفرانسیل با شرایط اولیه در زمان (یا مکان) صفر هستش. یعنی شرایط مرزی مسئلتون نمی تونه در نقطه ای به غیر از صفر باشه. مثلا:

y''+y'+y=cos(x)

y(0)=0

y'(pi)=-1

جواب این معادله هم سینوس هستش اما چون شرایط مرزی فقط در صفر داده نشده نمیشه از ode استفاده کرد. این جور مسئله ها معروف اند به مسئله با مقدار مرزی یا bvp . ان شاءالله در پست های آینده طریقه حل این گونه معادلات رو هم خدمتتون عرض خواهم کرد.تابع مخصوص این معادلات در متلب عبارت است از bvp4c و bvp5c .

پس اگر که یه معادله دیفرانسیل داشتیم باید ببینیم که اون یک ode هستش یا یک bvp .

خب، برگردیم به مسئله خودمون. برای حل یک معادله دیفرانسیل به روش ode باید قبل از اینکه برنامه رو در متلب بنویسید اون رو در کاغذ دچار یه سری تغییراتی بکنید.

ابتدا نگاه می کنید به معادله دیفرانسیل و میبینید که مرتبه معادلتون (بالاترین مشتقی که در معادله وجود داره) چند هستش که حالا برای معادله ای که بالا نوشتم مرتبه معادله 2 میشه.

حالا باید معادلتون رو به تعداد عدد مرتبه، به معادلات دیفرانسیل های مرتبه اول تبدیل کنید. مرتبه معادله ما 2 بود پس باید دو متغیر جدید به نامهای y1 و y2 ایجاد کنمو به کمک اونها دو معادله دیفرانسیل مرتبه اول تشکیل بدهم. امیدوارم که در درس معادلات دیفرانسیل این کار رو بلد شده باشید. من فقط نتیجه کار رو براتون مینویسم:

y=y1

y1'=y2

y2'=cos(x)-y2-y1

حالا معادله ما تبدیل شده به دو معادله دیفرانسیل مرتبه اول به نامهای y'1 و y'2 .

تا الان هر کاری که کردیم روی کاغذ بود. حالا باید برویم و در متلب برنامه رو بنویسیم.

اولین قدم اینه که در یک function دو معادله دیفرانسیل مرتبه یک را به صورت ستونی در یک بردار مانند out بنویسیم:

function out=myfun(x,y)

out=[y(2);cos(x)-y(2)-y(1)];

این function را باید به نام خود تابع یعنی myfun ذخیره کنید.

حالا داخل یک m فایل دیگه یا در داخل command window از دستور ode استفاده می کنیم. فرم کلی دستور ode به صورت زیر می باشد:

ode45(@اسم تابع,بازه حل مسئله,شرایط مرزی مسئله)

پس برای مسئله ما به صورت زیر می شود:

>>ode45(@myfun,[0 5],[0 1])

دستور بالا به این معنیه که معادله دیفرانسیل ما در تابعی بنام myfun نوشته شده، می خواهیم که این معادله دیفرانسیل را در بازه 0 تا 5 حل کنیم. و شرایط مرزی معادله ما به ترتیب برابر 0 و 1 می باشد.

حالا توضیحات این گراف:

در این گراف 2 نمودار وجود دارد زیرا معادله دیفرانسیلمون را تبدیل به 2 معادله مرتبه اول کردیم. پس یکی از این نمودارها مربوط به y1 و دیگری مربوط به y2 هستش.

معادله y1 ما همان y ای است که ما دنبالش بودیم. یعنی در بین این دو نمودار، نمودار y1 جواب معادله ما هستش که چون جواب این مسئله ساده بود و ما می دانستیم که جواب سینوس می شود پس با نگاه به گراف می فهمیم که نمودار آبی رنگ جواب معادله ما یعنی همان نمودار سینوس هستش. و نمودار سبز رنگ نمودار y2 هستش که y2 برابر y'1 یا همان 'y هستش. در واقع نمودار سبز رنگ، مشتق جواب مسئله ما هستش که می شود کسینوس که با نگاه کردن به نمودار سبز رنگ براحتی خواهید یافت که این نمودار، نمودار کسینوس هستش.

اما ایرادات اینگونه جواب:

اولا هیچ گونه خروجی عددی در داخل workspace نیومده و فقط یک گراف کشیده شده که با رنگ های پیش فرض خود متلب برای ما نمودارها رسم شده که شاید مثلا کسی نخواهد جواب y2 را ببینه و فقط بخواهد جواب y1 که همان جوابی است که ما بدنبالش هستیم رو با رنگ مورد نظرش ببینه و از همه مهمتر اینکه به داده های عددی جواب در workspace دسترسی داشته باشه.

برای رفع این ایراد باید خروجی دستور ode را برابر دو متغیر قرار دهیم:

>>[x y]=ode45(@myfun,[0 5],[0 1]);

با این کار میبینید ک هر دو متغیر x و y به داخل workspace وارد شده و گرافی نیز دیگر کشیده نشد. اما این دو متغیر x و y چی هستند؟

متغیر x همان بازه بین 0 تا 5 هستش که شما در دستور ode نوشته بودید که متلب با یه گام خاصی این بازه رو تقسیم بندی کرده.( اگر که خودتون بخواهید گام بدهید باید بجای [5 0] بنویسید: [0:0.01:5] که منظور اینه که فاصله بین 0 تا 5 را با گام 0.01 تقسیم بندی کن که شما می توانید یه گام دیگه قرار دهید.)

اما متغیر y دارای 2 ستون هستش. ستون اول همان جواب y1 یا همان y هستش و ستون دوم جواب y2 هستش. پس الان براحتی می توانیم نمودار جواب مسئله را با هر رنگ و مشخصاتی که خودمون می خواهیم رسم نمائیم:

>>plot(x,y(:,1),'r','LineWidth',2)


اما یه سوال خیلی مهم:

خب، ما از کجا بفهمیم که رابطه ریاضی این نمودار چی میشه؟ حالا توی این سوال خاص که جواب سینوس بود ما خیلی راحت با نگاه به نمودار فهمیدیم که جواب سینوس میشه اما اگرکه نمودار جواب کمی پیچیده باشه دیگه نمیشه جواب معادله رو به صورت ریاضی به سادگی بیان کرد!

به نظر شما راه حل چیه؟ یعنی از کجا میتونیم بفهمیم که رابطه ریاضی برای نمودار جواب چی میشه؟

متلب برای این مشکل جعبه ابزاری به نام curve fitting toolbox رو معرفی می کنه. با خواندن help نرم افزار در مورد این جعبه ابزار که با دستور cftool در command window میتونید واردش بشید به راحتی می توانید معادله ریاضی فیت شده به این نمودار رو پیدا کنید.

نظرات 23 + ارسال نظر
علیرضا جلالی چهارشنبه 8 خرداد 1392 ساعت 01:43 http://ferdosi-toosi.blogsky.com/

ممنون قاسم جان

غلامرضا فرزانه چهارشنبه 8 خرداد 1392 ساعت 08:01

سپاس فراوان جناب وفایی عزیز

غلامرضا فرزانه چهارشنبه 8 خرداد 1392 ساعت 08:01

ممنون جناب وفایی

هما پوراسفندیانی چهارشنبه 8 خرداد 1392 ساعت 08:10

ممنون برادر وفایی

امیر علی نصیری چهارشنبه 8 خرداد 1392 ساعت 08:18

خیلی عالی بود واقعا ممنون

نفیسه عباسی چهارشنبه 8 خرداد 1392 ساعت 08:46

ممنون بابت وقتی که میگذارید

امین خالقی چهارشنبه 8 خرداد 1392 ساعت 10:24

ممنون مهندس

سوگند شمس چهارشنبه 8 خرداد 1392 ساعت 11:05

آقا ممنون

معصومه اکبری چهارشنبه 8 خرداد 1392 ساعت 11:19

دست شما درد نکنه

امین طاهری چهارشنبه 8 خرداد 1392 ساعت 12:59

ممنون قاسم جان

ازاده سهرابی نژاد پنج‌شنبه 9 خرداد 1392 ساعت 12:50

برادر خدا به شما خیر دهاد

سعید پنج‌شنبه 5 دی 1392 ساعت 20:40

خیلی خوب بود واقعا

نسرین چهارشنبه 9 بهمن 1392 ساعت 17:57

واقعا ممنونم . خیلی خیلی خوب بود اجرتون با امام زمان

محمد یکشنبه 27 بهمن 1392 ساعت 14:23

daste golet dard nakone dooste aziz.

moahmadreza پنج‌شنبه 1 اسفند 1392 ساعت 17:23

بسیار مفید بود

احمد جمعه 5 دی 1393 ساعت 01:48

دمت گرم،خدا خیرت بده.اگه معلم شی خیلی پیشرفت میکنی.عالی بود.

محسن چهارشنبه 17 دی 1393 ساعت 17:37

انشالله همه مثل شما توضیح بدن.

علی ناطقی شنبه 25 بهمن 1393 ساعت 19:12

تو سیستم تعلیق فعال خودرو که متغیرهای حالت 4 تا هستند چیکار باید کرد؟
با تشکر

مهدی پنج‌شنبه 6 فروردین 1394 ساعت 12:47

سلام
واقعا دستتون درد نکنه خیلی مفید بود ممنون

فقط یسوال. برای حل معادلات غیرخطی چیکار باید کرد؟

مژگان چهارشنبه 8 مهر 1394 ساعت 16:19

ممنون از لطفتون توضیحات عالی بود فقط لطفا در مورد معادله درجه 3 ک ترم غیرخطی هم داره ی توضیحی بدین یا نحوه نوشتن ی نمونه معادله درجه 3 رو هم بزارین بازم سپاس فراوان

پژمان سه‌شنبه 5 آبان 1394 ساعت 10:57

جناب آقای وفایی بسیار سپاسگذارم

خواهش می کنم
وفایی

فرخی جمعه 25 فروردین 1396 ساعت 15:13

با سپاس بخاطر توضیح و آموزش خوب شما

قاسم جمعه 3 آذر 1396 ساعت 11:54

خیلی گلی دمت گرم

ایمیل شما بعد از ثبت نمایش داده نخواهد شد