Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эйлер_Рунге-Кутт.doc
Скачиваний:
14
Добавлен:
17.12.2018
Размер:
500.22 Кб
Скачать

1.2 Алгоритм решения (блок-схема)

Основные алгоритмы вычисления дифференциального уравнения одинаковы для программ на Pascal и для Excel.

Разрабатываемая программа на Pascal будет содержать функцию с параметрами. Ее алгоритм показан на рисунке 1.1. На рисунке видно какой из параметров функции что из себя представляет. Блок-схемы выполнены в соответствии с [6, с. 15].

Рисунок 1.1 – Алгоритм функции с параметрами

Метод Эйлера и метод Рунге-Кутта соответственно представлены на рисунках 1.2 и 1.3. Процедуры содержат вывода исходных данных и вывод полученного результата в текстовый файл с соответствующим именем. Это позволяет проводить сравнительный анализ результатов разным методов при различных исходных данных. Так для метода Эйлера файл будет иметь имя «EILER.TXT», а для Рунге-Кутта «RUNGE.TXT».

Рисунок 1.2 – Алгоритм метода Эйлера

Рисунок 1.3 – Алгоритм метода Рунге-Кутта

Глава 2 практический раздел

2.1 Особенности реализации алгоритма

Для реализации поставленной задачи будем разрабатывать две отдельные программы. Это упростит реализацию и сделает проще отладку методов. Результат выполнения программ будет выводится в файл с соответствующим именем. Это позволит пользоваться результатами и после завершения работы с программой.

При реализации алгоритмов в пакете MS Excel будем выполнять расчеты в виде таблицы. В методе Рунге-Кутта выделим отдельно все коэффициенты k и рассчитаем их. На рисунке 2.2 представлено окно пакета MS Excel в режиме отображения формул.

Рисунок 2.1 – Окно Excel в режиме отображения формул

Рисунок 2.2 – Окно Excel с выполненными расчетами

Рисунок 2.2 показывает результат работы в пакете Excel.

2.2 Тексты программ

Текст разработанных на языке программирования Pascal программ, выполняющих решение дифференциального уравнения методами Эйлера и Рунге-Кутта.

Метод Эйлера (Eiler.PAS)

Program Eiler;

uses Crt;

var

a, b, h, x, y, y0, y1, hv, k1, k2, k3, k4 : real;

iv, n, nv, mus, i : integer;

t : text;

Function f (x, y : real) : real;

begin

f:= x/y + 0.5*y;

end;

BEGIN

assign(t,'eiler.txt'); rewrite(t);

ClrScr;

WriteLn;

WriteLn (' ': 20,'М е т о д Э Й Л Е Р А ');

WriteLn;

WriteLn; WriteLn;

WriteLn (' ': 25, 'Введите начальные данные:');

WriteLn (' ': 25, 'начальные данные:');

WriteLn;

Write (' ': 22, 'Левая граница a= ');

ReadLn (a);

Write (' ': 22, 'Правая граница b= ');

ReadLn (b);

Writeln (t,' ': 22, 'Левая граница a= ',a:4:2);

Writeln (t,' ': 22, 'Правая граница b= ',b:4:2);

WriteLn (' ': 22, 'Шаг разбиения');

Write (' ': 22, 'отрезка [', a:4:2,',', b:4:2,'] h= ');

ReadLn (h);

Write (' ': 22, 'Ордината левой границы y0= ');

ReadLn (y0);

WriteLn (t,' ': 22, 'Шаг разбиения');

WriteLn (t,' ': 22, 'отрезка [', a:4:2,',', b:4:2,'] h= ',h:3:2);

Write (' ': 22, 'Ордината левой границы y0= ',y0:4:2);

WriteLn;

ClrScr;

WriteLn(t); WriteLn (t,' ': 32, 'Получаем : ');

WriteLn;

WriteLn (t,' ': 33, 'X', ' ': 6, ' ': 4, 'Y');

Write (t,' ': 22);

for iv:=1 to 29 do

Write (t,'-');

WriteLn(t);

y:=y0; x:=a; n:=round((b-a)/h);

for i:=1 to n do

begin

y:=f(x,y)*h+y;

x:=x+h;

Writeln (t,' ':22, i:3,' ': 6, x:4:2, ' ': 4,'| ',y:8:5);

end;

ReadLn;

close(t);

END.

Метод Рунге-Кутта (Runge.PAS)

Program Runge;

uses Crt;

var

a, b, h, x, y, y0, y1, hv, k1, k2, k3, k4 : real;

iv, n, nv, mus, i : integer;

t : text;

Function f (x, y : real) : real;

begin

f:= x/y + 0.5*y;

end;

BEGIN

assign(t,'runge.txt'); rewrite(t);

ClrScr;

WriteLn;

WriteLn (' ': 20,'М е т о д Р У Н Г Е - К У Т Т А');

WriteLn;

WriteLn; WriteLn;

WriteLn (' ': 25, 'Введите начальные данные:');

WriteLn (' ': 25, 'начальные данные:');

WriteLn;

Write (' ': 22, 'Левая граница a= ');

ReadLn (a);

Write (' ': 22, 'Правая граница b= ');

ReadLn (b);

Writeln (t,' ': 22, 'Левая граница a= ',a:4:2);

Writeln (t,' ': 22, 'Правая граница b= ',b:4:2);

WriteLn (' ': 22, 'Шаг разбиения');

Write (' ': 22, 'отрезка [', a:4:2,',', b:4:2,'] h= ');

ReadLn (h);

Write (' ': 22, 'Ордината левой границы y0= ');

ReadLn (y0);

WriteLn (t,' ': 22, 'Шаг разбиения');

WriteLn (t,' ': 22, 'отрезка [', a:4:2,',', b:4:2,'] h= ',h:3:2);

Write (' ': 22, 'Ордината левой границы y0= ',y0:4:2);

WriteLn;

ClrScr;

WriteLn(t); WriteLn (t,' ': 32, 'Получаем : ');

WriteLn;

WriteLn (t,' ': 33, 'X', ' ': 6, ' ': 4, 'Y');

Write (t,' ': 22);

for iv:=1 to 29 do

Write (t,'-');

WriteLn(t);

y:=y0; x:=a; n:=round((b-a)/h);

for i:=1 to n do

begin

k1:=h*f(x,y);

k2:=h*f(x+h/2, y+k1/2);

k3:=h*f(x+h/2, y+k2/2);

k4:=h*f(x+h, y+k3);

y:=y+(k1+2*k2+2*k3+k4)/6;

x:=x+h;

Writeln (t,' ':22, i:3,' ': 6, x:4:2, ' ': 4,'| ',y:8:5);

end;

ReadLn;

close(t);

END.