МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ імені Володимира Даля Кафедра Інформаційних технологій та програмування КУРСОВА РОБОТА З дисципліни: «Чисельні методи» Тема: метод Рунге-Кути
Група:
Захищенна з оцінкою:
Дата: Календарний план
ЗмістКалендарний план 2 Вступ 4 Розділ 1 6 1.1 Суть методу Рунге-Кути 6 1.2.Призначення та сфера застосування 12 Розділ 2 13 2.1 Постановка задачі та розробка алгоритму розв'язання задачі 13 2.2 Програмна реалізація в C# 13 Висновок 17 Cписок використаної літератури 18 Додаток А 19 Програма для знаходження наближеного рішення звичайного диференціального рівняння методом Рунге-Кути 19 ВступАктуальність теми в тому, що найпопулярніший метод розв'язання задачі Коші – метод Рунге-Кутта. Цей метод дозволяє будувати формули розрахунку наближеного рішення практично будь-якого порядку точності. Формально, методом Рунге — Кутти є модифікований та виправлений метод Ейлера, вони є схемами другого порядку точності. Існують стандартні схеми третього порядку, які не набули широкого поширення. Найчастіше використовується та реалізована в різних математичних пакетах (Maple, MathCAD, Maxima) стандартна схема четвертого порядку. Іноді під час виконання розрахунків із підвищеною точністю застосовуються схеми п'ятого і шостого порядків. Побудова схем вищого порядку пов'язані з великими обчислювальними труднощами. Методи сьомого порядку повинні мати щонайменше дев'ять стадій, до схеми восьмого порядку входить 11 стадій. Хоча схеми дев'ятого порядку немає великої практичної значимості, невідомо, скільки стадій необхідно задля досягнення цього порядку точності. Аналогічне завдання існує для схем десятого і вищих порядків.[1] Метою курсової є: написати програму для знаходження наближеного рішення звичайного диференціального рівняння , методом Рунге-Кути четвертого порядку на відрізку [a,b] із заданим постійним кроком h. Для досягнення цієї мети необхідно виконати такі завдання: 1. Розглянути суть методу Рунге-Кути. 2. Призначення та сфера застосування. 3. Протестувати програму. Це завдання відноситься до чисельних методів. Потрібно визначити рішення звичайного диференціального рівняння з постійним кроком h. Для вирішення завдання буде використовуватися мова програмування C#, так як ця мова дозволяє працювати з математичними формулами, проводити різноманітні математичні операції та дії. У математичних завданнях часто потрібно реалізувати чисельні методи, експериментально досліджувати умову та швидкість збіжності методів. У разі завдання, зазвичай, дається основна ідея кожного методу (Ейлера, Рунге-Кутта тощо.). Обчислення функції та її похідної, що використовується у задачі, рекомендується оформляти у вигляді підпрограм, так, щоб можна було представляти будь-яку функцію, не змінюючи самої програми. Похибка, початкова умова та параметр алгоритму задаються введенням. Там, де це можливо, рекомендується тестувати алгоритм на прикладах, котрим відомо чи може бути знайдено аналітично точне рішення. Розділ 11.1 Суть методу Рунге-КутиМетод Рунге-Кути включає кілька інших таких як: метод Ейлера і метод Ейлера - Коші. Методи Рунге-Кути мають такі властивості: 1. Ці методи є одноступінчастими: щоб знайти потрібна інформація про попередню точку 2 Вони узгоджуються з рядом Тейлора аж до членів порядку де ступінь р різна для різних методів і називається порядковим номером або методом 3 Вони не вимагають обчислення похідних від , а вимагають обчислення самої функції[2] Розглянемо спочатку геометричну побудову і виведемо деякі формули на основі геометричних аналогій. Після цього ми підтвердимо отримані результати аналітично (Аналітичний метод, застосовується якого дає рішення диференціального рівняння у вигляді аналітичного виразу; Графічний метод, що дає наближене рішення у вигляді графіка; Чисельний потрібна функція виходить у вигляді таблиці.) Припустимо нам відома точка на кривій, що шукається. Тоді ми можемо провести пряму лінію з тангенсом кута нахилу , яка пройде через точку . Ця побудова показана на рис.1.1 де крива являє собою точне, але звичайно невідоме рішення рівняння, а пряма лінія L1 побудована так як це щойно описано: (рис.1.1) Тоді наступною точкою рішення можна вважати ту, де пряма L1 перетне ординату, проведену через точку . Рівняння прямої L1 виглядає так: так як і крім того тоді рівняння набуде вигляду (1.1) Помилка при показана у вигляді відрізка е. Очевидно, знайдене таким чином наближене значення узгоджується з розкладанням у ряд Тейлора аж до членів порядку h, так що помилка обмеження дорівнює . Зауважимо, що хоча точка на рис.1 була показана на кривій насправді є наближеним значенням і не лежить точно на кривій. Формула 1.1 описує метод Ейлера один з найстаріших і широко відомих методів чисельного інтегрування диференціальних рівнянь. Зазначимо, що метод Ейлера є одним з методів Рунге-Кути першого порядку.[1] Розглянемо виправлений метод Ейлера та модифікаційний метод Ейлера. У виправленому методі Ейлера ми знаходимо середній тангенс кута нахилу дотичної для двох точок: і . Остання точка є та сама, яка в методі Ейлера позначалася . За допомогою методу Ейлера знаходиться точка лежача на прямій L1. У цій точці знову обчислюється тангенс дає пряму . Нарешті через точку ми проводимо пряму паралельну . Точка в якій пряма перетнеться з ординатою відновленою і буде шуканою точкою . Тангенс кута нахилу прямої та прямої дорівнює (1.2) Де (1.3) Рівняння лінії у своїй записується як так що (1.4) Співвідношення (1.2), (1.3), (1.4) описують виправлений метод Ейлера (рис.2) Щоб з'ясувати, наскільки добре цей метод узгоджується з розкладанням в ряд Тейлора, пригадаємо, що розкладання в ряд функції можна записати так: (1.5) де приватні похідні обчислюються при та . Підставляючи у формулу (1.5) та і використовуючи вираз (1.3) для отримуємо де знову функція та її похідні обчислюються в точці . Підставляючи результат у (1.2) і роблячи необхідні перетворення отримуємо Підставимо отриманий вираз у 1.4 і порівняємо з рядом Тейлора . Як бачимо, виправлений метод Ейлера узгоджується з розкладанням в ряд Тейлора аж до членів ступеня , будучи, таким чином, методом Рунге-Кутти другого порядку. Розглянемо модифікаційний метод Ейлера. Розглянемо рис.3 де початкова побудова зроблена так само, як і на рис.2. Але цього разу ми беремо точку, що лежить на перетині цієї прямої та ординатою . На рисунку ця точка утворена через Р, та її ордината дорівнює . Обчислимо тангенс кута нахилу дотичної в цій точці , (1.6) де (1.7) Пряма з таким нахилом проходить через позначена через . Після цього, ми проводимо через точку пряму паралельну і позначаємо її через . Перетин цієї прямої з ординатою і дасть точку , що шукається, Рівняння прямої можна записати в вигляді де F задається формулою (1.6). Тому Співвідношення (1.6), (1.7), (1.8) описують так званий модифікаційний метод Ейлера і є ще одним методом Рунге-Кути другого порядку. (1.9) і в обох випадках F має вигляд (1.10) Де (1.11) Зокрема для виправленого методу Ейлера рис.3 У той час як для модифікаційного методу Ейлера . Формули (1.9), (1.10), (1.11) описують деякий метод типу Рунге-Кути. Подивимося, якого порядку метод можна розраховувати отримати в кращому випадку і які допустимі значення параметрів . Щоб отримати відповідність ряду Тейлора аж до членів ступеня h у загальному випадку достатньо одного параметра Щоб отримати узгодження аж до членів ступеня h2, потрібно ще два параметри, оскільки необхідно враховувати члени і . Так як у нас є всього чотири параметри, три з яких будуть потрібні для створення узгодження з рядом Тейлора аж до членів порядку h2, те найкраще, що тут можна розраховувати - це метод другого порядку. У розкладанні в ряд (1.5) в околиці точки покладемо , . Тоді , де функція та похідні у правій частині рівності обчислені у точці Тоді (1.9) можна переписати у вигляді Порівнявши цю формулу з розкладанням у ряд Тейлора можна переписати у вигляді Якщо вимагати збігу членів . Порівнюючи члени, що містять . Порівнюючи члени містять . Так як ми дійшли трьох рівнянь для визначення чотирьох невідомих то одне з цих невідомих можна задати довільно виключаючи може бути нуль залежно від того який параметр взяти в якості довільного Покладемо наприклад тоді і співвідношення (1.9), (1.10), (1.11) зведуть до (1.12) Це найбільш загальна форма запису методу Рунге-Кутта другого порядку При ми отримуємо виправлений метод Ейлера при отримуємо модифікаційний метод Ейлера (1.13) Методи Рунге-Кути третього та четвертого порядків можна вивести абсолютно аналогічно тому, як це робилося під час виведення методів першого та другого порядків. Ми не відтворюватимемо викладки, а обмежимося тим, що наведемо формули, що описують метод четвертого порядку, один із найбільш уживаних методів інтегрування диференціальних рівнянь. Цей класичний метод Рунге-Кути описується системою наступних п'яти співвідношень.[4] (1.14) Де , (1.15) (1.16) (1.17) (1.18) Помилка обмеження цього методу дорівнює отже, формули 1.14-1.18 описують метод четвертого порядку. Зауважимо, що при використанні цього методу функцію необхідно обчислювати чотири рази. 1.2.Призначення та сфера застосуванняЦе завдання може застосовуватися в математичних дисциплінах, таких як чисельні методи, математичні методи і т.д. Широке сімейство методів наближеного розв'язання диференціальних рівнянь ґрунтується на веденні сітки та заміні похідних. Даний крок дозволяє позбутися такого незручного для комп'ютера об'єкта, як похідна, замінивши вихідне завдання алгебраїчним завданням. У загальному випадку метод Рунге-Кути є n-кроковим методом. На інтервалі [t0, t1] є послідовність точок, і для цих точок обчислюються нахили дотичних до графіку функції. Отримавши кілька значень, використовуємо зважене середнє для побудови відрізка лінії, що йде з початкової точки. Робиться це для того, щоб обчислити оцінку рішення у наступній точці. Потім обчислюється нахил у цій точці тощо. Це геометричне тлумачення методів Рунге-Кута. Числові коефіцієнти вибираються з міркувань точності; Способи Рунге-Кута різняться методом вибору цих коефіцієнтів. Методи Рунге – Кути при m>5 не використовуються.[3] Розділ 22.1 Постановка задачі та розробка алгоритму розв'язання задачіЗнайти наближене рішення звичайного диференціального рівняння методом Рунге-Кутта четвертого порядку на відрізку [a,b] із постійним кроком h. Значення функції y(x) у вузлових точках обчислюються за такою формулою: 2.2 Програмна реалізація в C#Перед тим, як розв’язати систему в мові програмування С#, дослідимо це середовище та дізнаємося трохи теоретичного матеріалу. Попереднє було сказано про цю мову, але варто розповісти детальніше. Не буде зайвим перерахувати переваги та недоліки С# Переваги: Велика безпека Зручний для написання та перевірки Можливість писати узагальнений код за допомогою шаблонів Можливість використовувати об'єктно-орієнтований підхід Спрощення коду за рахунок перевантаження функцій та операторів Простіша обробка помилок за рахунок винятків[8] Універсальність C# - ще одна значна перевага даної мови програмування. Оволодівши основами, розробник зможе писати на C# прості десктопні програми для Windows за допомогою Windows Forms, складніші програми для Windows та Linux, ігри для різних платформ (включаючи Windows та Android), серверну частину сайтів (back-end), програмне забеспечення з поєднанням бази даних, тощо. Недоліки: Довга компіляція Більший обсяг згенерованого машинного коду.[7] Реалізування цього методу відбудеться в середовищі програмування Microsoft Visual Studio «(Зображення 1)». Зображення 2.1 – Інтерфейс Microsoft Visual Studio Перейдемо до коду програмування: Зображення 2.2 – Код програми Зображення 2.3 – Продовження Зображення 2.4 – Продовження Зображення 2.5 – Результат ВисновокУ ході виконання курсової роботи виконана мета: знайти наближене рішення звичайного диференціального рівняння методом Рунге-Кути четвертого порядку на відрізку [a,b] із постійним кроком h. Значення функції y(x) у вузлових точках обчислюються за такою формулою: З використанням мови програмування C# було знайдено рішення звичайного диференціального рівняння. Обчислення функції, що використовується в задачі, оформив у вигляді підпрограми так, щоб можна було уявити будь-яку функцію, не змінюючи самої програми. Cписок використаної літературиБахвалов Н.С. Численные методы учебник для ВЗУов М., Наука, 1978 Воробьева Г.Н. Данилова А.Н. Практикум по численным методам: М., учебник 1987 Демидович Б.П. и Марон И.А. Основы вычислительной математики учебник для ВЗУов издание четвертое М., Наука, 1970 Каханер Дэвид. Численные методы и программное обеспечение учебник для ВЗУов М., Мир, 1998 Новикова Ф.А Дискретная математика для программистов. С.-П., издание Питер 2001. Турчак Л.И. Основы численных методов учебник для ВЗУов М., Знание, 1987 Скит. C# для профессионалов. Тонкости программирования Албахари. C# 7.0. Карманный справочник Додаток АПрограма для знаходження наближеного рішення звичайного диференціального рівняння методом Рунге-Кутиusing System; namespace RungeKutta { class Program { static void Main(string[] args) { //Incrementers to pass into the known solution double t = 0.0; double T = 10.0; double dt = 0.1; // Assign the number of elements needed for the arrays int n = (int)(((T - t) / dt)) + 1; // Initialize the arrays for the time index 's' and estimates 'y' at each index 'i' double[] y = new double[n]; double[] s = new double[n]; // RK4 Variables double dy1; double dy2; double dy3; double dy4; // RK4 Initializations int i = 0; s[i] = 0.0; y[i] = 1.0; Console.WriteLine(" ===================================== "); Console.WriteLine(" Beging 4th Order Runge Kutta Method "); Console.WriteLine(" ===================================== "); Console.WriteLine(); Console.WriteLine(" Given the example Differential equation: \n"); Console.WriteLine(" y' = t*sqrt(y) \n"); Console.WriteLine(" With the initial conditions: \n"); Console.WriteLine(" t0 = 0" + ", y(0) = 1.0 \n"); Console.WriteLine(" Whose exact solution is known to be: \n"); Console.WriteLine(" y(t) = 1/16*(t^2 + 4)^2 \n"); Console.WriteLine(" Solve the given equations over the range t = 0...10 with a step value dt = 0.1 \n"); Console.WriteLine(" Print the calculated values of y at whole numbered t's (0.0,1.0,...10.0) along with the error \n"); Console.WriteLine(); Console.WriteLine(" y(t) " + "RK4" + " ".PadRight(18) + "Absolute Error"); Console.WriteLine(" -------------------------------------------------"); Console.WriteLine(" y(0) " + y[i] + " ".PadRight(20) + (y[i] - solution(s[i]))); // Iterate and implement the Rk4 Algorithm while (i < y.Length - 1) { dy1 = dt * equation(s[i], y[i]); dy2 = dt * equation(s[i] + dt / 2, y[i] + dy1 / 2); dy3 = dt * equation(s[i] + dt / 2, y[i] + dy2 / 2); dy4 = dt * equation(s[i] + dt, y[i] + dy3); s[i + 1] = s[i] + dt; y[i + 1] = y[i] + (dy1 + 2 * dy2 + 2 * dy3 + dy4) / 6; double error = Math.Abs(y[i + 1] - solution(s[i + 1])); double t_rounded = Math.Round(t + dt, 2); if (t_rounded % 1 == 0) { Console.WriteLine(" y(" + t_rounded + ")" + " " + y[i + 1] + " ".PadRight(5) + (error)); } i++; t += dt; };//End Rk4 Console.ReadLine(); } // Differential Equation public static double equation(double t, double y) { double y_prime; return y_prime = t * Math.Sqrt(y); } // Exact Solution public static double solution(double t) { double actual; actual = Math.Pow((Math.Pow(t, 2) + 4), 2) / 16; return actual; } } } |