Поиск локального минимума методом градиентного спуска
Содержание
Введение
Информатика
является основной базой для проведения
научно-исследовательских и
Согласно
заданию цель данной курсовой работы –
разработка программы численного решения
эллептического дифференциального уравнения
Лапласа в частных производных метода
Дирихле в среде программирования Borland
C++Builder для персонального компьютера.
1 Описание поставленной задачи
1.1 Краткая характеристика численного метода
Этот метод является наиболее часто используемым представителем методов
первого порядка. Градиент (13.7.4) указывает направление наибольшей скорости
возрастания целевой функции. Движение к минимуму функции производится в направлении –grad F(x), которое называется антиградиентом.
В
методе наискорейшего спуска осуществляется
движение вдоль направления
_K+1_K _K
X = X + DX
_i
где DX – приращение вектора X на i-й итерации, который в методе наискорейшего спуска определяется как
где αK – величина оптимального шага на i-й итерации, для простого
случая (метод с постоянным шаговым множителем) αK=1;
S – вектор в направлении градиента функции.
Модуль градиента определяется по формуле
Для двухпараметрической целевой функции выражение
примет вид
Тогда составляющие вектора направления градиента
Выражения частных производных градиента могут задаваться аналитически с помощью подпрограмм или определяться численно.
1.2 Анализ литературы и программ, патентный список
Описание численного метода Кранка-Николсона рассмотрено в [1] и на сайтах Интернет, посвященных компьютерной математики находится на следующих сайтах:
- www.exponenta.ru;
- http://dxdy.ru
Поиск данных в Интернет производился с помощью поисковой службы Google.by
1.3 Формирование требований к программе
Разрабатываемая программа должна удовлетворять следующим требованиям:
- тип операционной системы – Windows XP/Vista/7;
- система программирования – Borland C++Builder не ниже v5.0;
- формат файла исходных данных – текстовый;
- форма вывода результатов расчета:
- таблица результатов расчета искомой функции с сохранением в текстовый файл;
5) формат файла справки – html.
2 Проектирование схем алгоритмов
2.1 Разработка алгоритма головной программы
Схема алгоритма головной программы описывает общий сценарий работы разрабатываемого приложения. В составе проекта приложения предусматривается пять форм:
- главная форма приложения;
- форма ввода исходных данных;
- форма отображения результатов расчета;
- форма информации о программе.
При запуске приложения отображается главная форма, на которой находятся управляющие элементы: главное меню и кнопки инструментов. В схеме головного алгоритма предусматривается обработка следующих событий (нажатие соответствующей кнопки или выбор пункта главного меню):
1)
вызов формы для ввода
2) загрузка созданного ранее файла с исходными данными;
3) поиск локального минимума двухпараметрической функции на основе метода градиентного спуска, при условии ввода исходных данных;
4) отображение результатов расчета, при условии успешного расчета;
5) вывод формы с информацией о программе;
6) выход из программы.
В
схеме алгоритма
1) запуск численного решения при отсутствии ввода исходных данных;
2) просмотр результатов расчета без успешного завершения этапа численного решения.
Схема
алгоритма головной программы изображается
согласно требований ГОСТ 19.701-90
на рисунке 2.1.
Ввод данных
Расчёт Нет
Да
Загрузить
Закрыть
Результат
О программе
Рисунок 2.1 – Схема алгоритма приложения
2.2 Проектирование алгоритма ввода исходных данных
Исходными данными будут являться:
1) A,B,C,D,E,F – коэффициенты функции;
2) e – точность;
3) X0,Y0 – начальная точка;
Схема алгоритма ввода исходных данных из текстового файла показана на рисунке 2.2.
Рисунок 2.2 – Схема алгоритма ввода данных из файла
Ввод
исходных данных возможен также с
клавиатуры на форме ввода. При этом
исходные данные вводятся в текстовых
полях однострочных редакторов. Алгоритм
окончательного считывания данных из
файла, где вместо операции чтения из
файла производится чтение данных из поля
нужного компонента с преобразованием
из строкового в численный тип.
2.3 Проектирование алгоритма вывода результатов
Результаты расчета будет являться точка с координатами X, Y и значение функции в этой точке.
2.4 Проектирование алгоритма численного метода
Схема
алгоритма поиска локального минимума
двухпараметрической функции на основе
метода градиентного спуска изображена
на рисунке 2.4
нет
Рисунок 2.4 – Схема алгоритма численного метода
3 Кодирование программы в среде программирования
3.1 Разработка структуры программы
Согласно
заданию проект программы разрабатывается
в среде визуального
В составе проекта входят следующие формы:
- FormM – главная форма (модуль Unit1), на которой располагается системное меню;
- FormD – форма ввода исходных данных и выполнения расчета (модуль Unit2);
- FormR – форма отображения результатов расчета (модуль Unit3);
- FormP – форма с информацией по программе (модуль Unit4);
3.2 Разработка интерфейса пользователя
3.2.1 Разработка интерфейса головной формы.
Рисунок 3.1 – Вид проекта главной формы.
В составе интерфейса главной формы используются следующие визуальные компоненты:
- MainMenu – главное меню приложения со следующими разделами:
а) «Меню» (компонент N1 класса TMenuItem) –
имеет следующие разделы:
- «Ввод данных» (N2 класса TMenuItem) –
переход на форму Form2 для ввода данных;
- «Выход» (N4 класса TMenuItem) –выход из программы;
б) «Результат» (N5 класса TMenuItem) – отображение Form3 для просмотра результата
в) «Справка» (N6 класса TMenuItem) – отображение информации о программе на форме Form4;
2) компоненты TLabel текстовых меток:
-Label1 для отображения строки «A*X^2+B*Y^2+C*X+D*Y+E*X*Y+F»;
3)кнопки управления класса TButton:
- ButtonVVOD – ввод данных;
- ButtonREZ – вывод таблицы с результатами расчета;
- ButtonEXIT – выход из программы.
3.2.2 Интерфейс формы ввода данных Form2
Рисунок 3.2 – Форма ввода исходных данных
На форме используются следующие компоненты:
- Однострочные редакторы класса TEdit для ввода исходных данных:
- EditA – коэффициент A;
- EditB – коэффициент B;
- EditC – коэффициент C;
- EditD – коэффициент D;
- EditEE – коэффициент E;
- EditF – коэффициент F;
- EditX0 – начальное значение X;
- EditY0 – начальное значение Y;
- EditE – точность;
- Текстовые надписи класса Label для пояснения назначения вышеописанных компонентов TEdit Label1, Label2, Label3, Label4, Label5, Label6, Label7, Label8, Label9;
- Кнопка управления класса TButton:
- ButtonRUN для запуска расчета;
- ButtonLOAD для загрузки исходных данных из файла;
- ButtonCL для закрытия формы ввода данных;
3.2.3 Интерфейс формы результатов расчёта Form3
Рисунок
3.3 – Форма отображения
На форме используются следующие компоненты:
1) кнопки управления класса TButton:
- ButtonCL – закрытие формы Form3;
2) EditX – вывод значения X;
EditY – вывод значения Y;
EditF – вывод значения F(X,Y);
3.2.4 Интерфейс формы информации о программе Form4
Рисунок 3.4 – Вид интерфейса формы Form4
Интерфейс пользователя на форме строится с помощью следующих стандартных компонентов C++Builder:
- Текстовые надписи класса Label для отображения сведений о программе Label1, Label2, Label3, Label4, Label5, Label6;
2)
кнопка ButtonCL для закрытия формы с информацией.
3.3 Программирование
ввода-вывода данных
Ввод исходных данных в проекте реализован 2мя способами:
1) с помощью формы Form2, где значения переменных исходных данных считываются из текстовых поле Text компонентов Edit с последующим преобразованием их в соответствующий вещественный или целочисленный тип данных;
2) чтением ранее сохраненных значений из внешнего текстового файла с помощью потока ifsteam из модуля fstream; алгоритм чтения исходных данных соответствует рисунку 2.2 на форме Form2.
При
отображении результатов
Отображение численных значений выполняется с помощью формы Form3 в EditX, EditY, EditF, используя функции преобразования численных данных в строковые FloatToStr .
3.4 Программная реализация численного метода
Программная реализация на
В начала тела функции проверяется наличие ввода исходных данных.
Тексты cpp и h файлов проекта помещаются в Приложение А.
4
Тестирование работоспособности
программы
4.1 Описание аппаратной конфигурации для тестирования
Тестирование
- тип центрального процессора DualCore AMD Athlon:
-число ядер – 2;
- тактовая частота процессора – 2700 Мгц;
- величина напряжения ядра – 1.1-1.4 В;
- объем кэша данных: L1=128 Кб, L2=1 Мб;
- системная плата Gigabyte GA-M52L-S3 с параметрами:
- форм-фактор ATX;
- наименование набора системной логики VIA KT266A;
- тип
интерфейса подключения
- максимальный объем оперативной памяти – 2 Гб;
- интерфейс подключения жесткого диска – SATA II;
- встроенный аудиоадаптер Realtek ALC883;
3)тип видеоадаптера nVIDIA GeForce 9600 GT:
- наименование графического процессора G94GT;
- объем и тип видеопамяти – 512 Мб;
- разрядность шины памяти – 256 Мб;
- частота ядра GPU 650 МГц и 900 Мгц шины видеопамяти;
- разъемы для подключения к монитору – VGA;
4)параметры монитора:
- тип монитора PHILIPS I90CW;
- ширина диагонали экрана – 19 дюймов;
-
интерфейс подключения к
- разрешение по горизонтали и вертикали – 1440х900;
- частота кадровой разверстки – 75 Гц;
5)
типы внешней памяти
- тип жесткого диска –Seagate ST3500630AS;
- максимальный объем - 500 Гб;
- частота вращения шпинделя – 7200 об/мин;
-
интерфейс подключения: SATA-
- объем кэш-памяти жесткого диска – 16 Мб;
- тип привода оптического диска – Optiarc DVD RW AD-7203S;
- значения скорости 40/40/16;
6) установлен модуль оперативной памяти DDR-2 объемом 2047;
7)
состав интерфейса для
- 6 разъема стандарта USB 2.0;
- 1 разъем порта LTP;
- 2 разъема порта СОМ;
-
блок из 6 аудиоразъемов.
4.2 Тестирование разработанной программы
Разработанное приложение включает в себя загрузочный файл – Dirihle.exe объемом 85 000 Байт.
Для тестирования программы используются следующие исходные данные:
A=1
B=1
C=1
D=1
E=1
F=1
X0=1
Y0=1
e=0.01
При вводе исходных данных форма Form2 имеет вид рисунка 4.1, а после расчета форма Form3 – рисунка 4.2.
Время
расчета составило менее 1 с.
Рисунок
4.2 – Ввод исходных данных
Рисунок
4.2 – Результат расчета
Результат расчета в виде текстового файла приводится в Приложении Б.
4.3 Решение задачи
в математической системе Mathcad
Для тестирования используется математический пакет Mathcad 14. При этом исходные данные задаются в виде:
Результаты решения в виде графика приводятся в приложении В.
4.4 Анализ результатов тестирования
По данным приложения Б получены конечные значения:
Uб3.3=
0,29
По данным приложения В получены конечные значения:
Uв3.3=
0,3
По данным приложения Г получены конечные значения:
Lг=0.
Тогда абсолютное значение ошибки программы по Mathcad
∆г=|
∆г=|0,31-0,29|=0.01
Относительное значение ошибки теста Mathcad
δг=(%)
δг=(%)=100%·|0,3-
Как видно из данных
Приложений Б и В полученная погрешность
расчета менее 5%, что допустимо для технических
расчетов. Это означает, что схема алгоритма
и текста программы написаны верно.
5 Разработка гипертекстового варианта
документа работы
Html-документ
со справочной информацией по
разработанной программе
Рисунок 5.1 – Окно обозревателя Firefox со справкой
Заключение
В результате выполнения курсовой работы было произведено описание задачи поиска локального минимума двухпараметрической функции на основе метода градиентного спуска, разработана схема алгоритма и написана программа решения на языке программирования С++ в среде программирования С++Builder. Проведенное тестирование показало правильность вычисления по спроектированной программе.
Разработанная программа может использоваться для решения дифференциального уравнения в частных производных на персональных компьютерах в среде Windows XP.
Список использованных источников
1 Динамическое программирование и уравнения в частных производных. – Москва: издательство «Мир», 1974. – 155 с.
2 Вычислительная техника и программирование. Методические указания и задания к курсовой работе для студентов специальности 1-53 01 05 «Автоматизированные электроприводы». – Могилев: Белорусско-Российский университет, 2008. – 32 c.
Приложение А
(Обязательное)
Тексты спроектированной программы
Текст
файла Project1.cpp
//----------------------------
#include <vcl.h>
#pragma hdrstop
//----------------------------
USEFORM("Unit1.cpp", FormM);
USEFORM("Unit2.cpp", FormD);
USEFORM("Unit3.cpp", FormR);
USEFORM("Unit4.cpp", FormP);
//----------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();