Реферат по предмету "Информатика, программирование"


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

Введение
В курсовой работе всоответствии с заданием на проектирование решается задача разработки программыпоиска решения системы дифференциальных уравнений двумя методами: Рунге-Кутта иРунге-Кутта-Мерсона.
В данной пояснительнойзаписке проводится описание последовательности шагов по составлению программына алгоритмическом языке Turbo Pascal. Рассматриваются вопросы математическойформулировки и алгоритмизации задачи, разработки блок-схемы алгоритма еёрешения, составления исходной Pascal-программы и реализации вычислений посоставленной программе.
Выбор метода вычисления,обращение к справке по программе и выход из программы обеспечивается с помощьюспециального меню. Ввод исходных данных и вывод результатов вычисления выполняетсяв отдельном для каждого метода вычислений окне.
В пояснительной записке приводитсятакже сравнения точности вычислений корней системы уравнений использованнымиметодами.

1.Постановка задачи
Ставится задача составитьпрограмму решения системы дифференциальных уравнений:
/> (1)
Требуется найти решениесистемы дифференциальных уравнений (1) методом Рунге-Кутта и методомРунге-Кутта-Мерсона. Выбор метода решения посредствам меню, при помощи клавишуправления курсором.
Таким образом,программа должна обеспечивать возможность:
выбора пользователемчисленного метода поиска решения системы дифференциальных уравнений;
предоставить пользователювозможность получить краткую справку о программе;
вывода результатоввычисления на дисплей в удобном для восприятия виде.
В результатесформулируем следующую задачу по созданию программы:
вид системыдифференциальных уравнений должен задаваться в подпрограмме – процедуре;
вид правой частиуравнений должен задаваться в подпрограмме – функции;
программа после загрузкидолжна выводить на дисплей исходное окно-заставку, в которой отображаются общиесведения о статусе программы и её авторе;
после выполненияуказанной в строке подсказки процедуры перехода должно выводиться вертикальноеменю с пунктами: «Справка», «Метод Рунге-Кутта», «Метод Рунге-Кутта-Мерсона» и«Выход»
при выборе в меню пункта«Справка» должна выводиться краткая справка о назначении программы;
после выбора в менюварианта численного метода должно открываться отдельное окно, в котором будут вводитьсяначальные условия и выводиться результат поиска выбранным методом;
при выборе пункта меню«Выход» программы должна завершать работу.

2.Математическая формулировка задачи
Задача Коши заключается врешении систем обыкновенных дифференциальных уравнений (1) первого порядка,представляемых в виде:
/> (1.1)
 
Где j=1/>N-номер каждой зависимой переменной yj, x-независимая переменная .
Решение системы (1.1) призаданных начальных условиях x=x, y1(x)=y10,…,y2(x)=y20, yN(x)=yNсводиться к нахождению зависимостей(интегральных кривых) y1(x),…,y2(x), yN(x), проходящих через точки (x,y10), (x,y20),…, (x,yN). Задача Коши сводиться к интегрированиюдифференциальных уравнений. Порядок метода численного интегрирования при этомопределяется и порядок метода решения (1).
2.1 Метод Рунге-Кутта
 
Этот метод являетсянаиболее распространенным методом решения систем (1.1) при шаге h=const. Его достоинством является высокаяточность-погрешность /> - и меньшаясклонность к возникновению неустойчивости решения. Алгоритм реализации методазаключается в циклических вычислениях Yj(i+1) на каждом i+1 шаге по следующим формулам:
/>              (2)
/>/> (3)
/> (4)
/> (5)
/> (6)
При переходе от однойформулы к другой задаются или вычисляются соответствующие значения x и Yjи находятся по подпрограмме значенияфункции Fj(x,Yj).
2.2 МетодРунге-Кутта-Мерсона
Автоматическое изменениешага в ходе решения систем дифференциальных уравнений необходимо, если решениетребуется получить с заданной точностью. При высокой точности (погрешность />) и решении в виде кривых ссильно различающейся крутизной автоматическое изменение шага обеспечиваетуменьшение общего числа шагов в несколько раз, резко уменьшается вероятностьчисловой неустойчивости, даёт более равномерное расположение точек графикакривых (решений) при их выводе на печать. Данный метод обеспечиваетприближённую оценку погрешностей на каждом шаге интегрирования. Погрешностьинтегрирования имеет порядокh5. Этот метод реализуется следующим алгоритмом: Задаёмчисло уравнений N, погрешность ε=E, начальный шаг интегрирования h=Hи начальное значение y10,…,yN0.С помощью пяти циклов с управляющей переменной J=1,2,..,N вычисляемкоэффициенты:
/>                       (7)
/> (8)
/> (9)
/> (10)
/> (11)
Находим (в последнемцикле) значение (12)
/> (12)
И погрешность
/> (13)
Проверяем выполненияусловий
/> (14)
/> (15)
Если условие (14) невыполняется, то делим шаг h на 2и повторяем вычисления. Если это условие выполняется и выполняется условие(15), значение xi+1=xi+h и Yj(i+1), тосчитаем, что решение системы дифференциальных уравнений найдено с заданнойточностью. Если условие (15) не выполняется, шаг h увеличивается вдвое и вычисления повторяются.

