Курсовая работа: Деякі скінченно-різнецеві методи розвязування звичайних диференціальних рівнянь
виконуємо поліноміальну інтерполяцію взалежності Y(X) в точку X = 0. Результат інтерполяції, отриманий на k -му етапі, означаємо . Оцінюємо погрішність
як
Перетворюємо вектор на число характеризуючи погрішність. Якщо менше замовленого те вважаємо і завершуємо даний крок t → t + H .
Перша неприємна відмінність від явного методу полягає в тому, що кожен маленький крок на hk (великий крок H складається з Nk штук таких кроків) вимагає рішення СЛР.
Друга неприємна відмінність від явного методу полягає в тому, що тут набагато складніше перетворити вектор на одне число , оцінюючи погрішність. На жаль, рецепт цього перетворення слідує підібрати залежно від конкретного завдання, тобто від конкретних властивостей "швидких" і "повільних" змінних.
На перший погляд, цей алгоритм приведе не просто до багатьох помилок в описі динаміки "швидких" змінних, а до помилок якісних. Дійсно, якщо рівняння для "швидкої" змінної має вигляд , то при Ch >>1 неявна схема Рунге-Кутта другого порядку замість експоненціального вибуває дає x ( t + h )≈- x ( t ) , тобто | x ( t + H )|≈| x ( t )| . На щастя, наступна інтерполяція виправляє ситуацію. Інтерполяційний алгоритм "помічає", що у міру зменшення hk абсолютна величина x ( k ) ( t + H ) зменшується. Причому це зменшення тим помітніше, чим менше hk - В результаті остаточна відповідь буде помітна менше за абсолютною величиною, чим x(t).
7. Програма Рунге-Кутта на мові С #
Наведемо приклад пограми Рунге-Кутта на мові С#. В програмі використовується абстрактний клас TrungeKutta, в якому потрібно перекрити абстрактний метод F, який задає перші чаcтини рівняння.
using System;
using System.Collections.Generic;
namespace rwsh_rk4
{
abstract class TRungeKutta
{
public int N;
double t; // теперішній час
public double[] Y; // шукане число Y[0] – саме рішення, Y[i] - i-та змінна розвязку
double[] YY, Y1, Y2, Y3, Y4; // внутрішня змінна
public TRungeKutta(int N) // N – розмір системи
{
this.N = N; // зберегти розміри системи
if (N < 1)
{
this.N = -1; // якщо розмірність менше одиниці, то установити флаг помилки
return; // і вийти із конструктора
}
Y = new double[N]; // створення вектора розв’язку
YY = new double[N]; // внутрішній розв’язок
Y1 = new double[N];