Лабораторные работы. Владимиров / Оптимизация_Практика_9_Отчет_(Границы)
.pdfФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» Факультет инфокоммуникационных сетей и систем
Кафедра вычислительной техники и программной инженерии ПРАКТИЧЕСКАЯ РАБОТА №9
По дисциплине «Оптимизация и математические методы принятия решений»
Вариант 22
Выполнил: Студент 2-го курса Дневного отделения Группы ИКПИ-32 Андреев А. А., Жилкин Д. А, Яковлев М. А. Преподаватель:
Владимиров С. А.
Санкт-Петербург
2025
Цель работы
Выполнить постановку и нахождение оптимального решения в нелинейных задачах, записанных в виде аналитических функций, используя метод множителей Лагранжа и теорему Каруша-Куна- Таккера.
Постановка задачи
Найти решение для следующей задачи:
Ход работы
1. Определение типа задачи.
Составим матрицу вторых производных целевой функции f(x):
Главные миноры этой матрицы:
Главные миноры неотрицательные. Таким образом, целевая функция является выпуклой. Ограничения задачи линейны. Следовательно, исходная задача является задачей выпуклого программирования.
2.Введем множество = { : 1 ≥ 0, 2 ≥ 0, 3 }. Запишем задачу в виде
( ) = 12 + 22 + 32 →
Ограничения задачи выражены в виде линейных функций, значит, проверка условия Слейтера не требуется.
3. Составим функцию Лагранжа:
( , ) = 12 + 22 + 32 + 1(2 1 − 2 + 4 3 − 1) + 2( 1 − 3 − 3),
, 2, 2
Найдем стационарные точки функции Лагранжа:
Решив данную систему методом Гаусса, получим: x1 = 0.61, x2 = 0.84, x3 = 0.15, 1 = −0.28, 2 = −0.65, что противоречит условию.
Стационарных точек нет. Будем проверять наличие решения на границах множества :
1 = { : 1 = 0, 2 ≥ 0, 3 ≥ 0}
2 = { : 1 ≥ 0, 2 = 0, 3 ≥ 0}
3 = { : 1 ≥ 0, 2 ≥ 0, 3 = 0}
4 = { : 1 = 0, 2 = 0, 3 ≥ 0}
5 = { : 1 ≥ 0, 2 = 0, 3 = 0}
6 = { : 1 = 0, 2 ≥ 0, 3 = 0}
7 = { : 1 = 2 = 3 = 0} 4. Рассмотрим 1 = { : 2 ≥ 0, 1 = 0, 3 ≥ 0}.
Задача примет вид ( ) = 22 + 32 →
Запишем функцию Лагранжа для задачи на границе 1:
( , ) = 22 + 32 + 1(− 2 + 4 3 − 1) + 2(3 2 – 3 − 3), 2 ≥ 0, 2 ≥ 0
Составим систему для нахождения стационарных точек:
Получим x1 = 0, x2 = 1.1, x3 = 0.54, 1 = −0.951 2 = −0.95, что противоречит условию 2 ≥ 0.
5. Рассмотрим 2 = { : 1 ≥ 0, 2 = 0, 3 ≥ 0}.
Задача примет вид ( ) = 12 + 32 →
Запишем функцию Лагранжа для задачи на границе 2:
( , ) = 12 + 32 + 1(2 1 + 4 3 − 1) + 2( 1 − 3 − 3), 1,3 ≥ 0, 2 ≥ 0
Составим систему для нахождения стационарных точек:
Из решения методом Гаусса, получим:
1 = ; 2 = ; ;
Так как 2 ≥ 0, то решение не подходит.
6. Рассмотрим 3 = { : 1 ≥ 0, 2 ≥ 0, 3 = 0}.
Задача примет вид ( ) = 12 + 22 →
Запишем функцию Лагранжа для задачи на границе 3:
( , ) = 12 + 22 + 1(2 1 + 2 − 1) + 2( 1 + 3 2 − 3), 1,2 ≥ 0, 2 ≥ 0
Составим систему для нахождения стационарных точек:
Из решения методом Гаусса, получим:
1 = ; 2 = ; ;
Так как 2 ≥ 0, то решение не подходит.
7. Рассмотрим 4 = { : 1 = 0, 2 = 0, 3 ≥ 0}.
Задача примет вид ( ) = 32 →
Запишем функцию Лагранжа для задачи на границе 4:
( , ) = 32 + 1(4 3 − 1) + 2( 3 − 3), 2 ≥ 0
Составим систему для нахождения стационарных точек:
Из решения этой системы методом Гаусса, получим, что нет решений. 8. Рассмотрим 5 = { : 1 ≥ 0, 2 = 0, 3 = 0}.
Задача примет вид ( ) = 12 →
Запишем функцию Лагранжа для задачи на границе 5:
( , ) = 12 + 1(2 1 − 1) + 2( 1 − 3), 2 ≥ 0
Составим систему для нахождения стационарных точек:
Система решений не имеет.
9. Рассмотрим 6 = { : 1 = 0, 2 ≥ 0, 3 = 0}.
Задача примет вид ( ) = 22 →
Запишем функцию Лагранжа для задачи на границе 6:
( , ) = 22 + 1(− 2 − 1) + 2(3 2 − 3), 2 ≥ 0
Составим систему для нахождения стационарных точек:
Условия и противоречивы, система не имеет решений. 10. Рассмотрим 7 = { : 1 = 0, 2 = 0, 3 = 0}.
Решение не может быть найдено. 11. Заключение.
Оптимального решения не найдено.
Программа
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() {
// Создаем матрицу коэффициентов vector<vector<double>> matrix = {
{2, 0, 0, 2, 1, 0}, {0, 2, 0, -1, 3, 0}, {0, 0, 2, 4, -1, 0}, {2, -1, 4, 0, 0, 1}, {1, 3, -1, 0, 0, 3}
};
int n = matrix.size();
// Прямой ход метода Гаусса for (int i = 0; i < n; i++) {
// Поиск максимального элемента в столбце int maxRow = i;
for (int k = i + 1; k < n; k++) {
if (abs(matrix[k][i]) > abs(matrix[maxRow][i])) { maxRow = k;
}
}
// Обмен строк
if (maxRow != i) {
swap(matrix[i], matrix[maxRow]);
}
// Приведение к треугольному виду
for (int k = i + 1; k < n; k++) {
double factor = matrix[k][i] / matrix[i][i]; for (int j = i; j <= n; j++) {
matrix[k][j] -= factor * matrix[i][j];
}
}
}
// Обратный ход vector<double> solution(n); for (int i = n - 1; i >= 0; i--) {
solution[i] = matrix[i][n]; for (int j = i + 1; j < n; j++) {
solution[i] -= matrix[i][j] * solution[j];
}
solution[i] /= matrix[i][i];
}
cout << "Решение системы:" << endl; cout << "x = " << solution[0] << endl; cout << "y = " << solution[1] << endl; cout << "z = " << solution[2] << endl; cout << "a = " << solution[3] << endl; cout << "b = " << solution[4] << endl; return 0;
}
