Скачиваний:
4
Добавлен:
01.05.2014
Размер:
80.38 Кб
Скачать

Описание интерфейса

В принципе, программа реализует нахождение минимума любой функции с любым количеством переменных!

Пользователь должен ввести номер функции, минимум которой он хочет найти. Программа сама определит количество переменных в целевой функции.

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. Перечислите основные постулаты объектно-ориентированного программирования.

  1. Инкапсуляция;

  2. Наследование;

  3. Полиморфизм.

3. В чем отличие структурного и объектно-ориентированного подхода при разработке программ?

Абстрактность - нелинейное, зависящее от смысла соответствие между исходным и результирующим кодом. Абстрактность облегчила труд программиста и позволила непосредственно заняться проблемой управляемости программ.

Разбиение программы на модули, соответствует разбиению основной задачи на множество небольших подзадач. Каждый модуль выполняет свою задачу независимо от других, и потому может быть описан и отлажен отдельно. Определяется модуль как фрагмент программы с одним входом и одним выходом, состоящий из операций, "вложенных" модулей и структурных операторов передачи управления.

Ключевым моментом является отказ от команды безусловного перехода, известной также под названием GOTO. Эта команда может быть в любом положении заменена структурными операторами передачи управления, в число которых входит условный оператор, операторы цикла и оператор выбора.

На стадии разработки любой модуль, исходный код которого выходит за пределы экрана, рекомендуется выделять в подпрограмму. Это значительно увеличивает читабельность программы, особенно если давать процедурам и переменным осмысленные имена вместо невнятных аббревиатур.

Теоретически принцип инкапсуляции применим как к отдельным объектам, так и к классам. В случае классов с методами объединяются не сами данные, а структуры данных, и объединение с конкретными данными происходит в момент создания объектов данного класса. На практике же многие объектно-ориентированные языки просто не позволяют создавать объекты, не создав предварительно класса.

 Наследование относится только к классам объектов. Это означает, что каждый объект может иметь наследников, каждый из которых будет обладать всеми полями и методами своего предка. Кроме того, как правило, классы-наследники совместимы по типу со своими предками. Наследование бывает двух видов:

одиночное - когда каждый класс имеет одного и только одного предка;

множественное - когда каждый класс может иметь любое количество предков. 

Множественное наследование обладает более мощными возможностями: в одном классе-наследнике объединяются свойства (поля и методы) множества различных классов. К примеру один из предков может рисовать себя, а другой - производить вычисления. представитель их наследника смогут делать и то, и другое.

Полиморфизм неразрывно связан с наследованием и гласит, что каждый класс наследник может обладать не только свойствами, унаследованными от предка, но и своими собственными. В частности, свойства предка могут быть перекрыты наследником - на место свойств предка могут быть подставлены свойства наследника.

Существование принципа полиморфизма является естественным следствием существования принципа наследования: наследование без изменения набора свойств не имеет смысла. Кроме того, без полиморфизма невозможно реализовать объединение различных объектов (классов) по некоторому набору свойств (невозможно абстрагироваться от части свойств объектов), а без этого теряется весь смысл подхода.

4. Какие варианты при разработке класса вектора были рассмотрены, каковы достоинства и недостатки каждого из вариантов.

Первоначально был рассмотрен вариант обработки элементов вектора отдельно друг от друга, т.е. предполагалось не объединять координаты вектора в один объект, а пользоваться россыпью переменных, привязываясь к какой-то определенной размерности пространства векторов. Этот вариант был отклонен еще на начальном этапе проектирования. Было очевидно, что для реализации обработки функции с произвольным числом переменных необходимо иметь более гибкую систему переменных, в которых хранить значения координат.

Затем был рассмотрен вариант представления вектора как массива вещественных чисел, имеющего заведомо излишне большую длину. Здесь тоже возникли трудности, т.к. параллельно с массивом приходилось хранить в памяти размерность текущего пространства. Доступ к элементам массива был очень прост, но этот выигрыш не окупал сложностей, возникавших при написании основных процедур реализации методов оптимизации.

В конечном итоге было решено остановиться на следующей реализации: был введен объект вектор, представляющий собой динамический массив заданной длины и информацию об этой длине. Возник класс Vector, реализующий эту идею и предоставляющий возможность использовать всю необходимую информацию о векторе в одном объекте. Очевидно, что данный вариант реализации гораздо удобнее в использовании, созданный класс самодостаточен, в нем есть все необходимое, чтобы реализовать требуемые методы оптимизации целевых функций с любым количеством переменных.

Вывод

В данной лабораторной работе была сделана попытка создания программы, отвечающей требованиям современной технологии разработки программ оптимизации, ориентированных на язык С++. В программе был реализован метод, доставляющий минимум целевой функции при движении вдоль заданной прямой. Также программа позволяет пользователю отслеживать влияние входных параметров на выполнение основных алгоритмов функций, использовать начальные настройки программы, а так же вносить корректирующие изменения во время выполнения программы.

8

Соседние файлы в папке Лабораторная работа №5