- •Содержание:
- •Цель работы и требования задания
- •Описание метода оптимизации
- •Спецификация программы.
- •Спецификация функций.
- •Результаты тестирования программы.
- •Ответы на контрольные вопросы.
- •1)Построить систему сопряженных направлений методом Пауэлла для функции трех переменных.
- •2)Как реализуется свойство параллельного подпространства в методах Пауэлла-1 и Пауэлла-2?
- •3)Какие модификации реализованы в методе Пауэлла для произвольных функций?
- •6)Перечислить критерии окончания поиска, используемые в методах нулевого порядка.
- •Текст программы
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
Кафедра САПР
ОТЧЕТ
по лабораторной работе №9
«Исследование методов безусловной оптимизации нулевого порядка»
вариант № 7
факультет КТИ
группа 3371
студенты:
Артемьев Ю.
Власюк А.
преподаватель: Муранов И.
Санкт-Петербург 2006
Содержание:
1) Цель работы ……………………………………………………….3
2) Описание метода оптимизации…………………………………...3
3) Спецификация программы………………………………………..4
4) Спецификация функций…………………………………………..5
5) Результаты тестирования программы……………………………6
6) Ответы на контрольные вопросы………………………………....7
7)Текст программы…………………………………………………...9
8) Вывод…………………………………………… ………………..16
Цель работы и требования задания
Цель работы– исследование прямых методов многомерной минимизации при помощи метода Зангвилла.
Функции: f1(x) = (x1 – 2)4 + (x1 – 2x2 )2
f2(x)=[1.5 - x1(1 – x2)]2 + [2.25 - x1(1 – x22)]2 + [2.625 - x1(1 – x23)]2
Описание метода оптимизации
Основная стратегия метода базируется на свойстве квадратичных функций, называемом свойством параллельного подпространства. Если xk + 1 – точка минимума квадратичной функции, полученная в результате серии одномерных поисков из начальной точки x1 по всем направлениям системы k = {pi}, i = 1, 2, ..., k, а zk + 1 – точка минимума этой же функции вдоль тех же направлений k, но из другой начальной точки z1, то вектор pk + 1 = = zk + 1 – xk + 1 сопряжен со всеми направлениями системы k.
Начальный этап. Задать начальную точку x1, константу . Положить p1 = –grad y(x1), k = 1.
Основной этап.
Шаг 1. Оптимальный поиск точки xk + 1 = xk + kpk. Если k = n, то перейти к шагу 4.
Шаг 2. Перейти в другую начальную точку z1 = xk + 1 + *d, где d = = –grad y(xk + 1) – новое поисковое направление, * – оптимальное решение задачи минимизации y(xk + 1 + d). Положить i = 1.
Шаг 3. Проверить критерий окончания поиска и, если он не выполняется, осуществить спуск вдоль направлений k в точку zk + 1:
(1) если grad y(zi) ≤ , то остановиться: x* = zi – искомый минимум;
(2) найти оптимальный шаг i в точку zi + 1 = zi + pi;
(3) если i < n, то положить i = i + 1 и вернуться к операции (2); иначе – построить новое сопряженное направление pk + 1 = zk + 1 – xk + 1, положить k = = k + 1 и перейти к шагу 1.
Шаг 4. Установить новые начальные условия для очередной итерации:
(1) взять xn + 1 за новую начальную точку x1 = xn + 1, принять p1 = = –grad y(x1);
(2) положить k = k + 1 и перейти к шагу 1.
Спецификация программы.
Программа минимизирует заданную функцию методом проекций Заутендийка.
Глобальные переменные:
class vec //Класс вектор
{
public:
vec(inti1 = 5); //Конструктор
~vec(); //Деструктор
int Vn; //Размерность вектора
double *x;
vec operator +(const vec &x); //Сложение векторов
vec operator -(const vec &x); //Вычитание векторов
void operator =(const vec &x); //Операция присваивания
vecoperator*(doublea); //Умножение вектора на скаляр
vecoperator/(doublea); //Деление вектора на скаляр
vecoperator/(vecx); //Поэлементное деление векторов
doubleoperator*(constvec&x); //Скалярное произведение векторов
};
class matrix //Класс матриц
{
public:
int Mn;//Размерность матрицы
vec *M;
matrix(int i1 = 5);
~matrix();
vecoperator*(constvec&x); //Произведение матрицы и вектора
matrix operator *(double a); //Умножение матрицы на скаляр
matrix operator +(const matrix &A); //Сложение матриц
matrix operator -(const matrix &A); //Вычитание матриц
matrixoperator/(doublea); //Поэлементное деление матрицы на число
matrixTr(void); //Транспонирование матрицы
};
intiCount; //Число переменных в функции
intiFunction; //Номер минимизируемой функции
int iIteration; //Счетчик числа итераций
double alfa[3]={0,0,0}; //Массив для хранения коэффициента «а»:x2=x1+a*p;