3856

Розв’язування задачі Коші методом Рунге-Кутта

Лабораторная работа

Информатика, кибернетика и программирование

Розв’язування задачі Кошіметодом Рунге-Кутта Мета роботи: вивчити і засвоїти постановку та методи розв’язування задачі Коші. Навчитися досліджувати розв’язок , використовуючи метод Рунге-Кутта. Короткі теоретичні відомості Тільк...

Украинкский

2012-11-09

163 KB

59 чел.

Розв’язування задачі Коші методом Рунге-Кутта

Мета роботи: вивчити і засвоїти постановку та методи розв’язування задачі Коші. Навчитися досліджувати розв’язок , використовуючи метод Рунге-Кутта.

Короткі теоретичні відомості

Тільки невелика кількість задач Коші, iнтегровних у явному виглядi, зустрічаються серед задач, якi потрiбно розв’язувати. Тому для розв’язування задач Коші широко використовують чисельні методи з їх реалізацією на комп’ютерах. При цьому особливо важливими є вибір потрібного методу і його програмної реалізації, а також підготування всіх даних, необхідних для роботи комп’ютерної програми.

1.Формулювання задачi.

Нехай на вiдрiзку потрiбно знайти розв’язок диференцiйного рiвняння

      (1)

який задовольняє таку умову

      (2)

Задачу (1)-(2) називають задачею Кошi для звичайногодиференцiйного рівняння першого порядку.

Будемо припускати, що функцiя f(х,у) неперервна та задовольняє умову Лiпшиця за у, тобто виконується

   (3)

де L– деяка додатна стала. В цьому випадку задача Кошi має єдиний розв’язок на промiжку

2. Метод Ейлера.

Розiб’ємо проміжок [а, b], на якому шукаємо розв’язок, на рiвномiрнi вiдрізки причому

Розрахункова формула методу Ейлера має вигляд

  (4)

де .У випадку рівномiрного розбиття вiдрізка [а, b] точками отримасмо

3. Методи Рунге-Кутта.

На практиці для розв’язування задачi Коші найчастiше використовують методи Рунге-Кутта. Цими методами можна розв’язати задачу Кошi для звичайного диференцiйного рiвняння першого порядку, для диференцiйних рiвнянь вищих порядків, системи диференцiйних рiвнянь першого порядку.

Перевага методiв Рунге-Кутта полягає в тому, що обчислювальні алгоритми є однорiдними, тобто не змiнюються при переходi від однiєї точки до iншої, а крок змiнюється вiдповiдно до потреби точностi обчислень, без ускладнення обчислювального алгоритму.

Методи Рунге-Кутта мають високу точнiсть, причому обчислення можна проводити із змінним кроком: неважко эменшити крок там, де функцiя швидко змiнюється, i збiльшити в протилежному випадку.

Недоліком методів Рунге-Кутта є те, що для відшукання наближеного розв’язку в точцi заданого вiдрiзку необхiдно виконати декілька обчислень значень функцій.

Наведемо рекурентні формули методу Рунге-Кутта рiзних порядкiв точностi.

Формули методу Рунге-Кутта другого порядку:

4. Оцiнювання похибки наближеного розв’язку задачі Кошi.

Для методiв Ейлера та його модифiкацiй, а також методів Рунге-Кутта i Адамса застосовують апріорні оцiнки похибки наближеного розв’язку задачi Кошi (1)-(2) . Однак цi оцiнки здебiльшого значно завищені. Тому їхнє значення не стiльки практичне, скiльки теоретичне, бо з них безпосередньо випливає висновок про збiжність цих методiв. Крім того, апрiорнi оцiнки мiстять у собi ряд сталих, для вiдшукання яких часто треба виконувати досить складні обчислення.

Тому, щоб оцiнити похибку наближеного розв’язку задачi (1) - (2), намагаються використати iнформацiю, яку дiстають в процесі чисельного розрахунку (такі оцінки називають апостеріорними). Найефективнiшим оцінюванням є використання оцiнки з подвiйним перерахунком.

Розглянемо детальнiше метод подвiйного перерахункудля  таких трьох випадків [2]:

1) задано крок iнтегрування h i треба визначити точні цифри наближеного розв’язку в кожнiй вузловiй точцi ;

2) задано точнiсть ε>0, з якою треба обчислити наближений розв’язок задачi, добираючи належним чином як сам метод, так i крок iнтегрування h;

3) оцiнити похибку – вiдповiдно наближений і точний розв’язок задачi в кожнiй вузловiй точцi .

