Описание интерфейса
В принципе, программа реализует нахождение минимума любой функции с любым количеством переменных!
Пользователь должен ввести номер функции, минимум которой он хочет найти. Программа сама определит количество переменных в целевой функции.
1 - x1^2 + 2*x2^2 - 2*x1*x2 + x2
2 - (x1-1)^2+(x2-3)^2+4*(x3+5)^2
3 - 100*(x2-x1^2)^2+(1-x1)^2
Когда пользователь выберет целевую функцию, программа предложит ему ввести точность:
e=
максимальное количество итераций:
M=
тип дифференцирования (числовой, аналитический):
1 - Analytical
2 - Numerical
и координаты начальной точки вручную:
X[i] = 0.5;
Сравнение с работой надстройки «Поиск решения»
После сравнения работы программы с работой надстройки «Поиск решения» в MS Excel, можно сказать, что программа ищет минимум функции с большей точностью, к тому же эту точность можно корректировать по ходу выполнения программы.
0,999997 |
1,36E-08 |
0,999992 |
|
0,999955 |
|
0,999904 |
|
В данной таблице, скопированной из приложения MS Excel, представлен вектор столбец, являющийся искомым минимумом для целевой функции с четырьмя переменными. Справа представлено значение целевой функции, посчитанное приложением MS Excel в полученной точке предполагаемого минимума.
В процессе работы программы для точности Е = 0,000001 был получен ответ (1, 1, 1, 1)t после 1374 итераций.
Результаты тестирования программы
Для функции f(x1,x2) = 100*(x2-x1x1)(x2-x1x1) + (1-x1)(1-x1):
Е = 0,00001 |
Е = 0,000001 |
||
Кол-во итераций |
Результат |
Кол-во итераций |
Результат |
49 |
(0,999995; 0,99999)t |
60 |
(1; 0,999999)t |
Для функции f(x1,x2,x3) = (x1-1)(x1-1) + (x2-3)(x2-3) + 4(x3+5)(x3+5):
Е = 0,00001 |
Е = 0,000001 |
||
Кол-во итераций |
Результат |
Кол-во итераций |
Результат |
2 |
(1; 3; -5)t |
2 |
(1; 3; -5)t |
Для функции f(x1,x2,x3,x4) = x1^2 + 2*x2^2 - 2*x1*x2 + x2:
Е = 0,00001 |
Е = 0,000001 |
||
Кол-во итераций |
Результат |
Кол-во итераций |
Результат |
1160 |
(0.499999;0.499997)t |
1374 |
( 0.5; 0.5)t |
Ответы на контрольные вопросы
1. Перечислите основные постулаты структурного программирования.
1) Абстракция данных;
2) Разбиение программы на модули;
3) Отказ от команды безусловного перехода, известной также под названием GOTO;
4) Использование подпрограмм.
2. Перечислите основные постулаты объектно-ориентированного программирования.
-
Инкапсуляция;
-
Наследование;
-
Полиморфизм.
3. В чем отличие структурного и объектно-ориентированного подхода при разработке программ?
Абстрактность - нелинейное, зависящее от смысла соответствие между исходным и результирующим кодом. Абстрактность облегчила труд программиста и позволила непосредственно заняться проблемой управляемости программ.
Разбиение программы на модули, соответствует разбиению основной задачи на множество небольших подзадач. Каждый модуль выполняет свою задачу независимо от других, и потому может быть описан и отлажен отдельно. Определяется модуль как фрагмент программы с одним входом и одним выходом, состоящий из операций, "вложенных" модулей и структурных операторов передачи управления.
Ключевым моментом является отказ от команды безусловного перехода, известной также под названием GOTO. Эта команда может быть в любом положении заменена структурными операторами передачи управления, в число которых входит условный оператор, операторы цикла и оператор выбора.
На стадии разработки любой модуль, исходный код которого выходит за пределы экрана, рекомендуется выделять в подпрограмму. Это значительно увеличивает читабельность программы, особенно если давать процедурам и переменным осмысленные имена вместо невнятных аббревиатур.
Теоретически принцип инкапсуляции применим как к отдельным объектам, так и к классам. В случае классов с методами объединяются не сами данные, а структуры данных, и объединение с конкретными данными происходит в момент создания объектов данного класса. На практике же многие объектно-ориентированные языки просто не позволяют создавать объекты, не создав предварительно класса.
Наследование относится только к классам объектов. Это означает, что каждый объект может иметь наследников, каждый из которых будет обладать всеми полями и методами своего предка. Кроме того, как правило, классы-наследники совместимы по типу со своими предками. Наследование бывает двух видов:
одиночное - когда каждый класс имеет одного и только одного предка;
множественное - когда каждый класс может иметь любое количество предков.
Множественное наследование обладает более мощными возможностями: в одном классе-наследнике объединяются свойства (поля и методы) множества различных классов. К примеру один из предков может рисовать себя, а другой - производить вычисления. представитель их наследника смогут делать и то, и другое.
Полиморфизм неразрывно связан с наследованием и гласит, что каждый класс наследник может обладать не только свойствами, унаследованными от предка, но и своими собственными. В частности, свойства предка могут быть перекрыты наследником - на место свойств предка могут быть подставлены свойства наследника.
Существование принципа полиморфизма является естественным следствием существования принципа наследования: наследование без изменения набора свойств не имеет смысла. Кроме того, без полиморфизма невозможно реализовать объединение различных объектов (классов) по некоторому набору свойств (невозможно абстрагироваться от части свойств объектов), а без этого теряется весь смысл подхода.
4. Какие варианты при разработке класса вектора были рассмотрены, каковы достоинства и недостатки каждого из вариантов.
Первоначально был рассмотрен вариант обработки элементов вектора отдельно друг от друга, т.е. предполагалось не объединять координаты вектора в один объект, а пользоваться россыпью переменных, привязываясь к какой-то определенной размерности пространства векторов. Этот вариант был отклонен еще на начальном этапе проектирования. Было очевидно, что для реализации обработки функции с произвольным числом переменных необходимо иметь более гибкую систему переменных, в которых хранить значения координат.
Затем был рассмотрен вариант представления вектора как массива вещественных чисел, имеющего заведомо излишне большую длину. Здесь тоже возникли трудности, т.к. параллельно с массивом приходилось хранить в памяти размерность текущего пространства. Доступ к элементам массива был очень прост, но этот выигрыш не окупал сложностей, возникавших при написании основных процедур реализации методов оптимизации.
В конечном итоге было решено остановиться на следующей реализации: был введен объект вектор, представляющий собой динамический массив заданной длины и информацию об этой длине. Возник класс Vector, реализующий эту идею и предоставляющий возможность использовать всю необходимую информацию о векторе в одном объекте. Очевидно, что данный вариант реализации гораздо удобнее в использовании, созданный класс самодостаточен, в нем есть все необходимое, чтобы реализовать требуемые методы оптимизации целевых функций с любым количеством переменных.
Вывод
В данной лабораторной работе была сделана попытка создания программы, отвечающей требованиям современной технологии разработки программ оптимизации, ориентированных на язык С++. В программе был реализован метод, доставляющий минимум целевой функции при движении вдоль заданной прямой. Также программа позволяет пользователю отслеживать влияние входных параметров на выполнение основных алгоритмов функций, использовать начальные настройки программы, а так же вносить корректирующие изменения во время выполнения программы.