Разработка прикладного программного обеспечения для решения расчетных задач для компьютера. Численное интегрирование - вычисление значения определённого интеграла. Проектирование алгоритма численного метода. Тестирование работоспособности программы.
Аннотация к работе
1.2 Анализ литературы и программ, патентный поиск 1.3 Формирование требований к программе Проектирование схем алгоритмов 2.1 Разработка алгоритма головной программы 3.
Список литературы
Приложение А
Введение
Современное состояние науки и техники требует от инженерно-технических и научных работников знания средств вычислительной техники и умения обращения с современными программно-техническими комплексами. Эффективное использование компьютеров для решения инженерных и научных задач невозможно без знаний основных методов составления схем алгоритмов, написания эффективного программного обеспечения на языке программирования, использования пакетов программ инженерной графики, использования математических систем.
Цель данной курсовой работы - закрепление на практике знаний, полученных при изучении курса "Информатика", и приобретение опыта самостоятельной разработки прикладного программного обеспечения для решения расчетных задач для персонального компьютера.
1. Описание поставленной задачи
Численное интегрирование - вычисление значения определенного интеграла, основанное на том, что величина интеграла численно равна площади криволинейной трапеции, ограниченной осью абсцисс, графиком интегрируемой функции и отрезками прямых.
Необходимость применения численного интегрирования чаще всего может быть вызвана отсутствием у первообразной функции представления в элементарных функциях и, следовательно, невозможностью аналитического вычисления значения определенного интеграла по формуле Ньютона-Лейбница. Также возможна ситуация, когда вид первообразной настолько сложен, что быстрее вычислить значение интеграла численным методом.
1.1 Краткая характеристика численного метода
Разработка программы численного интегрирования обыкновенного дифференциального уравнения явным модифицированным методом Эйлера.
В этом методе в точках (Xn, Yn) и (Xn 1, Yn 1) используется значение угла наклона касательной в точке (Xn 1/2, Yn 1/2), расположенной посередине между точками Xn и Xn 1.
Как и ранее, предполагается известным значения решения Yn в точке Xn.
Метод состоит из двух шагов: 1) Первый шаг - расчет значения функции Yn 1/2 в точке (Xn h/2) по методу Эйлера
(Yn 1=Yn hf (Xn, Yn), n=1,2,…,N)
Yn 1/2=Yn f (Xn, Yn) (1.1)
2) Второй шаг - расчет функции y в точке с координатой xn 1 с использованием значения функции
F (xn 1/2,yn 1/2) в точке (xn 1/2,yn 1/2): Yn 1=Yn hf (xn h/2, Yn 1/2) (1.2)
Таким образом, расчетные формулы имеют следующий вид: Yn 1/2=Yn f (Xn, Yy) (1.3)
Yn 1=Yn hf (xn , Yn f (Xn,, Yn)) (1.4)
Обозначив через k1=f (Xn, Yn), k2=f (Xn h/2, Yn hk 1/2), метод можно представить в обычном для методов Рунге-Кутта виде: (1.5)
Этот метод также является методом Рунге-Кутта второго порядка. Здесь тоже приходится вычислять дважды функцию f (x, y) для получения решения в следующей точке Xn 1.
Для анализа погрешности численного решения модифицированным методом Эйлера получим точное решение задачи Коши для модельного уравнения u? = ?u при x > 0; u (0) = a (1.6) где a, ? - некоторые константы. программа численное интегрирование
Формула модифицированного метода Эйлера (1.4) для уравнения (1.6) имеет вид
Yn 1=Yn h HYN (? h?2/2) =Yn (1 h? h2?2/2), (1.7) так как в данном случае f (x,y) = ?y, то f (Xn , Yn f (Xn,,Yn)) = ? (Yn H?YN/2) (1.8)
Таким образом, точное решение уравнения (1.4) для модельного уравнения (1.6) в точке Xn 1 имеет вид
Yn 1=a (1 h? h2?2/2) n 1 (1.9)
В то же время точное решение дифференциального уравнения (1.6) есть , которое при x = h можно разложить в ряд Тейлора в окрестности точки x = 0: u=a (1 h? ) (1.10)
Из сопоставления уравнений (1.9) и (1.10) видно, что численное решение задачи (1.6) представляет собой три первых члена разложения функции в ряд Тейлора, то есть точного решения дифференциального уравнения (1.6), и ошибка его |un-yn| возрастает с увеличением x при ? > 0.
В случае ? < 0 уравнение (1.6) будет иметь асимптотически устойчивое решение, затухающее с увеличением x , тогда как численное решение при h > 2/| ? | (1.11) с увеличением n неограниченно возрастает. Это явление называют частичной неустойчивостью, и проявляется оно с увеличением h, начиная с некоторого h > hk, во всех явных методах типа Рунге-Кутта. Явление это не следует путать с неустойчивостью разностной схемы (метода), которая проявляется при уменьшении шага интегрирования h.
Следует отметить, что явление частичной неустойчивости в явных методах Рунге-Кутта проявляется и при решении уравнений, не имеющих асимптотически устойчивых решений. В этих случаях частичная неустойчивость затушевывается ростом самого решения.
Рис.1 Модифицированный метод Эйлера.
1.2 Анализ литературы и программ, патентный поиск
Проанализировав, литературу получили, итоговые математические выражения: Yn 1/2=Yn f (Xn, Yy) Yn 1=Yn hf (xn , Yn f (Xn,, Yn))
Yn 1=Yn h HYN (? h?2/2) =Yn (1 h? h2?2/2), при h > 2/| ? |
Для решения данной задачи будем использовать систему программирования MS Visual Studio.
Используемая литература В.И. Мышенков, Е.В. Мышенков. Численные методы. Часть вторая. Численное решение обыкновенных дифференциальных уравнений. Стр.12 Ссылка в интернете http://evm. a18. nthosting.ru/chislmet2. pdf.
1.3 Формирование требований к программе
1) Операционная система - Microsoft Windows 95/98/XP/Vista/7;
2) Системные требования (минимальные): процессор с тактовой частотой 900 МГЦ, оперативная память 128 МБ, 5 МБ свободного места на жестком диске, встроенный видеоадаптер, клавиатура, мышь;
3) Программа должна вычислять дифференциальное уравнение по Модифицированному методу Эйлера, вводимыми данными будут являться: уравнение которое нужно решить, X0,Y0,E, промежуток на котором будет производиться расчет.
4) проверка корректности введенных данных выполняется с помощью встроенного метода обработки исключений “try-catch”;
5) расчетное выражение задается с помощью полей ввода, расположенных на главной форме приложения;
6) Значения Y получаемые в процессе решения уравнения будут являться решением данного метода;
7) Процесс выполнения расчета не отображается;
8) Пользователь не может прервать выполнение расчета, если данные введены некорректно программа автоматически сообщит об ошибке;
9) Результаты расчета показываются в специальных полях.
2. Проектирование схем алгоритмов
2.1 Разработка алгоритма головной программы
Схема алгоритма головной программы разрабатывается с учетом интерактивного характера проектируемой программы-приложения. Поэтому следует учитывать событийный характер функционирования программы. При этом каждому возможному событию соответствует вызов определенного обработчика. Программа-приложение должна иметь обработчики следующих событий: 1) ввод исходных данных задачи;
2) расчет задачи;
3) вывод результатов расчетов;
4) получение справочной информации.
Рисунок 2.1 - Общая схема приложения.
2.2 Проектирование алгоритма ввода исходных данных
Для расчета интеграла численным методом, понадобятся некоторые численные значения: пределы интегрирования, коэффициенты для определения вида интеграла. Значения вводятся с клавиатуры в специально отведенные поля и проверяются на корректность, в случае неправильности введенных данных на экран выводится сообщение об ошибке.
Рисунок 2.2 - Схема ввода данных.
2.3 Разработка алгоритма вывода результатов
Рисунок 2.3 - Схема вывода данных.
2.4 Проектирование алгоритма численного метода
Для расчета численным методом будут использоваться данные введенные с клавиатуры значения. Будут использоваться циклы for и операторы условия if. Рассчитанный результат будет выведен на экран.
Рисунок 2.4 - Схема алгоритма численного метода.
3. Кодирование программы в среде программирования
Согласно заданию, текст программы разрабатывается на языке программирования высокого уровня С#, на основе алгоритма программы. Для удобства работы запись исходных данных осуществляется с клавиатуры, а результат выводиться на монитор.
3.1 Разработка структуры программирования
В программе используется три формы: MAINFORM - главная форма приложения, на ней расположены все необходимые элементы для полноценной работы программы.
SAVEFORM - форма которая выводится в случае успешного сохранения вводимых и выводимых.
EXITFORM - форма которая подтверждает выход из программы.
В состав пакета входят следующие файлы: app. config, MAINFORM. cs, MAINFORM. resx, MAINFORM. Designer. cs, Program. cs.
3.2 Разработка интерфейса пользователя
Проектируемая программа имеет стандартный интерфейс, разработанный при помощи Windows Forms. (рисунки 3.1 - 3.3).
Рисунок 3.1 - Главная форма
Кнопка "Расчет" запускает расчет обыкновенного дифференциального уравнения Модифицированным методом Эйлера.
Кнопка "Сохранить" выполняет сохранение вида вводимых данных и результатов расчета в текстовый файл, в случае успешного сохранения пользователю выводится сообщение (рис.3.2)
Кнопка "Выход" запускает форму подтверждения выхода из программы и запускает процесс выхода из программы.
Рисунок 3.2 - Форма оповещения об успешном сохранении.
В следствии нажатии клавиши "Выход" пользователю выводится сообщение о выходе из программы.
Рисунок 3.3 - Форма выхода из приложения.
Структура интерфейса каждой формы описана в приложении А.
3.3 Программирование ввода-вывода данных
Ввод и вывод данных осуществляется с помощью главной формы. Введенные в поля данные преобразуются из строкового типа в численные и обратно с помощью встроенной функции "Convert" (Convert. TODOUBLE, Convert. TOSTRING).
3.4 Программная реализация численного метода
Текст программной реализации численного метода в приложении A.
4. Тестирование работоспособности программы
Цель выполнения данного раздела - проверка работоспособности разработанной при выполнении предыдущего раздела программы.
4.1 Расчет тестового примера
1) тестирование устойчивости, проверка устойчивости программы на некорректный ввод данных.
При вводе букв, символов в поля для ввода программа будет выводить сообщение об ошибке.
Y0=-1 при X0=0 на отрезке [0,1] с точностью E=10-2. Рассчитаем это уравнение по модифицированному методу Эйлера.
При k=1
Т.к. получили
При k=2
Т.к. получили
При k=3
Т.к. получили
Аналогично вычислим , .
Таблица 1 - Результаты полученные в ходе решения уравнения k 0 1 2 3 4 5
Xk 0 0.2 0.4 0.6 0.8 1
Yk -1 -.784 -.529 -.242 0.069 0.399
3) вычислительный процесс устойчив, время реакции на команды пользователя и скорость вычислений удовлетворительные, интерфейс понятен пользователю.
4.4 Тестовый расчет, сравнение с тестовым примером
Как показал расчет вручную, результат вычисления дифференциального уравнения совпал с результатом вычисления на компьютере.
Рассчитано в ручную: k012345
Xk 0 0.2 0.4 0.6 0.8 1
Yk -1 -.784 -.529 -.242 0.069 0.399
Рассчитано на компьютере: k012345
Xk 0 0.2 0.4 0.6 0.8 1
Yk -1 -.784 -.529 -.242 0.069 0.399
Заключение
В результате выполнения курсовой работы было произведено математическое описания задачи решения дифференциального уравнения модифицированным методом Эйлера, разработана схема алгоритма и написана программа решения на языке программирования С#. В программе предусмотрена обработка большого количества ошибок ввода пользователя, проведенное тестирование показало правильность результатов вычисления. Разработанная программа может использоваться для решения дифференциального уравнения модифицированным методом Эйлера.
Список литературы
1. Мышенков В.И., Мышенков Е.В. Численные методы. Часть вторая. Решение обыкновенных дифференциальных уравнений 109с.
2. Методические указания и задания к курсовому проектированию для студентов специальности 140607 "Электрооборудование автомобилей и тракторов". Могилев 2009г. Сост. В.Н. Абабурко, К.В. Овсянников - Могилев: Белорус. - Рос. ун-т, 2005. - 25 с.
// this. label3. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label3. Location = new System. Drawing. Point (118,12);
this. label3. Name = "label3";
this. label3. Size = new System. Drawing. Size (40, 20);
// this. TEXTBOX4. Location = new System. Drawing. Point (391,2);
this. TEXTBOX4. Multiline = true;
this. TEXTBOX4. Name = "TEXTBOX4";
this. TEXTBOX4. Size = new System. Drawing. Size (15, 20);
this. TEXTBOX4. TABINDEX = 4;
this. TEXTBOX4. Text = "1";
//
// label4
// this. label4. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label4. Location = new System. Drawing. Point (8, 75);
this. label4. Name = "label4";
this. label4. Size = new System. Drawing. Size (40, 20);
// this. TEXTBOX5. Location = new System. Drawing. Point (54, 76);
this. TEXTBOX5. Name = "TEXTBOX5";
this. TEXTBOX5. Size = new System. Drawing. Size (40, 20);
this. TEXTBOX5. TABINDEX = 5;
this. TEXTBOX5. Text = "-1";
//
// label5
// this. label5. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label5. Location = new System. Drawing. Point (8, 102);
this. label5. Name = "label5";
this. label5. Size = new System. Drawing. Size (40, 20);
// this. TEXTBOX6. Location = new System. Drawing. Point (54, 102);
this. TEXTBOX6. Name = "TEXTBOX6";
this. TEXTBOX6. Size = new System. Drawing. Size (40, 20);
this. TEXTBOX6. TABINDEX = 6;
this. TEXTBOX6. Text = "0";
this. TEXTBOX6. TEXTCHANGED = new System. EVENTHANDLER (this. TEXTBOX6TEXTCHANGED);
//
// label6
// this. label6. Font = new System. Drawing. Font ("Microsoft Sans Serif", 12F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label6. Location = new System. Drawing. Point (225, 74);
this. label6. Name = "label6";
this. label6. Size = new System. Drawing. Size (40, 20);
// this. TEXTBOX7. Location = new System. Drawing. Point (271, 75);
this. TEXTBOX7. Name = "TEXTBOX7";
this. TEXTBOX7. Size = new System. Drawing. Size (40, 20);
this. TEXTBOX7. TABINDEX = 7;
this. TEXTBOX7. Text = "0,01";
//
// TEXTBOX8
// this. TEXTBOX8. Location = new System. Drawing. Point (28, 163);
this. TEXTBOX8. Name = "TEXTBOX8";
this. TEXTBOX8. READONLY = true;
this. TEXTBOX8. Size = new System. Drawing. Size (20, 20);
this. TEXTBOX8. TABINDEX = 0;
this. TEXTBOX8. TABSTOP = false;
this. TEXTBOX8. Text = "0";
//
// TEXTBOX9
// this. TEXTBOX9. Location = new System. Drawing. Point (64, 163);
this. TEXTBOX9. Name = "TEXTBOX9";
this. TEXTBOX9. Size = new System. Drawing. Size (20, 20);
this. TEXTBOX9. TABINDEX = 8;
this. TEXTBOX9. Text = "1";
//
// label7
// this. label7. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label7. Location = new System. Drawing. Point (12, 162);
this. label7. Name = "label7";
this. label7. Size = new System. Drawing. Size (10, 20);
// this. label8. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label8. Location = new System. Drawing. Point (51, 163);
this. label8. Name = "label8";
this. label8. Size = new System. Drawing. Size (10, 20);
// this. label9. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label9. Location = new System. Drawing. Point (91, 162);
this. label9. Name = "label9";
this. label9. Size = new System. Drawing. Size (10, 20);
// this. button1. Location = new System. Drawing. Point (11, 305);
this. button1. Name = "button1";
this. button1. Size = new System. Drawing. Size (94, 23);
this. button1. TABINDEX = 9;
this. button1. Text = "Расчет";
this. button1. USEVISUALSTYLEBACKCOLOR = true;
this. button1. Click = new System. EVENTHANDLER (this. Button1Click);
//
// label10
// this. label10. Font = new System. Drawing. Font ("Microsoft Sans Serif", 12F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label10. Location = new System. Drawing. Point (302, 13);
this. label10. Name = "label10";
this. label10. Size = new System. Drawing. Size (10, 20);
// this. label11. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label11. Location = new System. Drawing. Point (375, 13);
this. label11. Name = "label11";
this. label11. Size = new System. Drawing. Size (10, 20);
// this. label12. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label12. Location = new System. Drawing. Point (226,12);
this. label12. Name = "label12";
this. label12. Size = new System. Drawing. Size (10, 20);
// this. TEXTBOX10. Location = new System. Drawing. Point (469, 13);
this. TEXTBOX10. Name = "TEXTBOX10";
this. TEXTBOX10. Size = new System. Drawing. Size (40, 20);
this. TEXTBOX10. TABINDEX = 3;
this. TEXTBOX10. Text = "0";
//
// label13
// this. label13. Font = new System. Drawing. Font ("Microsoft Sans Serif", 12F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label13. Location = new System. Drawing. Point (453, 15);
this. label13. Name = "label13";
this. label13. Size = new System. Drawing. Size (10, 20);
this. RICHTEXTBOX3. Size = new System. Drawing. Size (149, 155);
this. RICHTEXTBOX3. TABINDEX = 10;
this. RICHTEXTBOX3. Text = "";
//
// label14
// this. label14. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label14. Location = new System. Drawing. Point (180, 261);
this. label14. Name = "label14";
this. label14. Size = new System. Drawing. Size (10, 20);
// this. label15. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label15. Location = new System. Drawing. Point (276, 261);
this. label15. Name = "label15";
this. label15. Size = new System. Drawing. Size (20, 20);
// this. label16. Font = new System. Drawing. Font ("Microsoft Sans Serif", 8.25F, System. Drawing. FONTSTYLE. Regular, System. Drawing. GRAPHICSUNIT. Point, ( (byte) (204)));
this. label16. Location = new System. Drawing. Point (433, 261);
this. label16. Name = "label16";
this. label16. Size = new System. Drawing. Size (20, 20);