МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут ІКНІ
Кафедра ПЗ
ЗВІТ
до лабораторної роботи № 5
На тему: “ Розв’язування диференційних рівнянь ”
З дисципліни: “ Чисельні методи в інформатиці ”
Мета роботи: навчитись обчислювати розв’язок задачі Коші (нелінійного диференційного рівняння першого порядку) на інтервалі [a,b], застосовуючи метод Ейлера або метод Рунге-Кутта 4-го порядку.
Теоретичні відомості
Розглянемо диференційне рівняння першого порядку:
(4.6.1)
і початкову умову: ,
де y0 – надано.
Диференційна задача (4.6.1) зветься задачею Коші. Вона часто застосовується для моделювання динаміки різноманітних процесів. У такому разі t – час, y – величина, що описує стан об’єкту,y0 – його початковий стан.
Нехай t0,t1,...,tN – моменти часу, для яких треба обчислити стан об’єкту. Величина hk = tk+1-tk зветься кроком інтегрування. Для розв’язування задачі Коши застосовуються алгоритми як з постійним, так і з змінним кроком. Далі будемо вважати, що крок є постійним, тоді, припускаючи, що t0=0, будемо мати: .
Будемо використовувати позначення:
Найбільш простим методом розв’язування задачі Коші є метод Ейлера. Робоча формула методу Ейлера має такий вигляд:
. (4.6.2)
Більш точний модифікований метод Ейлера передбачає обчислення yk+1 у два етапи: спочатку обчислюється значення похідної Pk для моменту tk :
, (4.6.3)
далі отримується величина yk+1:
. (4.6.4)
Метод Рунге-Кутта четвертого порядку має таку схему. Спочатку обчислюються допоміжні величини:
(4.6.5)
тоді обчислюється наступне значення шуканої функції:
. (4.6.6)
Завдання
Застосовуючи метод Ейлера або метод Рунге-Кутта 4-го порядку, знайти розв’язок задача Коші (нелінійного диференційного рівняння першого порядку) на інтервалі [a,b].
a = 0 , b = 2 , x(a) = 1
Текст програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
GroupBox1: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label4: TLabel;
Label5: TLabel;
Image1: TImage;
Bevel1: TBevel;
Label6: TLabel;
XPManifest1: TXPManifest;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
k:integer;
const
a:integer = 0;
b:integer = 2;
y0:integer = 1;
implementation
{$R *.dfm}
function Func(x,t:real):real;
begin
result:=sqr(cos(5*t))-4*sqr(x);
end;
function Poxidna(t:real):real;
begin
result:=-5*sin(10*t);
end;
function metodEjlera:real;
var
i:integer;
y,h,t:real;
begin
y:=y0;
h:=(b-a)/k;
for i:=0 to k do
begin
t:=i*h;
y:=y+h*Func(y,t);
end;
result:=y;
end;
function metodEjlera2:real;
var
i:integer;
y,h,t:real;
begin
y:=y0;
h:=(b-a)/k;
for i:=0 to k do
begin
t:=i*h;
y:=y+0.5*h*(Func(y,t)+Func(y+h*Poxidna(t),t+h));
end;
result:=y;
end;
function metodRynge_Kytta:real;
var
i:integer;
y,h,t,t2,t3,p1,p2,p3,p4:real;
begin
y:=y0;
h:=(b-a)/k;
for i:=0 to k do
begin
t:=i*h;
t2:=(i+1)*h;
t3:=(i+2)*h;
p1:=Func(y,t);
p2:=Func(y+0.5*h*Poxidna(t),t+0.5*h);
p3:=Func(y+0.5*h*Poxidna(t2),t+0.5*h);
p4:=Func(y+h*Poxidna(t3),t+h);
y:=y+(h/6)*(p1+2*p2+2*p3+p4);
end;
result:=y;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
k:=Round(1/StrToFloat(Edit1.Text));
Edit2.Text:=FloatToStr(metodEjlera);
Edit3.Text:=FloatToStr(metodEjlera2);
Edit4.Text:=FloatToStr(metodRynge_Kytta);
end;
end.
Протокол роботи програми
Висновок: під час виконання лабораторної роботи я навчився обчислювати розв’язок задачі Коші (нелінійного диференційного рівняння першого порядку) на інтервалі [a,b], застосовуючи метод Ейлера або метод Рунге-Кутта 4-го порядку.