Информатика курсовая. Программа решения дифуравнения первого порядка
Скачать 4.2 Mb.
|
Министерство образования Республики Беларусь Белорусский национальный технический университет Факультет горного дела и экологии Кафедра «Горные машины» КУРСОВАЯ РАБОТА по дисциплине «Информатика» Тема: Программа решения дифуравнения первого порядка Руководитель: Евдокимчева Н.Н. Исполнитель: студент группы 10208119 Сотников М.Ю. Минск 2020 Министерство образования Республики Беларусь Белорусский национальный технический университет Кафедра «Горные машины» ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовой работе по дисциплине «Информатика» Тема: Программа решения системы дифуравнения первого порядка Руководитель : Евдокимчева Н.Н. Исполнитель: студент группы 10208119 Сотников М.Ю. Минск 2020 Содержание Введение…………………………………………………....................………………. 1. Постановка задачи……..................…………………………………………...….....6 2. Математическая формулировка задачи………………………..…...........……7 3. Алгоритмизация задачи………………………………………....................…...….9 4. Идентификаторы программы……………………………….…………................11 5. Блок – схема алгоритма………………………………………………....................12 6. Текст исходной программы…………………………………………....................23 7. Результаты работы программы……..........……………………………...............27 8. Анализ результатов……………………………………………………....................29 9. Инструкция по работе с программой…………………………………..............30 Заключение…………………………………………………………….........................31 Список использованных источников………………………………...................32 ВведениеВ курсовой работе в соответствии с заданием решается задача решения дифференциального уравнения первого порядка методом Эйлера и Рунге-Кутта. В данной пояснительной записке приводится описание последовательности шагов по составлению программы на алгоритмическом языке Turbo Pascal 7.0 и результаты применения этой программы. Рассматриваются вопросы математической формулировки и алгоритмизации задачи, разработки блок-схемы алгоритма ее решения, составления исходной Pascal-программы и реализация вычислений по составленной программе. Выбор вычисления, обращение к справке по программе и выход из программы обеспечивается с помощью специального меню. Ввод исходных данных и вывод результатов поиска минимума функции выполняется в отдельном окне. 1. Постановка задачиСтавится задача составить программу решения системы дифференциального уравнения первого порядка методом Эйлера и Рунге-Кутта. Таким образом, программа должна обеспечивать возможность: быстрой смены функции путем замены аналитического выражения ее правой части в подпрограмме – функции; вывода результатов вычисления на дисплей в удобном для восприятия виде с отображением названия выбранного численного метода. Кроме того, целесообразно предоставить пользователю возможность получить краткую справку по программе, а также давать подсказки по ходу работы с программой. В результате сформулируем следующую задачу по созданию программы: значения функции должны вычисляться в подпрограмме – функции; программа после загрузки должна выводить на дисплей исходное окно-заставку, в которой отображаются общие сведения об авторе и подсказку для пользователя о последующих действиях; после выполнения указанной в строке подсказки процедуры перехода должно выводиться вертикальное меню с пунктами: «Справка», «Решение» и «Выход»; при выборе в меню пункта «Справка» должна выводиться краткая, справка о назначении программы и порядке работы с ней; после выбора в меню пункта «Решение» должно открываться отдельное окно, в котором будут выводиться результаты решения дифференциального уравнения; при выборе пункта меню «Выход» программы должна завершать работу. 2. Математическая формулировка задач 2.1 Метод Эйлера. Метод Эйлера относится к численным методам, дающим решение в виде таблицы приближённых значений искомой функции. Пусть дано дифференциальное уравнение Y'=f(x,y) с начальным условием y(x0)=y0. Выбрав достаточно малый шаг h, рассмотрим систему равноотстоящих точек xi=x0+ih (i=0,1,2,…). В методе Эйлера приближённые значения y(xi) yi вычисляются последовательно по формулам yi+1=yi+hf(xi,yi) (i=1,2,3…). (1) При этом искомая интегральная кривая y=y(x), проходящая через точку M0(x0,y0), заменяется ломанной M0M1M2K с вершинами Mi(xi,yi) (i=0,1,2,3,K); каждое звено MiMi+1 этой ломаной, называемой ломаной Эйлера, имеет направление, совпадающее с направлением той интегральной кривой уравнения Y'=f(x,y), которая проходит через точку Mi. 2.2 Метод Рунге – Кутты. При решении методом Рунге – Кутты дифференциального уравнения Y'=f(x,y) с начальным условием y(x0)=y0 через yi обозначают приближённые значения искомого решения в точке xi и вычисление приближённого значения y i+1 в следующей точке x i+1= xi+h производится по формулам: y i+1= y i+ yi, (2) yi=1/6(K(i)1+2K(i)2+2K(i)3+K(i)4), где (3) K(i)1= h*f(xi,yi), (4) K(i)2=h*f(x i+h/2, y i+ K(i)1/2), (5) K(i)3= h*f(x i+h/2, y i+ K(i)2/2), (6) K(i)4= h*f(x i+h, y i+ K(i)3). (7) Порядок выполнения вычислений по методу Рунге – Кутты: Выбираются x и y. Вычисляются f(x0,y0). Определяются K(0)1=h*f(x0,y0). Определяются x 0+h/2 , y 0+ K(1)1/2. Вычисляются f(x 0+h/2, y 0+ K(0)1/2) и K(0)2=h*f(x 0+h/2, y 0+ K(0)1/2). Принимаются x 0+h/2 ,y 0+ K(0)2/2. Вычисляются f(x 0+h/2, y 0+ K(0)2/2) , K(0)3=h*f(x 0+h/2, y 0+ K(0)2/2). Определяются x 0+h , y 0+ K(0)3. Вычисляются f(x 0+h, y 0+ K(0)3/2) ,K(0)4=h*f(x 0+h, y 0+ K(0)3). Суммируются K(0)1+2K(0)2+2K(0)3+K(0)4 , делятся на шесть и в результате получаются y0. Вычисляются y 1= y 0+ y0. Затем все вычисления продолжаются в том же порядке, принимая за начальную точку (x1, y1). Заметим, что шаг расчёта можно менять при переходе от одной точки к другой. Для контроля правильности выбора шага h рекомендуется вычислять дробь =I(K(1)2 - K(1)3)/(K(1)1 - K(1)2)I. Величина не должна превышать нескольких сотых. В противном случае шаг h следует уменьшить. Метод Рунге – Кутты имеет порядок точности h на всём отрезке [x0, X]. Грубую оценку погрешности можно получить с помощью двойного просчёта по формуле , где - значение точного решения уравнения в точке , а и - приближённые значения, полученные с шагом h/2 и h. При решении на ЭВМ методом Рунге – Кутта с автоматическим выбором шага обычно в каждой точке xi делают двойной просчёт – сначала с шагом h, затем с шагом h/2. Если полученные при этом значения yi различаются в пределах допустимой точности, то шаг h для следующей точки x i+1 удваивают, в противном случае берут половинный шаг. 3. Алгоритмизация задачи В соответствии с постановленной в разделе 1 задачей целесообразно реализовать алгоритм, использующий обращение к соответствующим подпрограммам из головной программы. Алгоритм работы головной программы следующий: Скрыть курсор с использованием подпрограммы - процедуры скрытия курсора и вывести в специальном окне заставку программы, содержащую сведения об исполнителе и руководителе курсовой работы, а также подсказку для пользователя о последующих действиях, с использованием подпрограммы - процедуры заставки. Запустить подпрограмму-процедуру вертикального меню при нажатии любой клавиши, с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора. Запустить подпрограмму-процедуру справки и вывести в специальном окне справочные сведения о работе с программой при выборе пункта меню «Справка» с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора, а также строки-подсказки о возврате в меню. Запустить подпрограмму-процедуру решения дифференциального уравнения первого порядка при выборе пункта меню «Решение» с и использованием подпрограмм-процедур построения окна, вывода рамки окна и вкл0ючения курсора, а также строки-подсказки о возврате в меню. Завершить работу программы при выборе пункта меню «Выход». Алгоритм решения системы дифуравнения первого порядка методом Эйлера и методом Рунге-Кутта в подпрограмме-процедуре включает следующие шаги: Создать окно для вывода результатов вычисления по методу Эйлера и Рунге-Кутта Восстановить отображение курсора нормального размера соответствующей подпрограммой-процедурой; Присвоить значения x0,y0,h,e , согласно условиям задания Используется цикл от 0 до N для вычисления по формулам (1)-(7) значений Y при X, к которому приращивается шаг 0.1 до значения X = 0.5. Так как в задании указано найти решение на интервале от 0 до 0.5, то следовательно число шагов N будет равным 5. Вывести результаты вычислений; Вывести в окне запрос о возможности выхода в главное меню программы; Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Enter» перейти к пункту 3, при нажатии «Esc» перейти в окно с меню, при нажатии любой другой клавиши игнорировать нажатия; 4. Идентификаторы программыДля указания соответствия обозначений переменных в формулах математической формулировки и их идентификаторов в программе сведем их в таблицу 1: Таблица 1
Остальные идентификаторы являются промежуточными или служебными. 5. Блок-схема алгоритма 5 .1. Блок-схема алгоритма головной программы 5.2 Блок-схема подпрограммы–процедуры «CursorSize». 5.3 Блок-схема подпрограммы–процедуры «HiddeCursor» 5.4 Блок-схема подпрограммы–процедуры «NormCursor» 5.5 Блок-схема подпрограммы – процедуры «TextOut» 5.6 Блок-схема подпрограммы – процедуры «Fon» 5.7 Блок-схема подпрограммы – процедуры «Ramka» 5.8 Блок-схема подпрограммы – процедуры «Okno» 5.9 Блок-схема алгоритма подпрограммы–процедуры «Zastawka». 5.10 Блок-схема алгоритма подпрограммы–процедуры «Sprawka». 5.11 Блок-схема алгоритма подпрограммы–процедуры «MyMenu». 5.13 Блок-схема алгоритма подпрограммы–процедуры «wwod». Блок-схема алгоритма подпрограммы–процедуры «eilerrk». 5.15 Блок-схема подпрограммы–процедуры «Resheniye» Текст исходной программы program eilerrkeilerrk; uses crt,dos; type mas1 = Array[1..3] of String[50]; const menu : mas1 =(' Справка ', ' Решение ', ' Выход '); OsnText = Yellow; OsnFon = Blue; OsnRamka = LightGray; RamkaMenu = 6; var poz : integer; key : Char; i,N : integer; 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 TextOut(x,y: byte;Text: string); Begin GotoXY(x,y); write(Text); End; procedure Fon(FCol: byte); Begin TextBackGround(FCol); ClrScr; End; Procedure ramka(x1,y1,x2,y2,RCol:byte); const a=#201; b=#205; c=#187; d=#186; e=#188; f=#200; var i: integer; Begin x2:= x2 - 1; Textcolor(RCol); TextOut(x1,y1,a); for i:=x1+1 to x2-1 do write(b); write(c); for i:=y1+1 to y2-1 do begin TextOut(x1,i,d); TextOut(x2,i,d); end; TextOut(x1,y2,f); for i:=x1+1 to x2-1 do write(b); TextOut(x2,y2,e); TextColor(OsnText); End; procedure Okno(x1,y1,x2,y2,FCol,RCol,TCol :byte); Begin window(x1,y1,x2,y2); Fon(FCol); ramka(x1,y1,x2,y2,RCol); window(x1+1,y1+1,x2-2,y2-1); Fon(FCol); TextColor(TCol); GotoXY(1,1); End; Procedure Zastawka; Begin HiddeCursor; okno(1,1,80,25,Black,Yellow,White); TextOut(13, 1,'Министерство образования Республики Беларусь'); TextOut(13, 2,'Белорусский национальный технический университет'); TextOut(14, 7,'Программа решения дифференциального уравнения'); TextOut(29, 8,'Курсовая работа'); TextOut(25, 9,'по дисциплине "Информатика"'); TextOut(49,13,'Исполнитель : Сотников М.Ю.'); TextOut(58,14,'гр.: 10208119'); TextOut(49,16,'Руководитель: Евдокимчева Н.Н.'); TextOut(31,21,'Минск 2020'); TextColor(Yellow); TextOut(17,23,'Для продолжения нажмите любую клавишу ... '); ReadKey; End; program Spravka; begin HiddeCursor; okno(1,1,80,25,OsnFon,OsnRamka,OsnText); TextOut(32,2,'Справка'); TextOut(5,4,'Данная программа позволяет решить дифференциальное уравнение'); TextOut(2,5,'методом Эйлера и методом Рунге-Кутта.'); TextOut(5,7,'После перехода в меню выберите клавишами управления курсора необходимый'); TextOut(2,8,'пункт'); TextOut(5,9,'При выборе пункта меню Решение на экран выводится решение уравнения); TextOut(5,10,'в заданном интервале от 0 до 0.5 с погрешностью 0.001, при шаге'); TextOut(5,11,'h=0.1 , y(0)=1. После получения результатов будет предложен выход в главное.'); TextOut(5,15,'‚меню'); TextOut(23,23,'Esc - выход в главное меню'); repeat ch:=ReadKey; until ch=#27; end. Procedure Mymenu; var i : integer; Begin ramka(22,7,57,13,RamkaMenu); TextColor(RamkaMenu); TextOut(35,7,'[ Меню ]'); TextColor(OsnText); for i:=1 to 3 do begin Gotoxy(25,i+8); if i=poz then Textbackground(Red) else Textbackground(OsnFon); write(Menu[i]); end; TextColor(OsnText); TextBackGround(OsnFon);{} End; program wwod; begin okno(1,1,80,25,OsnFon,OsnRamka,OsnText); TextOut(2,1,'Решение дифференциального уравнения методом Эйлера и Рунге Кутта'); TextOut(15,2,'y^=y+(1+X)y^2 при h=0.1, e=0.001, y(0)=1'); end. program eilerrk; begin clrscr; read(('x':3,' Метод Эйлера , y(x)= ':20,' Метод Рунге-Кутта, y(x)= ':18)); x:=x0; ye:=1; yem:=1; yr:=1; for i := 1 to n do begin writeln((x:5:2,f(x):25:10,yr:25:10)); ye:=ye+h*fxy(x,ye); k1:=h*fxy(x,yr); k2:=h*fxy(x+h/2,yr+k1/2); k3:=h*fxy(x+h/2,yr+k2/2); k4:=h*fxy(x+h,yr+k3); yr:=yr+(k1+2*k2+2*k3+k4)/6; x:=x+h; end; end. program Resheniye; begin NormCursor; repeat repeat wwod; TextOut(5,22,'Enter -Получить решение; Esc - выход в глав. меню'); repeat ch:=ReadKey; until (ch=#13)or(ch=#8)or(ch=#27); until (ch=#13)or(ch=#27); if ch=#27 then break else begin end; repeat eilerrk; TextOut(5,22,' Esc - выход в главное меню '); repeat ch:=ReadKey; until (ch=#13)or(ch=#27)or(ch=#8); until (ch=#27)or(ch=#8); until ch=#27; end. BEGIN TextMode(3); zastawka; repeat hiddecursor; poz:=1; okno(1, 1,80,25,OsnFon,OsnRamka,OsnText); Mymenu; key:=readkey; while key<>#13 do begin Case key of #72: if poz=1 then poz:=3 else poz:=poz-1; #80: if poz=3 then poz:=1 else poz:=poz+1; end; Mymenu; key:=readkey; end; Case poz of 1: spravka; 2: resheniye; 3: exit; end; until False;{+} END. Результаты работы программы После запуска программы в соответствии с поставленной задачей на проектирование выводится окно заставки программы, приведенное на рисунке 2. Рисунок 2. Окно заставки. После нажатия любой клавиши выводится окно с меню, представленное на рисунке 3. Рисунок 3. Окно с меню. При выборе пункта меню «Справка» открывается соответствующее окно, в котором находится справочная информация о программе (см. рис. 4). Рисунок 4. Окно справки. При выборе пункта меню «Решение» открывается соответствующее окно, в котором выводятся результаты поиска (см. рис. 5,). Рисунок 5. Вывод результатов. Анализ результатовПроведем проверку результатов вычислений программы сравнивая с результатами Excel. Рисунок 6. Проверка результатов Рисунок 7. Результаты расчетов методами Эйлера и Рунге-Кутта. Вывод: метод Эйлера находит решение дифференциального уравнения первого порядка и результаты удовлетворяют заданной погрешности e=0.001. 9. Инструкция по работе с программойФайл DifUrawn.pas с исходным текстом Паскаль-программы находится по адресу E:\ 2 курс\10208119\Sotnikov. Необходимо загрузить Turbo Pascal 7.0, сделать текущим каталог Sotnikov, открыть файл с исходной Паскаль-программой DifUrawn.pas и запустить ее на выполнение командой Run. После вывода заставки программы нажать любую клавишу для перехода в меню и открыть окно справки. После ознакомления со справкой нажатием клавиши «Esc» возвратится в окно меню, с помощью клавиш управления курсором выбрать пункт «Решение» и ввести по запросу программы исходные данные. Затем проверить правильность введенных данных и сообщить результат программе. При необходимости повторить процедуру ввода исходных данных Результаты поиска минимума выводятся в том же окне, где вводились исходные данные. Нажатие клавиши «Esc» приводит к переходу в меню программы. Завершение работы с программой реализуется выбором пункта меню “Выход”. ЗаключениеВ данной курсовой работе разработана и реализована средствами языка программирования Турбо-Паскаль программа решения дифуравнения первого порядка методом Эйлера и методом Рунге-Кутта. Программа обладает дружеским интерфейсом, по запросу пользователя сообщает общие сведения по работе с программой и производит вычисления, ввод данных осуществляется с клавиатуры по запросу программы. Список использованных источниковНачала программирования на языке Паскаль/С.А. Абрамов – М., 1987 Программирование в среде Турбо-Паскаль/Д.Б. Поляков – М., 1992 Методические указания по выполнению курсовой работы по дисциплине «Информатика» для студентов специальностей горного профиля заочной формы обучения/С.М. Петренко, И.В. Недашковская – М., 2005 Справочник по алгоритмам и программам на языке бейсик для персональных ЭВМ/В.П. Дьяконов – М.: Наука, 1987 Численные методы для ПЭВМ на языках бейсик, фортран и паскаль/А.Е. Мудров – Томск, 1991 |