Лабораторные работы. Владимиров / Оптимизация_Практика_9_Отчет_(Границы)
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА»
Факультет инфокоммуникационных сетей и систем
Кафедра вычислительной техники и программной инженерии
ПРАКТИЧЕСКАЯ РАБОТА №9
По дисциплине
«Оптимизация и математические методы принятия решений»
Вариант 22
Выполнил:
Студент 2-го курса
Дневного отделения
Группы ИКПИ-32
Андреев А. А.,
Жилкин Д. А,
Яковлев М. А.
Преподаватель:
Владимиров С. А.
Санкт-Петербург
2025
Цель работы
Выполнить постановку и нахождение оптимального решения в нелинейных задачах, записанных в виде аналитических функций, используя метод множителей Лагранжа и теорему Каруша-Куна-Таккера.
Постановка задачи
Найти решение для следующей задачи:
Ход работы
Определение типа задачи.
Составим матрицу вторых производных целевой функции f(x):
Главные миноры этой матрицы:
Главные миноры неотрицательные. Таким образом, целевая функция является выпуклой. Ограничения задачи линейны. Следовательно, исходная задача является задачей выпуклого программирования.
Введем множество 𝑄 = {𝑥: 𝑥1 ≥ 0, 𝑥2 ≥ 0, 𝑥 ∈ 𝑅3 }. Запишем задачу в виде
𝑓(𝑥) = 𝑥12 + 𝑥22 + 𝑥32 → 𝑚𝑖𝑛
Ограничения задачи выражены в виде линейных функций, значит, проверка условия Слейтера не требуется.
Составим функцию Лагранжа:
𝐹(𝑥,
𝜆)
= 𝑥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}
Рассмотрим 𝐿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.
Рассмотрим 𝐿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, то решение не подходит.
Рассмотрим 𝐿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, то решение не подходит.
Рассмотрим 𝐿4 = {𝑥: 𝑥1 = 0, 𝑥2 = 0, 𝑥3 ≥ 0}.
Задача примет вид 𝑓(𝑥) = 𝑥32 → 𝑚𝑖𝑛
Запишем функцию Лагранжа для задачи на границе 𝐿4:
𝐹(𝑥, 𝜆) = 𝑥32 + 𝜆1(4𝑥3 − 1) + 𝜆2(𝑥3 − 3), 𝜆2 ≥ 0
Составим систему для нахождения стационарных точек:
Из решения этой системы методом Гаусса, получим, что нет решений.
Рассмотрим 𝐿5 = {𝑥: 𝑥1 ≥ 0, 𝑥2 = 0, 𝑥3 = 0}.
Задача примет вид 𝑓(𝑥) = 𝑥12 → 𝑚𝑖𝑛
Запишем функцию Лагранжа для задачи на границе 𝐿5:
𝐹(𝑥, 𝜆) = 𝑥12 + 𝜆1(2𝑥1 − 1) + 𝜆2(𝑥1 − 3), 𝜆2 ≥ 0
Составим систему для нахождения стационарных точек:
Система решений не имеет.
Рассмотрим 𝐿6 = {𝑥: 𝑥1 = 0, 𝑥2 ≥ 0, 𝑥3 = 0}.
Задача примет вид 𝑓(𝑥) = 𝑥22 → 𝑚𝑖𝑛
Запишем функцию Лагранжа для задачи на границе 𝐿6:
𝐹(𝑥, 𝜆) = 𝑥22 + 𝜆1(−𝑥2 − 1) + 𝜆2(3𝑥2 − 3), 𝜆2 ≥ 0
Составим систему для нахождения стационарных точек:
Условия
и
противоречивы, система не имеет решений.
Рассмотрим 𝐿7 = {𝑥: 𝑥1 = 0, 𝑥2 = 0, 𝑥3 = 0}.
Решение не может быть найдено.
Заключение.
Оптимального решения не найдено.
Программа
#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;
}
