تبلیغات
برنامه نویسی متلب MATLAB - حل عددی معادله دیفرانسیل در متلب به کمک ode
برنامه نویسی متلب MATLAB
با MATLAB (متلب) هر کاری رو که بخواهید میتونید انجام بدید, هرکاری!

لینکدونی

آرشیو موضوعی

آرشیو

← آمار وبلاگ

  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :

حل عددی معادله دیفرانسیل در متلب به کمک 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 میتونید واردش بشید به راحتی می توانید معادله ریاضی فیت شده به این نمودار رو پیدا کنید.

در آینده ای نزدیک نحوه استفاده از cftool را به شما خواهم گفت.

آقا، جون هر کی دوست داری نظر یادت نره/.

ال مو یا

 

 

 

hamid
یکشنبه 26 خرداد 1392 12:58 ق.ظ
be jorat baiad begam behtarin nahveye amoozeshe matlabie ke didam! :D good luck
الهام
شنبه 25 خرداد 1392 10:56 ق.ظ
سلام خیلی ممنون
محمد جواد
جمعه 24 خرداد 1392 11:13 ق.ظ
thank you my friend
علی
چهارشنبه 22 خرداد 1392 10:00 ق.ظ
ممنوووووووووووون
nima
شنبه 18 خرداد 1392 03:52 ب.ظ
ممنون دوست عزیز. کار شما بسیار ارزشمند و قابل تقدیره. واقعا دستون درد نکنه.
سه شنبه 14 خرداد 1392 07:41 ق.ظ
سلا م خسته نباشید.ما در درس طراحی به کمک کامپیوتر استاد یه پروژه داده که مدل سازی سیستم دینامیکی برای فنر و دمپر ماشین در مطلب را خوایته میتونید کمکم کنید مرسی
hmantegi@yahoo.com
سه شنبه 14 خرداد 1392 07:36 ق.ظ
سلام خسته نباشی خیلی عالی بود اگر زحمت نباشه یک مثال در باره مدل سازی سیست دینامیکی برای قنر و دمپر ماشین بفرست
شنبه 11 خرداد 1392 06:15 ب.ظ
مچکرم
سعید
دوشنبه 30 اردیبهشت 1392 01:33 ب.ظ
سلا م خسته نباشید.ما در درس ریاضی مهندسی پیشرفته استاد یه پروژه داده که حل دستگاه های خطیn معادله nمجهول با مطلب داده میتونید کمکم کنید مرسی
آتا
جمعه 27 اردیبهشت 1392 09:22 ب.ظ
خیلی خوب گفتید ممنون
مریم
چهارشنبه 25 اردیبهشت 1392 03:55 ب.ظ
بسیار کامل و جامع ممنون
m
شنبه 14 اردیبهشت 1392 11:28 ق.ظ
دمتون گرم
سه شنبه 15 اسفند 1391 12:25 ب.ظ
نوکرم
a
شنبه 12 اسفند 1391 11:30 ق.ظ
عالیه،دست شما درد نکنه.
سید مهدی
سه شنبه 1 اسفند 1391 05:44 ب.ظ
آقا جون خودت عالی بود،دمتون گرم.
َAlireza
دوشنبه 30 بهمن 1391 12:55 ق.ظ
سلام
لطفا دوستان جواب بدید
معادله دیفرانسیل مرتبه کسری با متلب قابل حل هست یا نه؟
َAlireza
دوشنبه 30 بهمن 1391 12:22 ق.ظ
سلام
لطفا دوستان جواب بدید
معادله دیفرانسیل مرتبه کسری با متلب قابل حل هست یا نه؟
مهدی
جمعه 20 بهمن 1391 01:41 ق.ظ
دمت گرم
علی حسین
چهارشنبه 18 بهمن 1391 10:04 ق.ظ
آقا خیلی ممنون.بسیار مفید و واضح بیان کرده بودید.
سهیلا
شنبه 14 بهمن 1391 01:22 ب.ظ
با سلام.
خیلی عالی بود.
با تشکر فراوان
سه شنبه 10 بهمن 1391 12:18 ب.ظ
ممنون اقا
ف...
شنبه 7 بهمن 1391 06:25 ب.ظ
واقعا واقعا ممنون
نمی دونم چه طوری تشکر کنم
وبلاگتون عالیه
خسته نباشین
بازم میگم عالیییییییییییی:)
اووووووووو
یکشنبه 1 بهمن 1391 11:04 ق.ظ
عالی بود مرسی
لیلا
دوشنبه 25 دی 1391 01:14 ق.ظ
عالی بود هر چند من فرترنو لازم داشتم
reza
شنبه 23 دی 1391 03:44 ب.ظ
سلام مهندس جان. مطالب بسیار مفید بود. می خوام در label نمودارهااز نماد omega bar استفاده کنم. نماد bar را چگونه بنویسم که بالای omega قرار بگیرد. ممنونم برادر.
reza
شنبه 23 دی 1391 03:44 ب.ظ
سلام مهندس جان. مطالب بسیار مفید بود. می خوام در label نمودارهااز نماد omega bar استفاده کنم. نماد bar را چگونه بنویسم که بالای omega قرار بگیرد. ممنونم برادر.
reza
شنبه 23 دی 1391 03:44 ب.ظ
سلام مهندس جان. مطالب بسیار مفید بود. می خوام در label نمودارهااز نماد omega bar استفاده کنم. نماد bar را چگونه بنویسم که بالای omega قرار بگیرد. ممنونم برادر.
aligoli
پنجشنبه 21 دی 1391 10:44 ق.ظ
خدا خیرت بده.
خیلی کمکم کرد!
بهناز
یکشنبه 10 دی 1391 11:58 ق.ظ
ممنون . مفید بود
behrooz
سه شنبه 5 دی 1391 08:51 ب.ظ
اقا نمی تونی تصور کنی چقدر برام مفید بود پستت....واقعا تونستم مساله هایی که از ode45 بود رو حل کنم
واقعا ممنونم
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر
 
  • تعداد صفحات :4
  • 1  
  • 2  
  • 3  
  • 4  
 

درباره وبلاگ

مدیر وبلاگ : Elmoya

آخرین پست ها

جستجو

نظرسنجی

  • مطالب این وبلاگ را چگونه یافتید؟



نویسندگان