Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Звіт
до лабораторної роботи № 6
з курсу «Чисельні методи в інформатиці»
на тему «Розв’язування задачі Коші
методом Рунге-Кутта»
Львів – 2011
Мета роботи: вивчити і засвоїти постановку та методи розв’язування задачі Коші. Навчитися досліджувати розв’язок , використовуючи метод Рунге-Кутта.
Короткі теоретичні відомості
Тільки невелика кількість задач Коші, 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;}
}
}
//-----------------------------------------------------------------------------------------------------------
Результат виконання програми:
Висновок: На цій лабораторній роботі я вивчив і засвоїв постановку та методи розв’язування задачі Коші. Навчився досліджувати розв’язок, використовуючи метод Рунге-Кутта.