5.2 Блок-схема алгоритма подпрограммы–процедуры runkut

 


Блок-схема: дисплей: СообщениеДа Нет


Блок-схема: решение: Ch=readkeyДа


j:=1,2

 

v:=H*f[j]; k[j]:=v;

y[j]:=W[j]+v/2;

 
Нет
Блок-схема: альтернативный процесс: Выход

y[j]:=W[j]+(k[j]+h*f[j])/6;

W[j]:=y[j];

 
Блок-схема: типовой процесс: urj

 

j:=1,2

 


5.3 Блок-схема алгоритма подпрограммы–процедуры rukutm

 


Блок-схема: данные: Y0[i],Xo, eБлок-схема: решение: h<0Блок-схема: данные: hБлок-схема: дисплей: h=?Нет Да

Блок-схема: решение: e2<e1/20


Нет Да

d2:=d2+1

 

e3:=0;

 

Да Нет

Блок-схема: дисплей: Y0[i]=? Xo=?Е=?

j:=1,2

 

Блок-схема: типовой процесс: HidecursorБлок-схема: дисплей: СообщениеБлок-схема: данные: ChБлок-схема: решение: Ch=readkeyБлок-схема: альтернативный процесс: Выход

J:=1,2

 

j

 

j:=1,2

 

d[j]:=f[j]*H; y[j]:=W[j]+a[j]/2-1.5*c[j]+2*d[j];

 
Блок-схема: типовой процесс: urj

Да


Нет

 


5.4 Блок-схема подпрограммы–процедуры moymenu


5.5 Блок-схема подпрограммы–процедуры ur

 

 




5.6 Блок-схема подпрограммы–функции f1

 

 



5.7 Блок-схема подпрограммы– функции f2

 

 



5.8 Блок-схема подпрограммы–процедуры CursorSize

 




5.9 Блок-схема подпрограммы–процедуры HiddeCursor

 

 


5.10 Блок-схема подпрограммы–процедуры NormCursor

 

 




5.9 Блок-схема подпрограммы–процедуры Spravka



5.10 Блок-схема подпрограммы–процедуры Zastavka



6. Текст исходной программы

program Kursovoy;

Uses CRT, DOS;

Const N=2;

Label 11;

Type

mas=Array[1..4] of String[60];

Const

menu:mas= ('Справка ',

'Метод Рунге-Кутта ',

'Метод Рунге-Кутта-Мерсона',

'Выход ' );

var

i,s,p:integer;

h,v,x,e1,e2,e3 : real;

y,w,k,f,e,a,c,d:array[1..10] of real;

j,d2:integer;

k2:byte;

stop:boolean;

eps,dx,dy,x0,y0:real;

f11,f22:real;

c1,kod,k10:Char;

pass:string;

ch:char;

function f1 (x1,y1,y2:real):real;

begin

f1:=y1+y2-x1*x1+x1-2;

end;

function f2(x1,y1,y2:real):real;

begin

f2:=-2*y1+4*y2+2*x1*x1-4*x1-7;

end;

procedure ur;

begin

f[1]:=f1(x,y[1],y[2]);

f[2]:=f2(x,y[1],y[2]);

end;

Procedure CursorSize(Size:word);

var

Regs: Registers;

begin

With Regs do

begin

AH:=$01;

CH:=Hi(size);

Cl:=Lo(Size);

intr($10,Regs);

end;

end;

procedure HiddeCursor;

begin

CursorSize($2000);

end;

Procedure NormCursor;

begin

CursorSize($0607);

end;

Procedure ramka (x1,y1,x2,y2:byte);

const

a=#201;

b=#205;

c=#187;

d=#186;

e=#188;

f=#200;

begin

TextColor(15);

TextBackground(4);

Clrscr;

GoToxy(x1,y1);

write(a);

for i:=x1+1 to x2-1 do write(b);

write(c);

for i:=y1+1 to y2-1 do

begin

gotoxy(x1,i);

write(d);

Gotoxy(x2,i);

write(d);

End;

GoToxy(x1,y2);

write(f);

for i:=x1+1 to x2-1 do write(b);

write(e);

End;

Procedure Okno(x1,y1,x2,y2,Fcolor,Tcolor:byte);

Begin

Clrscr;

TextMode(3);

HiddeCursor;

Ramka(x1,y1,x2,y2);

Window(x1+1,y1+1,x2-1,y2-1);

TextBackground(Fcolor);

TextColor(Tcolor);

Clrscr;

Gotoxy(1,1);

End;

Procedure Zastavka;

begin

Okno(1,1,79,23,3,15);

GoToXY(3,1);

writeln(' ');

Writeln(' Министерство образования Республики Беларусь');

Writeln(' Белорусский национальный технический университет');

GoToXY (1,6);

writeln(' Программа решения системы дифференциальных уравнений ');

writeln;

writeln;

writeln;

writeln;

writeln(' Курсовая работа ');

writeln(' по дисциплине "Информатика" ');

GoToXY(1,15);

Writeln(' Исполнитель: Неверовская Я.Б') ;

