p align="left">Нет Да Нет Да Да Нет 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; 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' приводит к переходу в меню программы. Завершение работы с программой реализуется выбором пункта меню “Выход”. Заключение В данной курсовой работе разработана блок-схема и реализована средствами языка программирования Турбо-Паскаль программа, позволяющая решить систему дифференциальных уравнений : методом Рунге-Кутта-Мерсона и методом Рунге-Кутта. Программа по запросу пользователя сообщает общие сведения по работе с программой и производит вычисления, выбор метода вычисления производится посредством меню, ввод данных осуществляется с клавиатуры по запросу программы. Из анализа результатов вычисления можно сделать вывод о большей точности вычисления по методу Рунге-Кутта-Мерсона.
Страницы: 1, 2
|