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

2016-07-30СтудИзба

Описание файла

Документ из архива "Разработка программы поиска решения системы дифференциальных уравнений двумя методами: Рунге-Кутта и Рунге-Кутта-Мерсона", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48654"

Текст 2 страницы из документа "48654"

5. Блок-схема алгоритма

5.1 Блок-схема алгоритма головной программы


Нет Да

# 72 #80

Да Нет Да Нет

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






j





Д а Нет


Д а


j:=1,2

Нет



j

j:=1,2


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



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;




Н ет Да


Н ет Да

e3:=0;

d2:=d2+1


Д а Нет



j:=1,2


j



j

j:=1,2

j

J:=1,2

Д а


Нет

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('Для продолжения вычисления нажмите ,');

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

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

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('Для продолжения вычисления нажмите ,');

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

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’ приводит к переходу в меню программы.

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

Заключение

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

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

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

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

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4100
Авторов
на СтудИзбе
670
Средний доход
с одного платного файла
Обучение Подробнее