شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.
در آموزشهای پیشین مجله فرادرس، با روش رانگ کوتای مرتبه اول و مرتبه چهارم آشنا شدیم. در این آموزش، روش رانگ کوتای مرتبه دوم (Second Order Runge-Kutta) را برای حل معادلات دیفرانسیل معرفی خواهیم کرد.
میخواهیم جواب y(t) را با کامپیوتر تقریب بزنیم (با دانستن شرایط اولیه y(t0)=y0). در ادامه، یک روش شهودی برای انجام این کار ارائه کرده و مثالهایی را نیز بررسی میکنیم. این روش همان روش رانگ کوتای مرتبه دوم است.
روش رانگ کوتای مرتبه دوم
در این بخش، روش رانگ کوتای مرتبه دوم را برای دستههایی از معادلات دیفرانسیل به صورت شهودی معرفی خواهیم کرد.
معادله دیفرانسیل مرتبه اول بدون ورودی
همانطور که در آموزشهای پیشین گفتیم، در روش رانگ کوتای مرتبه اول، از مشتق در زمان t0 (در شکل زیر t0=0) برای تخمین مقدار تابع در یک گام زمانی بعد استفاده میشود. برای مثال، معادله دیفرانسیل زیر را در نظر بگیرید:
که شرایط اولیه آن y(0)=3 است. جواب دقیق این معادله y(t)=3e−2t برای t≥0 است که فرض میکنیم آن را نمیدانیم و برای ارائه یک تقریب به انتگرالگیری عددی نیاز داریم.
در شکل زیر، شیب در t=0 را k1 و تخمین را y∗(h) مینامیم که در این مثال، h=0.2 است.
بدیهی است که مقداری خطای تخمین وجود دارد که میخواهیم آن را کم کنیم. یکی از راههای نیل به این هدف، استفاده از مشتق در نقطه میانی بین t=0 و t=h=0.2 است. شیب در این نقطه (t=21h=0.1) در شکل زیر نشان داده شده و با k2 مشخص شده است. خط نارنجی نیز، در واقع خط مماس بر منحنی آبی در t=21h است.
اکنون اگر از شیب میانی k2 استفاده کنیم، تخمین بهتری نسبت به قبل برای y∗(h) خواهیم داشت. در شکل زیر، مقدار دقیق جواب y(0.1)=2.0110 و همچنین، تقریب y∗(0.1)=2.0175 برای خطایی در حدود 0.3 درصد نشان داده شدهاند. دقت کنید که در روش رانگ کوتای مرتبه اول، این خطا تقریباً 10 درصد است.
به نظر میرسد جواب تقریب بسیار مناسبی دارد و بدیهی است که دقت آن نسبت به جواب به دست آمده از روش رانگ کوتای مرتبه اول (که در آن از خطی با شیب k1 در t=0 استفاده میشد) بسیار بیشتر است. مسئلهای که با آن مواجهیم، این است که مقدار دقیق y(21h) را نمیدانیم و به همین دلیل نمیتوانیم مقدار دقیق k2 را بیابیم. لازم به یادآوری است که محاسبه مشتق نیازمند دانستن مقدار تابع است (y′(t)=−2y(t)).
یک راه برای حل این مشکل، استفاده از روش اویلر یا همان روش رانگ کوتای مرتبه اول برای به دست آوردن تقریب y(t) در t=21h=0.1 است که آن را y1(21h) مینامیم. سپس میتوانیم از این تخمین برای به دست آوردن k2 (که تقریبی از شیب در نقطه میانی است) استفاده کنیم و در نتیجه، از k2 برای یافتن y∗(t) بهره ببریم. برای رفتن از نقطه شروع در t=0 تا تخمین در t=h، فرایند زیر را انجام میدهیم:
در حالت کلی، یک گام به جلو از تخمین t=t0 تا t=t0+h به صورت زیر انجام میشود:
عبارت مشتق در t=t0: y′(t0)=−2y(t0)
مشتق در t=t0: k1=−2y(t0)
تخمین میانی تابع در t=t0+h/2: y1(t0+h/2)=y(t0)+k12h
تخمین شیب در t=t0+h/2: k2=−2y1(t0+h/2)
سری تیلور حول t=t0: y(t0+h)=y(t0)+y′(t0)h+y′′(t0)2h2+⋯
سری تیلور بریده: y(t)≈y(t0)+y′(t0)h
تخمین y(t0+h): y∗(t0+h)=y(t0)+k2h
تقریب معادله دیفرانسیل مرتبه اول بدون ورودی با استفاده از متلب
میتوانیم از متلب استفاده کنیم و محاسبات بالا را با استفاده از آن پیادهسازی کنیم. روندی که در بالا آن را توضیح دادیم، به صورت زیر در متلب پیاده میشود:
هر خط از کد بالا به خوبی مراحل الگوریتم را نشان میدهد. با تغییر اندکی در برنامه، میتوان اثر اندازه h را بر دقت جواب مشاهده کرد. شکل زیر این موضوع را به خوبی نشان میدهد. همانطور که میبینیم، هرچه مقدار h بزرگتر باشد، تقریب ضعیفتر خواهد بود.
برای حرکت رو به جلوی یک نقطه در t=t0، یعنی y∗(t0)، به اندازه یک گام زمانی h، مراحل زیر را طی میکنیم:
تخمین مشتق در t=t0: k1=f(y∗(t0),t0)
تخمین میانی تابع در t=t0+2h: y1(t0+2h)=y∗(t0)+k12h
تخمین شیب در t=t0+2h: k2=f(y1(t0+2h),t0+2h)
تخمین y(t0+h): y∗(t0+h)=y∗(t0)+k2h
دقت کنید که مقدار اولیه یا همان شرایط اولیه در ابتدای الگوریتم مشخص باشد.
از الگوریتم رانگ کوتای مرتبه دوم اغلب با نام الگوریتم نقطه میانی (Midpoint Algorithm) یاد میشود، زیرا از شیب k2 در نقطه میانی استفاده میکند.
معادله دیفرانسیل مرتبه اول با ورودی
با اضافه شدن تابع ورودی به معادله دیفرانسیل، مشکل چندانی به وجود نخواهد آمد. فقط لازم است مقدار تابع در t=t0 را برای یافتن k1 و همچنین، مقدار آن را در t=t0+21h برای یافتن k2 تضمین کنیم. برای مثال، ورودی cos(4t) را در نظر بگیرید.
y′(t)+2y(t)=cos(4t) یا y′(t)=−2y(t)+cos(4t)
بنابراین، مراحل زیر را طی میکنیم:
عبارت مشتق در t=t0: y′(t0)=−2y(t0)+cos(4t0)
تقریب مشتق در t=t0: k1=−2y∗(t0)+cos(4t0)
تخمین میانی تابع در t=t0+h/2: y1(t0+2h)=y∗(t0)+k12h
تخمین شیب در t=t0+h/2: k2=−2y1(t0+2h)+cos(t0+2h)
تخمین y(t0+h): y∗(t0+h)=y(t0)+k2h
گفتنی است که جواب دقیق این معادله y(t)=2.9e−2t+0.1cos(4t)+0.2sin(4t) است.
تقریب معادله دیفرانسیل مرتبه اول با ورودی با استفاده از متلب
میتوانیم از متلب برای محاسبات بالا استفاده کنیم. برای این تقریب جدید، باید محاسبات k1 و k2 را با استفاده از مقدار مناسب متغیر زمان تغییر دهیم. برنامه زیر در متلب مربوط به مثال اخیر است.
با کمی تغییر در برنامه بالا، میتوانیم تقریب را برای hهای مختلف رسم کنیم. همانطور که میبینیم، با کوچک شدن h، تقریبها دقیقتر خواهند بود.
معادله دیفرانسیل غیرخطی مرتبه اول
در این مورد نیز با مشکل خاصی مواجه نخواهیم بود. در اینجا نیز باید تضمین کنیم که مقدار تابع در t=t0 را برای یافتن k1 و همچنین، مقدار آن را در t=t0+21h برای یافتن k2 داریم. برای مثال، سیستم زیر را در نظر بگیرید:
dtdy(t)−y(t)(1−2t)=0,y(0)=1
میدانیم که جواب این معادله به صورت زیر است:
y(t)=et−t2
روند عددی به دست آوردن جواب معادله نیز مطابق مراحل زیر است:
عبارت مشتق در t=t0: y′(t0)=y(t0)(1−2t0)
تقریب مشتق در t=t0: k1=y∗(t0)(1−2t0)
تخمین میانی تابع در t=t0+h/2: y1(t0+2h)=y∗(t0)+k12h
تخمین شیب در t=t0+h/2: k2=−2y1(t0+2h)(1−2(t0+2h))
تخمین y(t0+h): y∗(t0+h)=y(t0)+k2h
تقریب معادله دیفرانسیل غیرخطی مرتبه اول با ورودی با استفاده از متلب
مانند مثالهای قبل، به سادگی میتوانیم برنامه تقریب معادله دیفرانسیل غیرخطی مرتبه اول با ورودی را در متلب بنویسیم. این برنامه به صورت زیر است:
شکل زیر، جواب دقیق و تقریبی معادله را به ازای hهای مختلف نشان میدهد.
همانطور که مشاهده میکنیم، با کاهش h، دقت تقریب زیاد میشود.
معادله دیفرانسیل خطی مرتبه بالاتر
معادله دیفرانسیل مرتبه بالاتر زیر را در نظر بگیرید:
$$ \large \displaylines {<br />
{ { { d ^ 3 } y ( t ) } \over { d t } } + 4 { { { d ^ 2 } y ( t ) } \over { d t } } + 6 { { d y ( t ) } \over { d t } } + 4 y ( t ) = \gamma ( t ) \quad \quad \quad \gamma ( t ) = { \rm{unit step function}} \cr<br />
{ \left . { { { { d ^ 2 } y ( t ) } \over { d t } } } \right | _ { t = { 0 ^ + } } } = 0 , \quad \quad { \left. { { { d y ( t ) } \over { d t } } } \right | _ { t = { 0 ^ + } } } = - 1 , \quad \quad y ({ 0 ^ + } ) = 0 \quad \cr } $$
سید سراج حمیدی دانشآموخته مهندسی برق است و به ریاضیات و زبان و ادبیات فارسی علاقه دارد. او آموزشهای مهندسی برق، ریاضیات و ادبیات مجله فرادرس را مینویسد.
شما در حال مطالعه نسخه آفلاین یکی از مطالب «مجله فرادرس» هستید. لطفاً توجه داشته باشید، ممکن است برخی از قابلیتهای تعاملی مطالب، مانند امکان پاسخ به پرسشهای چهار گزینهای و مشاهده جواب صحیح آنها، نمایش نتیجه آزمونها، پاسخ تشریحی سوالات، پخش فایلهای صوتی و تصویری و غیره، در این نسخه در دسترس نباشند. برای دسترسی به نسخه آنلاین مطلب، استفاده از کلیه امکانات آن و داشتن تجربه کاربری بهتر اینجا کلیک کنید.