writeln(' гр.102826 ');

writeln(' Руководитель: Петренко С.М.');

writeln;

writeln;

writeln(' Минск 2008');

Window(0,0,80,25);

gotoxy(40,23);

TextColor(15);

gotoxy(1,79);

writeln(' Для продолжения нажмите любую клавишу... ');

repeat until keypressed;

while keypressed do c1:=readkey;

clrscr;

End;

Procedure Spravka;

var

ch:char;

Begin

Okno(1,1,79,23,3,15);

Writeln(' СПРАВКА ' );

Writeln;

Writeln(' Данная программа позволяет найти решения системы дифференциальных уравнений. ') ;

Writeln(' В частности системы уравнений:');

Writeln(' y`1=y1+y2-x1*x1+x1-2 ');

Writeln(' y`2=-2*y1+4*y2+2*x1*x1-4*x1-7 ');

Writeln;

Writeln(' методом Рунге-Кутта или методом Рунге-Кутта-Мерсона. ') ;

Writeln(' Правые части системы дифференциальных уравнений заданы в подпрограммах ');

Writeln(' функциях f1 и f2 соответственно. В данных подпрограммах можно задать');

Writeln(' свои функции вместо исходных.');

Writeln(' После перехода в меню выберите клавишами управления курсора');

Writeln(' необходимый пункт.');

Writeln('При выборе пунктов меню "Метод Рунге-Кутта " или "Метод');

