Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
ЗІ
З В І Т
До лабораторної роботи №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();
}
}
}
}
}
РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ
Висновок: на цій лабораторній роботі я навчилась використовувати метод Рунге-Кутта для обчислення диф. Рівнянь
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!