3.Алгоритмизация задачи
В соответствии спостановленной в разделе 2 задачей целесообразно реализовать алгоритм,использующий обращение к соответствующим подпрограммам из головной программы.
Алгоритм работыголовной программы следующий:
Скрыть курсор сиспользованием подпрограммы — процедуры скрытия курсора и вывести в специальномокне заставку программы, содержащую сведения о назначении программы, исполнителеи руководителе курсовой работы, а также подсказку для пользователя опоследующих действиях, с использованием подпрограммы — процедуры заставки.
Запуститьподпрограмму-процедуру вертикального меню при нажатии любой клавиши с использованиемподпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора.
Запуститьподпрограмму-процедуру справки и вывести в специальном окне справочные сведенияо работе с программой при выборе пункта меню «Справка» с использованием строки-подсказкио возврате в меню.
Запуститьподпрограмму-процедуру поиска решения системы дифференциальных уравнений методомРунге-Кутта при выборе пункта меню «Метод Рунге-Кутта» с использованиемвключения курсора, а также строки-подсказки о возврате в меню.
Запуститьподпрограмму-процедуру поиска решения системы дифференциальных уравнений методомРунге-Кутта-Мерсона при выборе пункта меню «Метод Рунге-Кутта-Мерсона» сиспользованием включения курсора, а также строки-подсказки о возврате в меню.
Завершить работупрограммы при выборе пункта меню «Выход».
Алгоритм поискарешения системы уравнения методом Рунге-Кутта в подпрограмме-процедуре runkutвключает следующие шаги:
Создать окно для вводаисходных данных и вывода результатов вычисления.
Восстановить отображениекурсора нормального размера соответствующей подпрограммой — процедурой.
Задать начальный шаг-h и начальные значение xо,y10,…,yN0.
В подпрограмме-функции задаёмвид правой части уравнений.
В подпрограмме-процедуре задаёмвид системы дифференциальных уравнений.
Организовать цикл дляпоиска коэффициентов погрешности по формулам (2-5)
По формуле (6) найти решениесистемы дифференциальных уравнений.
Вывести результатывычислений в том же окне.
Вывести в окне запрос опродолжении вычислений с новыми исходными данными.
Выполнить анализ коданажатой в ответ на запрос клавиши: при нажатии “Y” повторить ввод снова, при нажатии “N” перейти в окно с меню.
Алгоритм поискарешения системы уравнений методом Рунге-Кутта-Мерсона в подпрограмме процедуре rukutmвключает:
Создание окно для вводаисходных данных и вывода результатов вычисления.
Восстановленияотображение курсора нормального размера соответствующей подпрограммой — процедурой.
Задание начального шаг-h, начальных значений xо,y10,…,yN0и точности вычисления- ε.
Подпрограмме-процедуре задаёмвид системы дифференциальных уравнений
В подпрограмме-функции задаёмвид правой части уравнений
С помощью пяти циклов суправляющей переменной J=1,N вычисляем коэффициенты по формулам(7)-(11).
В последнем цикле находимрешение системы дифференциальных уравнений по формуле (12) и погрешность по формуле(13).
Проверка выполнениеусловий (14) и (15). Если первое условие не выполняется то h:=h/2 и переходим к п.5.
Если выполняются обаусловия, то значение xi+1=xi+hи Yj(i+1)выводим на экран.
Если второе условие невыполняется, то h:=h+h и переходим к п.5.
Вывести результатывычислений в том же окне.
Вывести в окне запрос опродолжении вычислений с новыми исходными данными.
Выполнить анализ коданажатой в ответ на запрос клавиши: при нажатии “Y” пoвторитьввод снова, при нажатии “N”перейти в окно с меню.

4.Идентификаторы программы
 
Для указания соответствияобозначений переменных в формулах математической формулировки и ихидентификаторов в программе сведем их в таблицу 1:
Таблица 1Обозначение параметров Смысл параметра В формулах В программе
Y1…Yn Y[1]…Y[n] Начальные приближения ε E Точность результата
h H Шаг интегрирования
Кij K[j] Коэффициенты погрешности
N n Количество уравнений
/> F[1] Первое уравнение системы
/> F[2] Второе уравнение системы
Остальные идентификаторыявляются промежуточными или служебными.

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

Нет                    Да
/>#72            #80
Да              Нет             Да              Нет
 

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

/>/>Да                        Нет
/>

/>/>Да/> /> /> /> /> /> /> /> />

/>/>
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];   />/>j
 />
j:=1,2  


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

/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>Нет   Да
/>

/>/>/>/>Нет   Да/> /> /> /> /> />
d2:=d2+1   />
e3:=0;   />

