- •Барановичи 2011 год
- •Глава 1 теоретический раздел 5
- •Глава 2 практический раздел 11
- •Введение
- •Глава 1 теоретический раздел
- •1.1 Постановка задачи
- •1.2 Алгоритм решения (блок-схема)
- •Глава 2 практический раздел
- •2.1 Особенности реализации алгоритма
- •2.2 Тексты программ
- •2.3 Компонентная модель Excel и Pascal. Используемые компоненты
- •2.4 Результат работы программ
- •Заключение
- •Список использованных источников
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.