Writeln('Рунге-Кутта-Мерсона " введите исходные данные , программа выведет’);

writeln(' полученные результаты.');

Window(2,2,79,24);

Textcolor(15);

gotoxy(5,20);

write( ' Для возврата в меню нажмите любую клавишу... ' ) ;

ch:=readkey;

End;

Procedure moymenu;

begin

clrscr;

Okno(10,5,60,20,3,15);

For i:=1 to 4 do

begin

Gotoxy(15,i+5);

if i=p then Textbackground(4) else

Textbackground(3);

write(Menu[i]);

end;

End;

procedure Exitfrom;

begin

writeln;

gotoxy(50,26);

Writeln(' Для прдолжения вычисления нажмите Y, для выхода -N');

ch:=readkey;

if ch=#121 then moymenu else Zastavka;

end;

Procedure runkut ;

label 2;

begin

clrscr;

textcolor(15);

NormCursor;

Writeln('Метод Рунге-Кутта ');

2: Write('Задайте положительный начальный h=');

read(h);

if h<=0 then

goto 2

else begin

write ('Задайте начальное Xo=');

read (x);

for j:=1 to n do

begin

Write('Задайте начальные y0[',j,']=');

readln(W[j]);

y[j]:=W[j];

end;

ur;

for j:=1 to n do

begin

v:=H*f[j];

k[j]:=v;

y[j]:=W[j]+v/2;

end;

ur;

for j:=1 to n do

begin

v:=H*f[j];

k[j]:=k[j]+2*v;

y[j]:=W[j]+v/2;

end;

ur;

for j:=1 to n do

begin

v:=H*f[j];

k[j]:=k[j]+2*v;

y[j]:=W[j]+v;

end;

ur;

Textcolor(5);

Writeln('решение системы дифференциальных уравнений:');

for j:=1 to n do

begin

y[j]:=W[j]+(k[j]+h*f[j])/6;

writeln('y[',j,']=',y[j]:12:9);

W[j]:=y[j];

end;

HiddeCursor;

textcolor(14);

gotoxy(1,24);

writeln('Для продолжения вычисления нажмите <Y>,');

writeln('для выхода <N>');

ch:=readkey;

if ch=#121 then runkut else moymenu;

end;end;

Procedure rukutm;

label 3;

begin

clrscr;

textcolor(15);

NormCursor;

Writeln('Метод Рунге-Кутта-Мерсона ');

3: Write('задайте положительный начальный шаг h=');

read(h);

if h<=0 then

goto 3

else begin

Write('Задайте погрешность вычислений e=');

read(e1);

write ('Задайте начальное Xo=');

read (x);

for j:=1 to n do

begin

write('Введите начальное Y0[',j,']=');

readln(w[j]);

y[j]:=W[j];

end;

k2:=0;

e3:=0;

ur;

d2:=0;

for j:=1 to n do

begin

a[j]:=f[j]*H;

y[j]:=W[j]+a[j]/3;

end;

x:=x+h/3;

ur;

for j:=1 to n do

begin

y[j]:=W[j]+(a[j]+f[j]*H)/6;

end;

ur;

for j:=1 to n do

begin

c[j]:=f[j]*H;

y[j]:=W[j]+a[j]/8+0.375*c[j];

end;

x:=x+h/6;

ur;

for j:=1 to n do

begin

d[j]:=f[j]*H;

y[j]:=W[j]+a[j]/2-1.5*c[j]+2*d[j];

end;

x:=x+h/2;

ur;

for j:=1 to n do

begin

e[j]:=f[j]*H;

y[j]:=W[j]+(a[j]+4*d[j]+e[j])/6;

e2:=abs(-2*a[j]+9*c[j]-8*d[j]+e[j])/30;

if e2<=e1 then

if e2<e1/20 then d2:=d2+1 else

e3:=0;

end;

if e3<>0 then begin

x:=x-h;

for j:=1 to n do begin

y[j]:=W[j];

end;

H:=H/2;

end

else k2:=1;

if d2=n then H:=H+H;

Textcolor(5);

Writeln('решение системы дифференциальных уравнений:');

for i:=1 to n do begin

writeln('y[',i,']=',y[i]:12:9);

W[i]:=y[i];

end;

HiddeCursor;

textcolor(14);

gotoxy(1,24);

writeln('Для продолжения вычисления нажмите <Y>,');

writeln('для выхода <N>');

ch:=readkey;

if ch=#121 then rukutm else moymenu;

end; end;

BEGIN

Clrscr;

Zastavka;

11: hiddecursor;

p:=1;

moymenu;

k10:=readkey;

while k10<>#13 do

begin

Case k10 of

#72: if p=1 then p:=4 else p:=P-1;

#80: if p=4 then p:=1 else p:=p+1;

end;

moymenu;

k10:=readkey;

end;

Case p of

1: Spravka;

2: runkut;

3: rukutm;

4: exit;

end;

goto 11;

END.


7. Результаты работы программы

После запуска программы в соответствии с поставленной задачей на проектирование выводится окно заставки программы, приведенное на рисунке 1.

Рисунок 1. Окно заставки.

После нажатия любой клавиши выводится окно с меню, представленное на рисунке 2.

Рисунок 2. Окно с меню.

При выборе пункта меню «Справка» открывается соответствующие окно в котором находится справочная информация о программе. Пример такого окна представлен на рисунке 3.


Рисунок 3. Окно справки.

При выборе пункта меню « Метод Рунге-Кутта » или «Метод Рунге-Кутта-Мерсона» открывается соответствующие окна, в которых вводятся исходные данные и выводятся результаты вычисления. Примеры таких окон представлены на рисунках 4 ( Метод Рунге-Кутта ) и 5 (Метод Рунге-Кутта-Мерсона).

Рисунок 4. Вычисление методом Рунге-Кутта.

Рисунок 5. Вычисление методом Рунге-Кутта-Мерсона.


8. Анализ результатов

Для анализа результатов сведем данные нескольких расчетов в таблицу.

Таблица 2 – Результаты расчетов

Метод Рунге-Кутта-Мерсона Метод Рунге-Кутта

Y01

Y02

Хо

h E

Y01

Y02

Хо

h
1 2 1 1 0.02 0,001 2 1 1 0.02

Y1

2.018133460 2,018237453

Y2

0,812223824 0,0812215653

 

Сравнение методов показывает, что они обеспечивают примерно одинаковое решение.

В большинстве случаев метод Рунге-Кутта-Мерсона даёт более точный результат (погрешность ). Кроме того, хотя он громоздок в реализации, но быстрая сходимость метода компенсирует увеличение числа вспомогательных операций и, резко уменьшает вероятность числовой неустойчивости.

 


9. Инструкция по работе с программой

Файл NYBKURSO.pas с исходным текстом Паскаль-программы находится по адресу E:\2 kurs\Неверовская. Результат компиляции исходной программы NYBKURSO.exe находится в той же папке.

Необходимо запустить на выполнение NYBKURSO.exe либо загрузить Turbo Pascal, сделать текущим каталог Неверовская, открыть файл с исходной Паскаль-программой NYBKURSO.pas и запустить ее на выполнение командой Run\ Run.

После вывода заставки программы нажать любую клавишу для перехода в меню и открыть окно справки. После ознакомления со справкой нажатием любой клавиши возвратится в окно меню, с помощью клавиш управления курсором выбрать метод вычисления и ввести по запросу программы значения, а также погрешность.

Результаты вычисления выводятся в том же окне, где вводились исходные данные.

Для продолжения вычислений следует ответить на запрос программы нажатием клавиши ‘Y’, что обеспечит переход к повторному вводу данных. Нажатие клавиши ‘N’ приводит к переходу в меню программы.

Завершение работы с программой реализуется выбором пункта меню “Выход”.


Заключение

В данной курсовой работе разработана блок-схема и реализована средствами языка программирования Турбо-Паскаль программа, позволяющая решить систему дифференциальных уравнений :

методом Рунге-Кутта-Мерсона и методом Рунге-Кутта.

Программа по запросу пользователя сообщает общие сведения по работе с программой и производит вычисления, выбор метода вычисления производится посредством меню, ввод данных осуществляется с клавиатуры по запросу программы.

Из анализа результатов вычисления можно сделать вывод о большей точности вычисления по методу Рунге-Кутта-Мерсона.


Информация о работе «Разработка программы поиска решения системы дифференциальных уравнений двумя методами: Рунге-Кутта и Рунге-Кутта-Мерсона»
Раздел: Информатика, программирование
Количество знаков с пробелами: 19099
Количество таблиц: 9
Количество изображений: 21

0 комментариев


Наверх