- •Содержание
- •Предисловие
- •Глава I. Нелинейное программирование: экстремумы функций нескольких переменных
- •§1. Классические методы оптимизации
- •1.1. Безусловный экстремум функции одной переменной
- •1.2. Условный экстремум функции одной переменной
- •1.3. Безусловный экстремум функций двух переменных
- •1.4. Упражнения.
- •§2. Безусловный экстремум функций нескольких переменных
- •2.1. Необходимые и достаточные условия
- •§3. Условный экстремум функций нескольких переменных
- •3.1. Основные определения и факты
- •3.2. Условный экстремум при ограничениях типа равенств
- •3.3. Условный экстремум при ограничениях типа неравенств
- •3.4. Условный экстремум при смешанных ограничениях
- •3.5. Понятие о методах штрафных функций
- •Глава II. Численные методы нелинейного программирования
- •§1. Общие положения
- •1.1. Постановка проблемы
- •1.2. Общие принципы.
- •§2. Методы нулевого порядка одномерной минимизации
- •2.1. Общие положения
- •2.2. Метод равномерного поиска
- •2.3. Метод деления интервала пополам
- •§3. Методы первого и второго порядка
- •3.1. Метод градиентного спуска с постоянным шагом
- •3.2. Метод Ньютона
- •§4. Элементы численных методов задачи условной оптимизации выпуклого программирования
- •4.2. Постановка задачи выпуклого программирования.
- •4.3. Численные методы на основе метода штрафных функций
- •4.4. Метод проекции градиента.
- •Приложение 1. Варианты индивидуальных заданий
- •Задание нп-1
- •Задание нп-2
- •Задание нп-3
- •Задание нп-4
- •Задание нп-5
- •Задание нп-6
- •Задание нп-7
- •Задание нп-8
§3. Методы первого и второго порядка
Методы первого и второго порядков рассмотрим на примере методов градиентного спуска с постоянным шагом и метода Ньютона.
3.1. Метод градиентного спуска с постоянным шагом
Напомним, что в большинстве случаев численные методы минимизации основываются на построении итерационной последовательности {Xk}, обладающей свойством f(Xk+1)<f(Xk), (k=0, 1, …), по формулам Xk+1=Xk+hkDk, Dk направление спуска, hk величина шага. Если Dk=f(Xk), то метод называется градиентным. Если величину шага hk оставлять постоянной (до тех пор, пока функция убывает в точках последовательности), то метод называется методом градиентного спуска с постоянным шагом. Убывание контролируется путём проверки выполнения условия f(Xk+1)f(Xk)<0. Построение последовательности {Xk} заканчивается в точке Xk, для которой |f(Xk)|<1, или выполняется система
где 1, 2 заданные положительные числа, или kk0, где k0 предельное число итераций. Дополнительно необходимо провести исследование вопроса, является ли найденная точка действительным приближением искомой функции.
Более подробно:
1.
Задать X0,
1>0,
2>0,
k0.
Найти градиент функции f(X)=
,
…,
(Напоминаем, что в отношение вектора
возможно одновременное применение в
качестве обозначений как строки, так и
столбца. При чтении произведений типа
AX
или XA,
где X
вектор, а A
(mn)-матрица,
разночтений быть не должно: в первом
случае
это столбец с n
элементами, во втором
строка с m
элементами).
2. Положить k=0.
3. Вычислить f(Xk).
4. Проверить критерий окончания |f(Xk)|1:
а) если критерий выполнен, то расчёт закончен: X*=Xk;
б) если критерий не выполнен, то перейти к шагу 5.
5. Проверить выполнение неравенства kk0:
а) если неравенство выполнено, то расчёт окончен: X*=Xk;
б) если нет, то перейти к шагу 6.
6. Задать величину шага hk.
7. Вычислить Xk+1=Xkhkf(Xk).
8. Проверить выполнение условия f(Xk+1)f(Xk)<0:
а) если условие выполнено, то перейти к шагу 9;
б)
если условие не выполнено, то положить
hk=
и перейти к шагу 7.
9. Проверить условия (Xk+1, Xk)<2 и |f(Xk+1)f(Xk)|<2:
а) если оба условия выполнены при текущем значении k и k1, то расчёт окончен: X*=Xk;
б) если хотя бы одно условие не выполнено, то положить k=k+1 и перейти к шагу 3.
Вопрос о сходимости последовательности {Xk} к решению X* решается в общем в случае с помощью так называемого условия Липшица. Мы ограничимся тем фактом, что если f(X) сильно выпуклая функция, то при любом выборе X0 последовательность {Xk}, полученная методом градиентного спуска, сходится к точке X*. Поэтому прежде, чем начинать строить последовательность {Xk}, необходимо проверить условие сильной выпуклости функции.
После окончания процедуры нахождения X*Xk, необходимо проверить, что найденная точка, действительно, является приближением решения задачи.
Если f(X) дважды непрерывно дифференцируемая (а мы ограничимся именно этим классом задач), то при H(Xk)>0 точка Xk является приближением искомой точки.
Пример I. Найти локальный минимум функции
f(x1, x2)=3 +2x1x2+2 .
Решение.
Прежде всего убедимся, что функция
выпукла. Так как H(X)=
,
то H(X)>0
и функция сильно выпукла, и сходимость
итерационного процесса гарантирована.
I. Найдём Xk.
1. Зададим X0=(1, 1), 1=0,1, 2=0,1, k0=10 и найдём градиент f(X)=(6x1+2x2, 2x1+4x2).
2. Положим k=0.
3.0. Вычислим f(X0)=(8; 6).
4.0.
Вычислим |f(X0)|
и проверим критерий окончания:
|f(X0)|=
=10>0,1.
Переходим к шагу 5.
5.0. Проверим условие k>k0: k=0<10=k0. Переходим к шагу 6.
6.0. Зададим h0=0,2.
7.0. Вычислим X1=X00,2f(X0)=(1; 1)0,2(8; 6)=(0,6; 0,2).
8.0. Проверим выполнение условия f(X1)f(X0)<0. Так как f(X1)=1,4, f(X0)=7, то условие выполняется. Переходим к шагу 9.
9.0. Проверим условия (X1, X0)<0,1 и |f(X1)f(X0)|<0,1. Второе условие не выполняется: |f(X1)f(X0)|=5,6>0,1. Полагаем k=1 и переходим к шагу 3.
3.1. Вычислим f(X1)=(4; 2).
4.1.
Вычислим |f(X1)|
и проверим критерий окончания:
|f(X1)|=
=
>0,1.
Переходим к шагу 5.
5.1. Проверим условие k>k0: k=1<10=k0. Переходим к шагу 6.
6.1. Зададим h1=0,2.
7.1. Вычислим X2=X10,2f(X1)=(0,6; 0,2)0,2(4; 2)=(0,2; 0,2).
8.1. Проверим выполнение условия f(X2)f(X1)<0. Так как f(X2)=0,28, f(X1)=1,4, то условие выполняется: f(X2)f(X1)=0,281,4=1,12. Переходим к шагу 9.
9.1. Проверим условия (X2, X1)<0,1 и |f(X2)f(X1)|<0,1. Второе условие не выполняется: |f(X2)f(X1)|=1,12>0,1. Полагаем k=2 и переходим к шагу 3.
3.2. Вычислим f(X2)=(1,6; 1,2).
4.2.
Вычислим |f(X1)|
и проверим критерий окончания:
|f(X1)|=
=2>0,1.
Переходим к шагу 5.
5.2. Проверим условие k>k0: k=2<10=k0. Переходим к шагу 6.
6.2. Зададим h2=0,2.
7.2. Вычислим X3=X20,2f(X2)=(0,2; 0,2)0,2(1,6; 1,2)=(0,12; 0,04).
8.2. Проверим выполнение условия f(X3)f(X2)<0. Так как f(X3)=0,056, f(X2)=0,28, то условие выполняется: f(X3)f(X2)=0,224. Переходим к шагу 9.
9.2. Проверим условия (X3, X2)<0,1 и |f(X3)f(X2)|<0,1. Второе условие не выполняется: |f(X3)f(X2)|=0,224>0,1. Полагаем k=3 и переходим к шагу 3.
3.3. Вычислим f(X3)=(0,8; 0,4).
4.3. Вычислим |f(X3)| и проверим критерий окончания: |f(X3)|=0,8944>0,1. Переходим к шагу 5.
5.3. Проверим условие k>k0: k=3<10=k0. Переходим к шагу 6.
6.3. Зададим h3=0,2.
7.3. Вычислим X4=X30,2f(X3)=(0,12; 0,02)0,2(0,8; 0,4)=(0,04; 0,04).
8.3. Проверим выполнение условия f(X4)f(X3)<0. Так как f(X4)=0,0112, f(X3)=0,056, то условие выполняется: f(X4)f(X3)=0,0448. Переходим к шагу 9.
9.3. Проверим условия (X4, X3)<0,1 и |f(X4)f(X3)|<0,1. Второе условие выполняется: |f(X4)f(X3)|=0,0448<0,1. Для первого имеем
(X4,
X3)=
=
0,1789>0,1,
и условие не выполняется. Полагаем k=4 и переходим к шагу 3.
3.4. Вычислим f(X4)=(0,32; 0,24).
4.4. Вычислим |f(X4)| и проверим критерий окончания: |f(X4)|=0,4>0,1. Переходим к шагу 5.
5.4. Проверим условие k>k0: k=4<10=k0. Переходим к шагу 6.
6.4. Зададим h4=0,2.
7.4. Вычислим X5=X40,2f(X4)=(0,04; 0,04)0,2(0,32; 0,24)=(0,024; 0,008).
8.4. Проверим выполнение условия f(X5)f(X4)<0. Так как f(X5)=0,0022, f(X4)=0,0112, то условие выполняется: f(X5)f(X4)=0,009. Переходим к шагу 9.
9.4. Проверим условия (X5, X4)<0,1 и |f(X5)f(X4)|<0,1. Второе условие выполняется: |f(X5)f(X4)|=0,009<0,1. Для первого имеем
(X5,
X4)=
=
0,08<0,1,
и условия выполняются. Условия должны выполняться для текущего k и k1. Поэтому полагаем k=5 и переходим к шагу 3.
3.5. Вычислим f(X5)=(0,16; 0,08).
4.5. Вычислим |f(X5)| и проверим критерий окончания: |f(X5)|=0,1799>0,1. Переходим к шагу 5.
5.5. Проверим условие k>k0: k=5<10=k0. Переходим к шагу 6.
6.5. Зададим h5=0,2.
7.5. Вычислим
X6=X50,2f(X4)=(0,024; 0,008)0,2(0,16; 0,08)=(0,008; 0,008).
8.5. Проверим выполнение условия f(X6)f(X5)<0. Так как f(X6)=0,0005, f(X5)=0,0022, то условие выполняется: f(X6)f(X5)=0,0017. Переходим к шагу 9.
9.5. Проверим условия (X6, X5)<0,1 и |f(X6)f(X5)|<0,1. Второе условие выполняется: |f(X6)f(X5)|=0,0017<0,1. Для первого имеем
(X6,
X5)=
0,0358<0,1.
Так как оба условия выполнены при текущем значении k=5 k1=4, то расчёт окончен: X*=X5=(0,024; 0,008).
II. Анализ точки X5.
Функция f(x1, x2)=3 +2x1x2+2 является дважды дифференцируемой. Так как матрица Гессе постоянна и является положительно определённой, то точка X5 является точкой локального минимума, а значение f(X5)=0,0022 приближённое значение локального минимума.
Ответ: точкой локального минимума является точка X*=(0,024; 0,008), f(X*)=0,0022 локальный минимум.
