МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
„ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра захисту інформації
З В І Т
До лабораторної роботи №6
з курсу:
„ Комп’ютерні методи дослідження
інформаційних процесів та систем ”
на тему:
«Методи чисельного розв’язування
диференціальних рівнянь»
Варіант 10
Мета роботи:
Ознайомлення з методами чисельного розв’язування диференційних рівнянь.
Вступ
Диференціальне рівняння (ДР), що містить лише одну незалежну змінну і похідні за нею, називають звичайними (ДР). ДР, що містить декілька незалежних змінних і похідні за ними, називають рівняння в частинних похідних
Порядком ДР називається найвищий порядок похідної (або диференціалу), який входить в рівняння. Звичайне ДР (ЗДР) -го порядку в загальному випадку має незалежну змінну, невідому функцію та її похідні до -го порядку включно:
(1)
- незалежна змінна;
- невідома функція (залежна змінна);
- похідні цієї функції.
Диференціальне рівняння -го порядку, розв’язане відносно старшої похідної, може бути записано у вигляді:
(2)
Щоб розв’язати ЗДР, необхідно мати значення залежної змінної та (або) її похідних при деяких значення незалежної змінної.
Якщо ці значення задані при одному значенні незалежної змінної - така задача називається задачею з початковими умовами або задачею Коші, а при або більше значеннях незалежної змінної - задача називається крайовою.
Значення залежної змінної та її похідних називаються додатковими умовами, котрі в задачі Коші називаються початковими, а в крайовій задачі - граничними.
Задача Коші
Задача Коші формулюється так:
Нехай задане ДР
(3)
з початковими умовами . Потрібно знайти функцію , що задовольняє дане рівняння та початкову умову. Для одержання чисельний розв’язку цієї задачі спочатку обчислюють значення похідної, а потім задаючи малий приріст, переходять до нової точки
Положення нової точки визначають за нахилом кривої, обчисленому з допомогою ДР. Таким чином, графік чисельного розв’язку являє собою послідовність коротких прямолінійних відрізків, якими апроксимується істинна крива . Сам чисельний метод визначає порядок дій при переході від даної точки кривої до наступної.
Існують дві групи методів розв’язування задачі Коші.
Однокрокові методи. В них для знаходження наступної точки на кривій потрібна інформація лише про попередній крок.
Багатокрокові. Для знаходження наступної точки кривої вимагається інформація більш ніж про одну з попередніх точок.
Всі ці методи розв’язування ДР дають розв’язок у вигляді таблиці значень.
Методи з автоматичною зміною кроку
Застосовуються в тому випадку, якщо розв’язок потрібно одержати із заданою точністю. При високій точності (похибка ) автоматична зміна кроку забезпечує зменшення загального числа кроків в декілька разів (особливо при розв’язках у вигляді кривих, що сильно відрізняються крутизною).
Метод Рунге-Кутта-Фельберга з автоматичною зміною кроку
Це метод четвертого порядку, дає більш точну оцінку похибки (порівняно з методом Рунге-Кутта-Мерсона) на кожному кроці і реалізується послідовним циклічним обчисленням за наступними формулами:
Похибка
Якщо
а) , крок зменшується в двічі
б) Якщо , крок збільшується вдвічі.
Час розрахунку для однієї точки удвічі більший, ніж для методу Рунге-Кутта-Мерсона
2. ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ
Розв’язати чисельним методом диференціальне рівняння.
10
Блок схема програми
+
-
-
+
Список індентифікаторів, змінних, функцій, використаних у блок-схемі алгоритму і програмі, та їх пояснення
class Program – клас, в якому оголошений метод Main;
class RungeKuFelberg –клас, в якому оголошені методи f, Metod;
public void f – метод обчислення функції;
public void Metod – метод обчислення диференціального рівняння з автоматичним вибором кроку;
static void Main(string[] args) – головна функція;
robly –екземпляр класу RungeKuFelberg;
x, y, h, E,R,Y - змінні типу double;
i – змінна типу int;
Текст програми:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace laba6
{
class Program
{
static void Main(string[] args)
{
RungeKuFelberg robly = new RungeKuFelberg();
robly.Metod();
Console.ReadLine();
}
}
class RungeKuFelberg
{
double x, y, h, k1, k2, k3, k4, k5, k6, R, E = 0.001, Y;
int i;
public double f(double X, double Y)
{
return Math.Cos(Math.Pow(X, 2)) + Math.Sin(Math.Pow(Y, 3));
}
public void Metod()
{
x = 0; y = 1;
for (x = 0; x <= 1; i++)
{
h = 0.01;
do
{
k1 = h * f(x, y);
k2 = h * f(x + h * 2 / 9, y + 2 * k1 / 9);
k3 = h * f(x + h * 1 / 3, y + k1 * 1 / 12 + k2 * 1 / 4);
k4 = h * f(x + h * 3 / 4, (y + k1 * 69 / 128) - k2 * 143 / 128 + k3 * 135 / 64);
k5 = h * f(x + h, (y + k1 * 17 / 12 + k2 * 27 / 4 - k3 * 27 / 5 + k4 * 16 / 15));
k6 = h * f(x + h * 5/6,(y+k1*65/432)-(k2*5/16)+(k3*13/16)+(k4*4/27)+(k5 *5/144));
Y = f(x, y) + k1 * 1 / 9 - k3 * 3 / 100 + k4 * 16 / 45 + k5 * 1 / 12;
R = k1 * 1 / 150 - k3 * 3 / 100 + k4 * 16 / 75 + k5 * 1 / 20 - k6 * 6 / 25;
if (Math.Abs(R) > E)
{
h /= 2;
}
if (Math.Abs(R) < E / 30)
{
h *= 2;
}
else
{
Console.WriteLine("y= " + Y + "\tx= " + x);
x += h;
}
}
while (Math.Abs(R) > E);
}
}
}
}
Результат виконання програми:
y= 1,85128370998275 x= 0
y= 1,85128370475665 x= 0,01
y= 1,85128362857824 x= 0,02
y= 1,85128330007922 x= 0,03
y= 1,85128241725352 x= 0,04
y= 1,85128055745783 x= 0,05
y= 1,85127717741295 x= 0,06
y= 1,8512716132065 x= 0,07
y= 1,85126308029783 x= 0,08
y= 1,85125067352596 x= 0,09
y= 1,85123336712177 x= 0,1
y= 1,85121001472557 x= 0,11
y= 1,85117934941166 x= 0,12
y= 1,85113998372123 x= 0,13
y= 1,85109040970568 x= 0,14
y= 1,85102899898204 x= 0,15
y= 1,85095400280276 x= 0,16
y= 1,85086355214206 x= 0,17
y= 1,85075565780135 x= 0,18
y= 1,8506282105363 x= 0,19
y= 1,8504789812083 x= 0,2
y= 1,85030562096335 x= 0,21
y= 1,85010566144143 x= 0,22
y= 1,84987651501964 x= 0,23
y= 1,84961547509251 x= 0,24
y= 1,84931971639323 x= 0,25
y= 1,84898629535933 x= 0,26
y= 1,84861215054699 x= 0,27
y= 1,84819410309791 x= 0,28
y= 1,84772885726303 x= 0,29
y= 1,84721300098749 x= 0,3
y= 1,84664300656141 x= 0,31
y= 1,84601523134123 x= 0,32
y= 1,84532591854635 x= 0,33
y= 1,84457119813621 x= 0,34
y= 1,84374708777285 x= 0,35
y= 1,84284949387433 x= 0,36
y= 1,84187421276437 x= 0,37
y= 1,84081693192373 x= 0,38
y= 1,83967323134917 x= 0,39
y= 1,83843858502555 x= 0,4
y= 1,83710836251724 x= 0,41
y= 1,83567783068472 x= 0,42
y= 1,8341421555325 x= 0,43
y= 1,83249640419472 x= 0,44
y= 1,83073554706462 x= 0,45
y= 1,82885446007435 x= 0,46
y= 1,82684792713163 x= 0,47
y= 1,82471064271976 x= 0,48
y= 1,8224372146676 x= 0,49
y= 1,8200221670962 x= 0,5
y= 1,81745994354874 x= 0,51
y= 1,81474491031049 x= 0,52
y= 1,81187135992555 x= 0,53
y= 1,80883351491708 x= 0,54
y= 1,80562553171767 x= 0,55
y= 1,80224150481669 x= 0,56
y= 1,79867547113106 x= 0,57
y= 1,79492141460613 x= 0,58
y= 1,79097327105326 x= 0,59
y= 1,78682493323029 x= 0,6
y= 1,78247025617139 x= 0,61
y= 1,77790306277241 x= 0,62
y= 1,77311714963768 x= 0,63
y= 1,76810629319423 x= 0,64
y= 1,76286425607895 x= 0,65
y= 1,75738479380428 x= 0,66
y= 1,75166166170748 x= 0,67
y= 1,74568862218854 x= 0,68
y= 1,7394594522413 x= 0,69
y= 1,73296795128217 x= 0,7
y= 1,7262079492804 x= 0,71
y= 1,71917331519354 x= 0,72
y= 1,71185796571139 x= 0,73
y= 1,70425587431103 x= 0,74
y= 1,69636108062557 x= 0,75
y= 1,68816770012818 x= 0,76
y= 1,67966993413292 x= 0,77
y= 1,67086208011309 x= 0,78
y= 1,66173854233725 x= 0,79
y= 1,65229384282249 x= 0,8
y= 1,64252263260394 x= 0,810000000000001
y= 1,63241970331856 x= 0,820000000000001
y= 1,62197999910093 x= 0,830000000000001
y= 1,61119862878747 x= 0,840000000000001
y= 1,60007087842534 x= 0,850000000000001
y= 1,58859222408078 x= 0,860000000000001
y= 1,57675834494134 x= 0,870000000000001
y= 1,56456513670513 x= 0,880000000000001
y= 1,55200872524952 x= 0,890000000000001
y= 1,53908548057055 x= 0,900000000000001
y= 1,5257920309834 x= 0,910000000000001
y= 1,51212527757328 x= 0,920000000000001
y= 1,4980824088846 x= 0,930000000000001
y= 1,48366091583576 x= 0,940000000000001
y= 1,46885860684513 x= 0,950000000000001
y= 1,45367362315295 x= 0,960000000000001
y= 1,43810445432248 x= 0,970000000000001
y= 1,42214995390251 x= 0,980000000000001
y= 1,40580935523191 x= 0,990000000000001
Висновок:
На цій лабораторній роботі я склав програму мовою С# і ознайомився з методом Рунге-Кутта-Фельберга з автоматичною зміною кроку для розв’язування рівнянь