/>/>Да Нет/> /> /> /> /> /> /> /> /> /> /> /> /> /> />

/>
j:=1,2   />/>/> /> /> /> /> /> /> /> /> />

/>/>/>/>/>/>/>/>/>/>/>/>
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];   />/>/>/>/>j
/>Да/> /> /> /> /> /> /> /> /> />

Нет
 

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;
functionf2(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;
ProcedureCursorSize(Size:word);
var
Regs:Registers;
begin
With Regs do
begin
AH:=$01;
CH:=Hi(size);
Cl:=Lo(Size);
intr($10,Regs);
end;
end;
procedureHiddeCursor;
begin
CursorSize($2000);
end;
ProcedureNormCursor;
begin
CursorSize($0607);
end;
Procedureramka (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 tox2-1 do write(b);
write(c);
for i:=y1+1 toy2-1 do
begin
gotoxy(x1,i);
write(d);
Gotoxy(x2,i);
write(d);
End;
GoToxy(x1,y2);
write(f);
for i:=x1+1 tox2-1 do write(b);
write(e);
End;
ProcedureOkno(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;
ProcedureZastavka;
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 untilkeypressed;
whilekeypressed do c1:=readkey;
clrscr;
End;
ProcedureSpravka;
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;
Proceduremoymenu;
begin
clrscr;
Okno(10,5,60,20,3,15);
For i:=1 to 4do
begin
Gotoxy(15,i+5);
if i=p thenTextbackground(4) else
Textbackground(3);
write(Menu[i]);
end;
End;
procedureExitfrom;
begin
writeln;
gotoxy(50,26);
Writeln(' Для прдолжениявычисления нажмите Y, для выхода -N');
ch:=readkey;
if ch=#121then moymenu else Zastavka;
end;
Procedurerunkut ;
label 2;
begin
clrscr;
textcolor(15);
NormCursor;
Writeln('Метод Рунге-Кутта ');
2: Write('Задайтеположительный начальный h=');
read(h);
if h
goto 2
else begin
write ('Задайте начальное Xo=');
read (x);
for j:=1 to ndo
begin
Write('Задайте начальныеy0[',j,']=');
readln(W[j]);
y[j]:=W[j];
end;
ur;
for j:=1 to ndo
begin
v:=H*f[j];
k[j]:=v;
y[j]:=W[j]+v/2;
end;
ur;
for j:=1 to ndo
begin
v:=H*f[j];
k[j]:=k[j]+2*v;
y[j]:=W[j]+v/2;
end;
ur;
for j:=1 to ndo
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 ndo
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=#121then runkut else moymenu;
end;end;
Procedurerukutm;
label 3;
begin
clrscr;
textcolor(15);
NormCursor;
Writeln('Метод Рунге-Кутта-Мерсона ');
3: Write('задайтеположительный начальный шаг h=');
read(h);
if h
goto 3
else begin
Write('Задайте погрешность вычислений e=');
read(e1);
write ('Задайте начальноеXo=');
read (x);
for j:=1 to ndo
begin
write('Введите начальноеY0[',j,']=');
readln(w[j]);
y[j]:=W[j];
end;
k2:=0;
e3:=0;
ur;
d2:=0;
for j:=1 to ndo
begin
a[j]:=f[j]*H;
y[j]:=W[j]+a[j]/3;
end;
x:=x+h/3;
ur;
for j:=1 to ndo
begin
y[j]:=W[j]+(a[j]+f[j]*H)/6;
end;
ur;
for j:=1 to ndo
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 ndo
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 ndo
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
if e2
e3:=0;
end;
if e30then begin
x:=x-h;
for j:=1 to ndo begin
y[j]:=W[j];
end;
H:=H/2;
end
else k2:=1;
if d2=n thenH:=H+H;
Textcolor(5);
Writeln('решение системыдифференциальных уравнений:');
for i:=1 to ndo 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=#121then rukutm else moymenu;
end; end;
BEGIN
Clrscr;
Zastavka;
11:hiddecursor;
p:=1;
moymenu;
k10:=readkey;
whilek10#13 do
begin
Case k10 of
#72: if p=1then p:=4 else p:=P-1;
#80: if p=4then 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’приводит к переходу в меню программы.
Завершение работы спрограммой реализуется выбором пункта меню “Выход”.

Заключение
В данной курсовой работеразработана блок-схема и реализована средствами языка программированияТурбо-Паскаль программа, позволяющая решить систему дифференциальных уравнений :
/>
методом Рунге-Кутта-Мерсонаи методом Рунге-Кутта.
Программа по запросупользователя сообщает общие сведения по работе с программой и производитвычисления, выбор метода вычисления производится посредством меню, ввод данныхосуществляется с клавиатуры по запросу программы.
Из анализа результатоввычисления можно сделать вывод о большей точности вычисления по методу Рунге-Кутта-Мерсона.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :