Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
ЗІ
З В І Т
До лабораторної роботи №6
з курсу:
„ Комп'ютерні методи дослідження інформаційних процесів і систем”
Варіант 13
Львів 2013
ЗАВДАННЯ: розв’язати диференційне рівняння при умові у(0)=3 методом Рунге-Кутта з автоматичною зміною кроку.
Короткі теоретичні відомості
Метод Рунге-Кутта з автоматичною зміною кроку
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
Маємо
- значення незалежної змінної в точці
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
обчислення повторюються з кроком і т.д., доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
ТЕКСТ ПРОГРАМИ:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int i = 0, j = 0;
double x = 0;
double y = 3;
double y1, y2, y3;
double h = 0.01;
double E = 0.001;
double K1, K2, K3, K4, K, KK;
{
for (x = 0; x <= 1; i++)
{
K = 0;
KK = 0;
K1 = Math.Sqrt(Math.Log(x*x+5*y*y)+2*y);
K2 = (x + h) * (y + h) * K1;
K3 = (x + h) * (y + h) * K2;
K4 = (x + h) * (y + h) * K3;
y1 = (y + h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
K1 = Math.Sqrt(Math.Log(x * x + 5 * y * y) + 2 * y);
K2 = (x + h / 2) * (y + h / 2) * K1;
K3 = (x + h / 2) * (y + h / 2) * K2;
K4 = (x + h / 2) * (y + h / 2) * K3;
y2 = (y + h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
K1 = Math.Sqrt(Math.Log(x * x + 5 * y * y) + 2 * y);
K2 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K1;
K3 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K2;
K4 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K3;
y3 = (y + h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
for (j = 0; Math.Abs(y3 - y1) > E; j++)
{
if (KK == 1) K = 1;
KK = 1;
h = h / 2;
y1 = y2;
K1 = Math.Sqrt(Math.Log(x * x + 5 * y * y) + 2 * y);
K2 = (x + h / 2) * (y + h / 2) * K1;
K3 = (x + h / 2) * (y + h / 2) * K2;
K4 = (x + h / 2) * (y + h / 2) * K3;
y2 = (y + h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
K1 = Math.Sqrt(Math.Log(x * x + 5 * y * y) + 2 * y);
K2 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K1;
K3 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K2;
K4 = (x + h / 2 + h / 2) * (y + h / 2 + h / 2) * K3;
y3 = (y + h / 6) * (K1 + 2 * K2 + 2 * K3 + K4);
}
if (K == 0) h *= 2;
K = 0;
KK = 0;
x += h;
Console.Write("y=" + y3);
Console.WriteLine("\tx=" + x + "\th=" + h);
Console.Read();
}
}
}
}
}
РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ
Висновок: на цій лабораторній роботі я навчилась використовувати метод Рунге-Кутта для обчислення диф. Рівнянь