Скачиваний:
2
Добавлен:
02.11.2025
Размер:
76.01 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» Факультет инфокоммуникационных сетей и систем

Кафедра вычислительной техники и программной инженерии ПРАКТИЧЕСКАЯ РАБОТА №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;

}