Курсовая работа: Деякі скінченно-різнецеві методи розвязування звичайних диференціальних рівнянь

виконуємо поліноміальну інтерполяцію взалежності 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];

К-во Просмотров: 307
Бесплатно скачать Курсовая работа: Деякі скінченно-різнецеві методи розвязування звичайних диференціальних рівнянь