МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Курсова робота
з курсу:
"Комп'ютерні методи дослідження інформаційних процесів і систем"
на тему:
"Метод Рунге-Кутта 4 порядку. Метод Рунге-Кутта 3 порядку"
Тема 6, варіант 8
ЛЬВІВ 2018
Зміст
1. Постановка задачі 3
2.Теоретичні відомості 5
2.1.Метод Рунге-Кутта четвертого порядку 5
2.2.Метод Рунге-Кутта третього порядку 7
3.Код програми 8
3.1.Метод Рунге-Кутта четвертого порядку 8
3.2.Метод Рунге-Кутта третього порядку 10
4.Результати виконання програми 14
4.1.Метод Рунге-Кутта четвертого порядку 14
4.2.Метод Рунге-Кутта третього порядку 17
5.Графік зміни величини у3(t) 23
5.1.Метод Рунге-Кутта четвертого порядку 23
5.2.Метод Рунге-Кутта третього порядку 23
Висновки 24
Список літератури: 25
1. Постановка задачі
При початкових параметрах
Параметри
8
TМ.
0.3
TЕ
0.03
С
3
KU
102
S
1
i
12
Система рівнянь у нормальній формі:
Початкові умови:
y1(0)=0
y2(0)=0
y3(0)=0
1. Навести таблицю значень.
2. Побудувати графік зміни величини
2.Теоретичні відомості
2.1.Метод Рунге-Кутта четвертого порядку
В методі Рунге-Кутта значення функції , як і в методі Ейлера, визначається за формулою
Якщо розкласти функцію в ряд Тейлора і обмежитись членами до включно, то приріст можна записати у вигляді
(10)
Замість того, щоб обчислювати члени ряду за формулою (10) в методі Рунге-Кутта використовують наступні формули.
Похибка на кожному кроці має порядок . Таким чином метод Рунге-Кутта забезпечує значно вищу точність ніж метод Ейлера, однак вимагає більшого об’єму обчислень.
Деколи зустрічається інша форма представлення методу Рунге-Кутта 4-го порядку точності.
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
Маємо
- значення незалежної змінної в точці
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
обчислення повторюються з кроком і т.д., доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
2.2.Метод Рунге-Кутта третього порядку
Метод Рунге-Кутта третього порядку схожу до методу Рунге-Кутта четвертого порядку.
Якщо розкласти функцію в ряд Тейлора і обмежитись членами до включно, то приріст можна записати у вигляді
(10)
Замість того, щоб обчислювати члени ряду за формулою (10) в методі Рунге-Кутта використовують наступні формули.
3.Код програми
3.1.Метод Рунге-Кутта четвертого порядку
using System;
using System.IO;
namespace РК4
{
class Realization
{
static void Main()
{
Method method = new Method();
method.Equation();
method.RK4();
method.OutputResult();
}
}
class Method
{
const int n = 3;
const int a = 0;
double b = 10;
double h = 0.01;
double e = 0.001;
double Tm = 0.3, Te = 0.03;
int Ku = 100, S = 1, i = 12, C = 3;
double[] y = new double[n];
double[] Y = new double[n];
double[] dy = new double[n];
double[] k1 = new double[n];
double[] k2 = new double[n];
double[] k3 = new double[n];
double[] k4 = new double[n];
double[] z = new double[n];
double x;
public void Equation()
{
dy[0] = y[1];
dy[1] = (C * S * Ku * (1 - y[2]) - y[0] - Tm * y[1]) / (Tm * Te);
dy[2] = y[0] / i;
}
public void RK4()
{
Equation();
for (int i = 0; i < n; i++)
{
k1[i] = dy[i];
z[i] = y[i];
y[i] = z[i] + 0.5 * h * k1[i];
}
x += 0.5 * h;
Equation();
for (int i = 0; i < n; i++)
{
k2[i] = dy[i];
y[i] = z[i] + 0.5 * h * k2[i];
}
Equation();
for (int i = 0; i < n; i++)
{
k3[i] = dy[i];
y[i] = z[i] + h * k3[i];
}
x += 0.5 * h;
Equation();
for (int i = 0; i < n; i++)
{
k4[i] = dy[i];
y[i] = z[i] + h * (k1[i] + k4[i] + 2 * (k2[i] + k3[i])) / 6;
}
}
public void Firts()
{
for (int i = 0; i < n; i++)
{
Y[i] = y[i];
}
}
public void Second()
{
for (int i = 0; i < n; i++)
{
y[i] = Y[i];
}
}
public void OutputResult()
{
for (int i = 0; i < n; i++)
{
y[i] = 0.0;
}
x = a;
StreamWriter result = new StreamWriter("ResultРК4.txt");
result.WriteLine("t\ty3(t)");
do
{
Firts();
RK4();
double y1 = y[2];
Second();
x -= h;
h /= 2.0;
RK4();
double y2 = y[2];
RK4();
bool P = true;
bool K = false;
do
{
if (Math.Abs(y[2] - y1) <= e)
{
P = false;
if (K)
{
RK4();
Console.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
result.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
}
else
{
h *= 2;
RK4();
Console.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
result.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
}
}
else
{
x -= 2 * h;
h /= 2.0;
K = true;
Second();
y1 = y2;
RK4();
y2 = y[1];
RK4();
}
}
while (P);
}
while (x < b);
result.Close();
}
}
}
3.2.Метод Рунге-Кутта третього порядку
using System;
using System.IO;
namespace РК3
{
class Realization
{
static void Main()
{
Method method = new Method();
method.Equation();
method.RK3();
method.OutputResult();
}
}
class Method
{
const int n = 3;
const int a = 0;
double b = 10;
double h = 0.01;
double e = 0.001;
double Tm = 0.3, Te = 0.03;
int Ku = 100, S = 1, i = 12, C = 3;
double[] y = new double[n];
double[] Y = new double[n];
double[] dy = new double[n];
double[] k1 = new double[n];
double[] k2 = new double[n];
double[] k3 = new double[n];
double[] z = new double[n];
double x;
public void Equation()
{
dy[0] = y[1];
dy[1] = (C * S * Ku * (1 - y[2]) - y[0] - Tm * y[1]) / (Tm * Te);
dy[2] = y[0] / i;
}
public void RK3()
{
Equation();
for (int i = 0; i < n; i++)
{
k1[i] = dy[i];
z[i] = y[i];
y[i] = z[i] + 0.5 * h * k1[i];
}
x += 0.5 * h;
Equation();
for (int i = 0; i < n; i++)
{
k2[i] = dy[i];
y[i] = z[i] + h * k2[i];
}
x += 0.5 * h;
Equation();
for (int i = 0; i < n; i++)
{
k3[i] = dy[i];
y[i] = z[i] + h * (k1[i] + 4 * k2[i] + k3[i]) / 6;
}
}
public void Firts()
{
for (int i = 0; i < n; i++)
{
Y[i] = y[i];
}
}
public void Second()
{
for (int i = 0; i < n; i++)
{
y[i] = Y[i];
}
}
public void OutputResult()
{
for (int i = 0; i < n; i++)
{
y[i] = 0.0;
}
x = a;
StreamWriter result = new StreamWriter("ResultРК3.txt");
result.WriteLine("t\ty3(t)");
do
{
Firts();
RK3();
double y1 = y[2];
Second();
x -= h;
h /= 2.0;
RK3();
double y2 = y[2];
RK3();
bool P = true;
bool K = false;
do
{
if (Math.Abs(y[2] - y1) <= e)
{
P = false;
if (K)
{
RK3();
Console.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
result.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
}
else
{
h *= 2;
RK3();
Console.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
result.WriteLine($"{x:0.#####}\t{y[2]:0.###}");
}
}
else
{
x -= 2 * h;
h /= 2.0;
K = true;
Second();
y1 = y2;
RK3();
y2 = y[1];
RK3();
}
}
while (P);
}
while (x < b);
result.Close();
}
}
}
4.Результати виконання програми
Метод Рунге-Кутта третього порядку
Метод Рунге-Кутта четвертого порядку
t
y3(t)
t
y3(t)
0,02
0,003
0,02
0,003
0,4
1,809
0,4
1,81
0,8
0,497
0,8
0,495
1,2
1,142
1,2
1,145
1,6
,161
1,6
1,157
2
0,663
2
0,666
2,4
1,372
2,4
1,372
2,8
0,704
2,8
0,703
3,2
1,159
3,2
1,162
3,6
0,985
3,6
0,981
4
0,906
4
0,909
4,4
1,147
4,4
1,146
4,8
0,855
4,8
0,854
5,2
1,104
5,2
1,106
5,6
0,954
5,6
0,952
6
0,99
6
0,992
6,4
1,047
6,4
1,046
6,8
0,938
6,8
0,939
7,2
1,055
7,2
1,056
7,6
0,965
7,6
0,964
7,8
1,038
7,8
1,037
8
1,011
8
1,012
8,4
1,01
8,4
1,009
8,8
0,978
8,8
0,979
9,2
1,025
9,2
1,025
9,6
0,98
9,6
0,979
10
1,011
10
1,012
5.Графік зміни величини у3(t)
5.1.Метод Рунге-Кутта четвертого порядку
/
5.2.Метод Рунге-Кутта третього порядку
/
Висновки
В даній роботі розглянуто застосування методів Рунге-Кутта четвертого та третього порядків з автоматичною зміною для дослідження системи диференціальних рівнянь. Можна зробити висновок, що метод Рунге-Кутта четвертого порядку забезпечує значно вищу точність ніж метод Рунге-Кутта третього порядку, однак вимагає більшого об’єму обчислень, а завдяки автоматичній змінні кроку можна досягти зменшення загального числа кроків в декілька разів. Розв’язок поставленої задачі представлений мовою С#. Графіки уточнень побудовані в середовищі MS Excel.
Список літератури:1. Шаповаленко В. А. Чисельні методи моделювання об’єктів: метод. вказів-
ки для лаб. та практ. занять. Модуль 2. / Шаповаленко В. А., Буката Л. М., Тро-
фименко О. Г. – Одеса: ВЦ ОНАЗ, 2011. – Ч. 2. – 72 с.2. Шаповаленко В. А. Чисельне обчислення функцій, характеристик матриць
і розв’язування нелінійних рівнянь та систем рівнянь: Навч. посібник / Шапо-
валенко В. А., Буката Л. М., Трофименко О. Г. – Одеса: ВЦ ОНАЗ, 2010. – Ч. 1. –88 с.3. Гаврилюк І. П., Макаров В. Методи обчислень: Підручник 1995.
4. Каханер Д., Моулер К., Нэш С. Численные методы и программное обеспечение. – М.: Мир, 1998. –570 с.
5. Коссак О., Тумашова О., Коссак О. Методи наближених обчислень: Навч.посібн. – Львів: Бак, 2003. – 168 с.