Для цього розв’язок задачi (1)-(2) у кожнiй вузловiй точці обчислюють двiчі: з кроком h i h/2. Позначатимемо їх вiдповiдно .

Десятковi розряди наближень , які збiгаються мiж собою, вважають точними цифрами наближеного розв’язку в точцi .

Якщо наближений розв’язок задачi (1)-(2) треба обчислити з наперед заданою точнiстю є>0, то, використовуючи метод певного порядку точностi, інтегрування з кроками h і h/2 доцiльно вести паралельно, щоб вчасно визначити неузгодженiсть мiж значеннями  i, можливо, перейти до нового кроку.

Якщо ж у точцi  значення задовольняють нерiвність то крок інтегрування для наступної точки треба збільшити, наприклад, подвоїти. Якщо то крок ітегрування ділять навпіл. Цим забезпечують автоматичний вибiр кроку iнтегрування.

Нарештi, наявнiсть наближених значень , обчислених вiдповiдно з кроком h i h/2, дає змогу наближено оцiнити похибку методу у точцi  . Для одержання оцiнки похибки, припустимо, що виконуються такі умови:

1) на кожному кроці iнтегрування h похибка методу приблизно пропорцiйна до де S – порядок точностi методу;

2) похибка методу на кожному кроцi інтегрування однакова;

3) на кожному наступному кроцi інтегрування сумарна похибка методу містить також усi похибки, зробленi на попереднiх кроках.

Тому, якщо де М — невiдомий коефiцiєнт пропорційності, то

Отже, для похибки в точцi  у випадку iнтегрування з кроком h маємо рівнiсть

    (4.1)

а при інтегруванні з кроком h/2 – рiвність

     (4.2)

Віднявши почленно (4.2) вiд рiвностi (4.1) та розв’язавши одержане рівняння щодо невiдомого коефiцiєнта М, знайдемо

Пiдставивши це значення M в (4.2), отримаємо

    (4.3)

Оцiнювання абсолютної похибки за допомогою величини називають правилом Рунге.

Варіант 17

Застосовуючи чисельнi методи розв’язування задачi Кошi, розв’язати диференцiйне рiвняння першого порядку з точнiстю є =0.0001 на відрiзку  із кроком h= 0.05 i заданими початковими умовами , а також порівняти отриманий розв’язок із точним розв’язком y*, використовуючи правило Рунге.

Текст програми:

//---------------------------------------------------------------------------

#include <vcl.h>

#include <math.h>

#pragma hdrstop

#include "RungeUn.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

float x0, y0, xn0, ytn1, yn0, eps, h, xn1, yn1, k1, k2;

bool modif=true;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

 : TForm(Owner)

{

}

//---------------------------------------------------------------------------

double func(double xn0, double yn0)

{

return ((yn0*yn0+xn0)/(xn0*yn0));

}

//---------------------------------------------------------------------------

double func_toch(double xn0)

{

return (sqrt(2*xn0*(3*xn0-1)));

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 x0=StrToFloat(LabeledEdit1->Text);

 y0=StrToFloat(LabeledEdit2->Text);

 h=StrToFloat(LabeledEdit3->Text);

 eps=StrToFloat(LabeledEdit4->Text);

 Memo1->Clear();

 Memo1->Lines->Add((AnsiString)"      x                y              h               ytoch");

 xn0=x0;

 yn0=y0;

 while (xn0 < (x0+0.5))

{

  k1 = h * func(xn0,yn0);

  k2 = h * func(xn0+h,yn0+k1);

  yn1 = yn0 + (k1+k2)/2.0;

  xn1 = xn0 + h;

  xn0 = xn1;

  yn0 = yn1;

  ytn1=func_toch(xn1);

  Memo1->Lines->Add(FloatToStrF(xn1,ffFixed,8,4)+

                     (AnsiString)"      "+

                     FloatToStrF(yn1,ffFixed,8,4)+

                     (AnsiString)"      "+

                     FloatToStrF(h,ffFixed,8,4)+

                     (AnsiString)"      "+

                     FloatToStrF(ytn1,ffFixed,8,4));

  if(abs(yn1-ytn1)>eps){h/=2.0; modif=false;}

  else if(!modif){h*=2; modif=true;}

}

}

//-----------------------------------------------------------------------------------------------------------

Результат виконання програми:

    Висновок: На цій лабораторній роботі я вивчив і засвоїв постановку та методи розв’язування задачі Коші. Навчився досліджувати розв’язок, використовуючи метод Рунге-Кутта.