Uploaded by vxdjabkpvrzhy

Курсовая Вычислительные методы в инженерных задачах.

advertisement
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«ТЮМЕНСКИЙ ИНДУСТРИАЛЬНЫЙ УНИВЕРСИТЕТ»
Институт геологии и нефтегазодобычи
Кафедра Кибернетических систем
КУРСОВАЯ РАБОТА
по дисциплине
«Вычислительные методы в инженерных расчетах»
Тема: «Метод параллельных касательных для
многомерной безградиентной безусловной
оптимизации»
ВЫПОЛНИЛ:
Дарычев Алексей Антонович,
гр. АСОиУб 21-1
НАУЧНЫЙ РУКОВОДИТЕЛЬ:
Баюк Ольга Васильевна,
к.т.н., доцент
Тюмень, 2023
СОДЕРЖАНИЕ
ВВЕДЕНИЕ .............................................................................................................. 3
1. Постановка задачи и описание метода .............................................................. 4
2. Аналитическое решение задачи ....................................................................... 10
3. Алгоритм и программная реализация задачи ................................................. 13
ЗАКЛЮЧЕНИЕ ..................................................................................................... 15
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ............................................ 16
ПРИЛОЖЕНИЯ ..................................................................................................... 17
2
ВВЕДЕНИЕ
Оптимизация как тема исследования является актуальной, так как в
современной жизни математические задачи широко применяются и проникли
во множество наук и сфер нашей жизни. Оптимизация математических задач
нескольких переменных является необходимой, чтобы эффективно решать
проблему поиска оптимального варианта, особенно в информационных
системах, таких как инженерные, финансовые и статистические. Поэтому
методы оптимизации широко применяются в различных областях, включая
планирование
производственных
процессов,
логистику,
инженерное
проектирование, телекоммуникации и облачные технологии.
Целью данной курсовой работы служит исследование метода решения
задачи оптимизации, а именной метода параллельных касательных (метод
Пауэлла). И его применение для решения поставленной нам задачи.
В задачи работы входят изучение теоретического материала по теме
оптимизации,
а
конкретно
метода
параллельных
касательных
для
многомерной безградиентной безусловной оптимизации. Так же сюда входит
решение аналитическим методом задачи, представленной в виде уравнения
двух переменных, с использованием исследуемого метода. И на последок
программная реализация метода параллельных касательных для решения
данной нам задачи.
Объектом нашего исследования является функция, имеющая несколько
переменных, которая не ограничена количеством равенств или уравнений.
Предметом исследования является метод Пауэлла для многомерной
безградиентной безусловной оптимизации.
Методы исследования: анализ различных литературных источников и
прочих источников информации, разработка и тестирование программы,
анализ результатов.
3
1. Постановка задачи и описание метода
Оптимизация — это процесс нахождения минимума или максимума
функции на определенном множестве. В некоторых случаях это множество
может быть ограничено набором линейных или нелинейных уравнений или
неравенств. Если же ограничения отсутствуют, то это называется задачей
безусловной оптимизации. Хотя большинство задач оптимизации содержит
ограничения, изучение безусловной оптимизации важно, поскольку многие
алгоритмы на основе оптимизации с ограничениями основаны на приведении
задачи к последовательности задач безусловной оптимизации.
Безусловная оптимизация может быть одномерной или многомерной, в
последнем случае требуется поиск экстремума функции нескольких
переменных.
Пусть функция 𝑓(𝑋) = 𝑓(𝑥1 , 𝑥2 , 𝑥3 , … , 𝑥𝑛 ) определена на некотором
множестве 𝑋 ∈ 𝑅𝑛 . Если 𝑋 = 𝑅𝑛 (т.е. ограничения на переменные x1, x2, …,
xm отсутствуют), принято говорить о задаче безусловной многомерной
оптимизации.
Метод параллельных касательных относится к группе так называемых
безградиентных методов, в которых определение направления движения к
экстремуму функции не требует нахождения градиента функции, но (при
определенных условиях) может быть обеспечено достаточно быстрое
движение в сторону улучшения значения оптимизируемой функции.
В задачах на оптимизацию целью ставится нахождение экстремума
функции, заданной на некотором множестве, будь то это минимум или
максимум функции.
𝑓: 𝑋 → 𝑅
𝑓(𝑥) → 𝑚𝑖𝑛, 𝑥 ∈ 𝑋 или 𝑓(𝑥) → 𝑚𝑎𝑥, 𝑥 ∈ 𝑋
Для решения такой задачи нам будет необходимо допустимое множество
𝑋, в котором задана функция, сама функция 𝑓(𝑥), которую мы будем
4
оптимизировать, а также критерий поиска результата, то есть какой именно
экстремум функции мы будем искать max или min.
Задача считается решёной, если было показано, что допустимое
множество 𝑋 не является пустым.
𝑋= ∅
Показано, что данная нам функция 𝑓(𝑥) не имеет границ. И наконец
результатом решения задачи будет значение 𝑥 ∗ .
Метод параллельных касательных (он же Метод Пауэла) ориентирован
на решение задач с квадратичными целевыми функциями, т.е. функциями
вида:
𝑓(𝑥) = 𝑎 + 𝑏 𝑇 𝑥 + 1/2𝑥 𝑇 𝐶𝑥,
где 𝑄(𝑥) = 𝑥 𝑇 𝐶𝑥 - квадратичная форма.
Т.к. в окрестности точки оптимума любую нелинейную функцию можно
аппроксимировать квадратичной функцией (поскольку линейный член
разложения Тейлора обращается в нуль), то метод может быть применен и для
нелинейной целевой функции общего вида.
Метод
Пауэлла
использует
свойство
квадратичной
функции,
заключающееся в том, что любая прямая, которая проходит через точку
минимума функции 𝑥 ∗ , пересекает под равными углами касательные к
поверхностям равного уровня функции в точках пересечения. Оно
представлено на рисунке 1.
Рисунок 1 — Графическое представление свойства квадратичной функции
5
Суть метода заключается в следующем (Рассмотрим случай двух
переменных).
Выбирается некоторая точка 𝑥(0) и выполняется одномерный поиск
вдоль произвольного направления, приводящий в точку 𝑥(1) (𝑥(1) — точка
минимума функции на выбранном направлении).
Затем выбирается точка 𝑥(2), не лежащая на прямой 𝑥(0) — 𝑥(1), и
осуществляется одномерный поиск вдоль прямой, параллельной 𝑥(0) — 𝑥(1).
Находят точку 𝑥(3) — точку минимума функции на данном
направлении.
Точка 𝑥(3) вместе с точкой 𝑥(1) определяют направление 𝑥(1) — 𝑥(3)
одномерного поиска, дающего точку минимума 𝑥 ∗ .
Направления 𝑥 (0)
— 𝑥 (2)
и 𝑥 (1) — 𝑥 (3)
являются сопряженными
направлениями относительно матрицы 𝐶 квадратичной формы 𝑄(𝑥) (𝐶 —
сопряженные направления).
Точно также сопряженными являются направления 𝑥 (2) – 𝑥 (3) и 𝑥 (1) – 𝑥 (3)
В рассмотренных построениях для того, чтобы определить сопряженное
направление, требовалось задать две точки и некоторое направление.
Это
не
слишком
удобно
для
проведения
расчетов,
поэтому
предпочтительнее строить систему сопряженных направлений, исходя из
одной начальной точки.
Это легко осуществить при помощи единичных координатных векторов
𝑒 (1) ,
𝑒 (2) ...,
𝑒 (𝑛) .
𝑒 (1) = (1,0, . . . , 0)𝑇 ;
𝑒 (2) = (0,1, . . . , 0)𝑇 ;
...;
𝑒 (𝑛) =
(0,0, . . . , 1)𝑇 .
Проиллюстрируем процедуру построения сопряженных направлений
для случая двух переменных (ее можно обобщить и для п-мерного
пространства).
Пусть 𝑒 (1) = (1, 0)𝑇 ; 𝑒 (2) = (0, 1)𝑇 .
6
Зададим начальную точку 𝑥 (00) . Произведем одномерный поиск
минимума функции f вдоль направления 𝑒 (𝑛) . — 𝑒 (2) (𝑛 = 2), начиная из
начальной точки 𝑥 (00) .
Точки прямой, исходящей из 𝑥 (00) в направлении 𝑒 (2) , задаются
формулой 𝑥 = 𝑥 (00) + ℎ𝑒 (2) .
Вычислим значение ℎ = ℎ0 , которому соответствует минимум 𝑓(𝑥 (00) +
ℎ0 𝑒 (2) ). 𝑓(𝑥 (00) + ℎ0 𝑒 (2) ) = 𝑚𝑖𝑛ℎ 𝑓(𝑥 (00) + ℎ𝑒 (2) ).
Положим 𝑥 (0) = 𝑥 (00) + ℎ0 𝑒 (2) .
Из точки 𝑥 (0) выполняем одномерный поиск вдоль направления 𝑒 (1) .
Вычислим значение ℎ1 , которому соответствует минимум 𝑓(𝑥 (0) +
ℎ1 𝑒 (1) ).
Положим 𝑥 (1) = 𝑥 (0) + ℎ1 𝑒 (1) .
Из точки 𝑥 (1) выполняем одномерный поиск в направления 𝑒 (2) .
Вычислим значение ℎ2 , которому соответствует минимум 𝑓(𝑥 (1) +
ℎ2 𝑒 (2) ).
Положим 𝑥 (2) = 𝑥 (1) + ℎ2 𝑒 (2) .
Направления 𝑥 (2) — 𝑥 (0) и 𝑒 (2) оказываются сопряженными.
Это видно из рисунка 2.
Рисунок 2 — Ход выполнения Метода Пауэла
7
Можно рассуждать так:
Мы выбрали две точки 𝑥 (00) и 𝑥 (1) и из этих точек выполнили
одномерный поиск в направлении 𝑒 (2) .
Соответствующие этим поискам точки минимума — 𝑥 (0) и 𝑥 (2) .
Поэтому направление 𝑥 (0) – 𝑥 (2) является сопряженным с направлением
𝑒 (2) .
Одномерный поиск в направлении 𝑒 (2) дает точку минимума 𝑥 ∗ .
Поэтому на следующей итерации проводится одномерный поиск в
направлении 𝑥 (0) – 𝑥 (2) и будет получена точка минимума 𝑥 ∗ .
В случае квадратичной функции 𝑛 переменных оптимальное значение
находится за 𝑛 итераций при этом требуется провести 𝑛2 одномерных поисков.
Алгоритм метода Пауэлла:
1. Задают начальную точку 𝑥 (00) . Выполняют одномерный поиск
минимума функции 𝑓 вдоль направления 𝑝(𝑛) = 𝑒 (𝑛) = (0, . . . , 0, 1)𝑇 .
Величина шага ℎ0 , находится из условия 𝑓(𝑥 (00) + ℎ0 𝑝(𝑛) ) = 𝑚𝑖𝑛ℎ 𝑓(𝑥 (00) +
ℎ𝑝(𝑛) ). Полученный шаг определяет точку 𝑥 (0) = 𝑥 (00) + ℎ0 𝑝(𝑛) ; 𝑘 ≔
1(номер итерации).
2. За начальные направления поиска 𝑝(1) , 𝑝(2) , …,𝑝(𝑛) принимают
направления
осей
координат,
т.е. 𝑝(𝑖) = 𝑒 (𝑖) (𝑖 = 1, . . . , 𝑛),
где
𝑒 (1) =
(1,0, . . . , 0)𝑇 ; 𝑒 (2) = (0,1, . . . , 0)𝑇 ; ...; 𝑒 (𝑛) = (0,0, . . . , 1)𝑇 .
3. Из точки 𝑥 (0) выполняют 𝑛 одномерных поисков вдоль направлений
𝑝(𝑖) (𝑖 = 1, . . . , 𝑛). При этом каждый следующий поиск производится из точки
минимума, полученной на предыдущем шаге. Величина шага ℎ𝑖 , находится из
условия𝑓(𝑥 (𝑖−1) + ℎ𝑖 𝑝(𝑖) ) = 𝑚𝑖𝑛ℎ 𝑓(𝑥 (𝑖−1) + ℎ𝑝(𝑖) ).
Полученный
шаг
определяет точку 𝑥 (𝑖) = 𝑥 (𝑖−1) + ℎ𝑖 𝑝(𝑖) .
4.
Выбираем
новое
направление
𝑝 = 𝑥 (𝑛) — 𝑥 (0)
направления 𝑝(1) , …, 𝑝(𝑛) соответственно на 𝑝(2) , …, 𝑝(𝑛) , 𝑝.
8
и
заменяем
5. Из точки 𝑥 (𝑛) осуществляют одномерный поиск вдоль направления
𝑝 = 𝑝(𝑛) = 𝑥 (𝑛) − 𝑥 (0) . Величина шага ℎ𝑛+1 , находится из 𝑓(𝑥 (𝑛) + ℎ𝑛+1 𝑝) =
𝑚𝑖𝑛ℎ 𝑓(𝑥 (𝑛) + ℎ𝑝).. Полученный шаг определяет точку 𝑥 (𝑛+1) = 𝑥 (𝑛) +
ℎ𝑛+1 𝑝; 𝑘 ≔ 𝑘 + 1(номер итерации).
6. Проверяют выполнение условия 𝑘 ≤ 𝑛. Если условие выполняется
перейти к п.7, в противном случае перейти к п.8.
7. а) если целевая функция квадратичная, то поиск прекращается; 𝑥 ∗
полагается равным 𝑥 (𝑛+1) (𝑥 ∗ ≔ 𝑥 (𝑛+1) ).
б) если целевая функция не является квадратичной, то проверяют
выполнение условия ‖ 𝑥 (𝑛) − 𝑥 (0) ‖ < 𝜀 (𝜀 - заданная точность) (те. изменение
по каждой независимой переменной должно быть меньше, чем заданная
точность). Если условие выполняется, то поиск прекратить; 𝑥 ∗ полагается
равным𝑥 (𝑛+1) ). В противном случае перейти к п.8.
8. Заменяют 𝑥 (0) на 𝑥 (𝑛+1) (𝑥 (0) ∶= 𝑥 (𝑛+1) ) и принимают эту точку за
начальную точку 𝑥 (0) для следующей итерации. Переходят к п.3.
Таким образом, в результате выполнения рассмотренной процедуры
осуществляется поочередная замена принятых вначале направлений поиска. В
итоге после 𝑛 итераций они окажутся взаимно сопряженными.
9
2. Аналитическое решение задачи
Задачей этой части работы будет минимизация функции 𝑓(𝑥) = 5𝑥12 +
5𝑥22 + 6𝑥1 𝑥1 . Дополнительно нам дана начальная точка 𝑥 0 = (2.4; 2.4) с
которой начнётся поиск минимума. В нашем случае мы имеем 2 переменные,
соответственно получаем 2 направления поиска:
𝑝1 = [1; 0]𝑇
𝑝2 = [0; 1]𝑇
Итерация №1.
Шаг 1. Сделаем шаг вдоль направления 𝑝2 = [0; 1]𝑇 .
𝑋 1 = 𝑋 0 + ℎ𝑝2 = [2.4; 2.4] + ℎ[0; 1] = [2.4; ℎ + 2.4]
𝑓(𝑋1 ) = 5 ∗ (2.4)2 + 5 ∗ (ℎ + 2.4)2 + 6 ∗ 2.4 ∗ (ℎ + 2.4)
𝑓(𝑋1 ) = 14.4 ∗ ℎ + 28.8 ∗ (0.41667 ∗ ℎ + 1.0)2 + 63.36
Найдем такой шаг h, чтобы целевая функция достигала минимума вдоль
этого направления. Из необходимого условия существования экстремума
функции (𝑓′(𝑋 1 ) = 0):
Из выражения 10 ∗ ℎ + 38.4 = 0 получаем шаг ℎ = −3.84. Его
выполнение приводит нас в точку:
𝑋 1 = [2.4; 2.4] − 3.84 ∗ [0; 1] = [2.4; −1.44]
Шаг 2. Сделаем шаг вдоль другого направления 𝑝1 = [1; 0]𝑇 .
𝑋 2 = 𝑋 1 + ℎ𝑝1 = [2.4; −1.44] + ℎ[1; 0] = [ℎ + 2.4; −1.44]
𝑓(𝑋 2 ) = 5 ∗ (ℎ + 2.4)2 + 5 ∗ (−1.44)2 + 6 ∗ −1.44 ∗ (ℎ + 2.4)
𝑓(𝑋 2 ) = 5 ∗ ℎ2 + 15.36 ∗ ℎ + 18.432
Аналогично шагу 1 находим шаг h чтобы целевая функция достигала
минимума вдоль этого направления.
Из уравнения 10 ∗ ℎ + 15.36 = 0 получаем шаг равный ℎ = −1.536.
Пройдя который, мы оказываемся в точке:
𝑋 2 = [2.4; −1.44] − 1.536 ∗ [1; 0] = [0.864; −1.44]
Шаг 3. Повторно сделаем шаг вдоль направления поиска 𝑝2 = [0; 1]𝑇 .
10
𝑋 3 = 𝑋 1 + ℎ𝑝2 = [0.864; −1.44] + ℎ[0; 1] = [0.864; ℎ − 1.44]
𝑓(𝑋 3 ) = 5 ∗ (0.864)2 + 5 ∗ (ℎ − 1.44)2 + 6 ∗ 0.864 ∗ (ℎ − 1.44)
𝑓(𝑋 3 ) = 5 ∗ ℎ2 + 9.216 ∗ ℎ + 6.6355
Для этого направления находим шаг h, при котором целевая функция
достигает минимума.
Из уравнения 10 ∗ ℎ + 9.216 = 0 получаем шаг равный ℎ = 0.9216.
При выполнении которого, мы оказываемся в точке:
𝑋 3 = [0.864; −1.44] + 0.9216 ∗ [0; 1] = [0.864; −0.5184]
Шаг 4. Здесь вы выбираем сопряжённое направление 𝑝2 и вычисляем его
следующим образом:
𝑝2 = 𝑋 3 − 𝑋 1
𝑝2 = [0.864; −0.5184]𝑇 − [2.4; −1.44]𝑇 = [−1.536; 0.922]𝑇
Итерация №2.
Во второй итерации вы имеем следующие направления поиска:
𝑝1 = [1; 0]𝑇
𝑝2 = [−1.536; 0.922]𝑇
Шаг 1. Сделаем шаг вдоль направления 𝑝2 = [−1.536; 0.922]𝑇 .
𝑋 4 = 𝑋 3 + ℎ𝑝2 = [0.864; −0.5184] + ℎ[−1.536; 0.922] = [0.864 −
1.536ℎ; 0.9216ℎ − 0.5184]
𝑓(𝑋 4 ) = 5 ∗ (0.864 − 1.536 ∗ ℎ)2 + 5 ∗ (0.9216 ∗ ℎ − 0.5184)2 + 6 ∗ (0.864
− 1.536 ∗ ℎ) ∗ (0.9216 ∗ ℎ − 0.5184)
𝑓(𝑋 4 ) = 11.796 ∗ (0.5625 − ℎ)2 + 6.0 ∗ (0.864 − 1.536 ∗ ℎ) ∗ (0.9216 ∗ ℎ
− 0.5184) + 4.2467 ∗ (ℎ − 0.5625)2
Находим из уравнения 15.099 ∗ ℎ − 8.4935 = 0 шаг h. Получаем ℎ =
0.5625 .
Выполнение этого шага приводит нас в точку:
𝑋 4 = [0.864; −0.5184] + 0.5625 ∗ [−1.536; 0.922] = [0; 0]
Шаг 2. Делаем шаг вдоль другого направления поиска, а именно 𝑝1 = [1; 0]𝑇 .
11
𝑋 5 = 𝑋 4 + ℎ𝑝1 = [0; 0] + ℎ[1; 0] = [ℎ − 3.6812 ∗ 10−7 ; −2.2974 ∗ 10−7 ]
𝑓(𝑋 5 ) = 5 ∗ (ℎ − 3.6812 ∗ 10−7 )2 + 5 ∗ (−2.2974 ∗ 10−7 )2 + 6 ∗ (ℎ
− 3.6812 ∗ 10−7 ) ∗ (−2.2974 ∗ 10−7 )
𝑓(𝑋 5 ) = 5 ∗ ℎ2 − 5.0596 ∗ 10−6 ∗ ℎ + 1.4489 ∗ 10−12
Для этого направления находим шаг h, при котором целевая функция
достигает минимума.
С получившимся уравнением 10 ∗ ℎ − 5.0596 ∗ 10−6 = 0, значение шага
будет равно ℎ = 10−6 . При его выполнении мы оказывается в точке:
𝑋 5 = [0; 0] + 10−6 ∗ [1; 0] = [0; 0]
Шаг 3. Повторно сделаем шаг вдоль направления поиска 𝑝2 =
[−1.536; 0.922]𝑇 .
𝑋 6 = 𝑋 5 + ℎ𝑝2 = [1.3784 ∗ 10−7 ; −2.2974 ∗ 10−7 ] + ℎ[−1.536; 0.922]
= [1.3784 ∗ 10−7 − 1.536 ∗ ℎ; 0.922 ∗ ℎ − 2.2974 ∗ 10−7 ]
𝑓(𝑋 6 ) = 5 ∗ (1.3784 ∗ 10−7 − 1.536 ∗ ℎ)2 + 5 ∗ (0.922 ∗ ℎ − 2.2974 ∗ 10−7 )2
+ 6 ∗ (1.3784 ∗ 10−7 − 1.536 ∗ ℎ) ∗ (0.922 ∗ ℎ − 2.2974 ∗ 10−7 )
Найдем такой шаг h, чтобы целевая функция достигала минимума
вдоль этого направления. Для уравнения 15.099 ∗ ℎ − 1.3551 ∗ 10 −6 = 0,
значение шага ℎ = 0. Его выполнение приводит нас в точку:
𝑋 6 = [1.3784 ∗ 10−7 ; −2.2974 ∗ 10−7 ] + 0 ∗ [−1.536; 0.922] = [0; 0]
Поскольку данная нам функция имеет квадратичный вид, поиск
минимума по методу Пауэлла занимает n итераций, где n – количество
переменных данной функции. Соответственно по завершению 2 итерации мы
получаем точку минимума заданной функции двух переменных. Ею оказалась
точка [0;0], а значение функции в ней равно 𝑓(0; 0) = 5 ∗ 0 + 5 ∗ 0 + 6 ∗ 0 ∗
0 = 0.
12
3. Алгоритм и программная реализация задачи
Алгоритм метода Пауэлла для многомерной безусловной оптимизации
в виде блок схемы представлен на рисунке 3.
Рисунок 3 — Блок схема Метода Пауэлла
13
Опираясь на эту блок-схему, разработали программную реализацию
нашего метода минимизации. В качестве языка программирования выбран
язык C++, средой разработки Microsoft Visual Studio 2022. Листинг написанной
программы представлен в Приложении 1.
В качестве примера возьмём уравнение из варианта курсовой работы,
который мы решили аналитическим способом ранее во второй главе. После
запуска программы, появляется окно консоли, в которую пользователю
предлагают ввести начальную точку 𝑋 0 , а также коэффициенты k1, k2, k3
уравнения, которое необходимо минимизировать. В ходе работы программы
выдаст промежуточные значения точек минимума, а также финальный
результат в виде минимума функции и точки, в которой он расположен. Окно
консоли программы расхоложённо на рисунке 4.
Рисунок 4 – Окно консоли программы
14
ЗАКЛЮЧЕНИЕ
В ходе работы исследовал метод параллельных касательных для
многомерной безградиентной безусловной оптимизации. В ходе выполнения
первой главы работы рассмотрел алгоритм решения задачи оптимизации при
помощи данного метода, а также полностью описал его. Далее решил задачу
на минимизацию, представленную мне в виде уравнения аналитическим
способом, используя метод параллельных касательных. Документируя
каждый шаг в ходе выполнения алгоритма решения, пришёл к правильному
ответу на поставленную задачу. В последнюю очередь построил блок-схему
алгоритма, опираясь на которую, написал программную реализацию метода
Пауэлла на языке программирования C++.
В ходе выполнения работы выяснил, что метод параллельных
касательных является эффективным методом для поиска минимума функций с
многими переменными, особенно в случае, когда функция не имеет градиента
или его вычисление трудозатратно. Однако, метод может столкнуться с
проблемой пропуска локальных минимумов и может потребовать большое
количество итераций для достижения сходимости. Метод ориентирован на
решение задач с квадратичными целевыми функциями, однако может быть
применен и для нелинейной целевой функции общего вида. В случае
квадратичной функции 𝑛 переменных оптимальное значение находится за 𝑛
итераций при этом требуется провести 𝑛2 одномерных поисков.
15
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Гребенникова И. В. Методы оптимизации: учебное пособие / И. В.
Гребенникова. – Екатеринбург: Издательство Уральского университета,
2017. – 152 с. – Текст: непосредственный.
2. Смирнов И. А. Методы оптимизации. Базовый курс: учебное пособие /
И. А. Смирнов. – Санкт-Петербург: СПбГТИ(ТУ), 2010. – 102 с. –
Текст: электронный.
3. Бояринов А. И. Методы оптимизации в химической технологии:
учебное пособие / А. И. Бояринов, В. В. Кафаров. – Москва: Химия,
1969. – 565 с. – Текст: электронный.
4. Кочегурова Е.А. Теория и методы оптимизации: учебное пособие / Е.А.
Кочегурова. – Люберцы: Юрайт, 2016. - 133 c. – Текст:
непосредственный.
5. Ширяев В.И. Исследование операций и численные методы
оптимизации: учебное пособие / В.И. Ширяев. – Москва: Ленанд, 2015.
- 216 c. – Текст: непосредственный.
16
ПРИЛОЖЕНИЯ
Приложение 1
#include <iostream.h>
#include <math.h>
#include <conio.h>
double f(double x1,double x2) {
return 4*(x1-5)*(x1-5)+(x2-6)*(x2-6);}
int main(){
setlocale(LC_ALL, "Russian");
double XO, k1, k2, k3;
std::cout << "Введите начальную точку X0: \n" << "X0 = ";
cin >> XO;
std::cout << "Введите коэффиценты k1,k2,k3. \n k1 = ";
cin >> k1;
cout << "k2 = ";
cin >> k2;
cout << "k3 = ";
cin >> k3;
double E=0.1, min, var[200], t;
int i, j, n=2, k=0;
int s=0, I[100];
double d[3][3]={{0,1}, {1,0}, {0,1}}; cout <<d[0][0]<<" "<<d[0][1]<<" "<<
d[1][0]<<" "<<d[1][1]<<" "<<
d[2][0]<<" "<<d[2][1]<<endl;
double X[20][20], Y[20][40], Xz[1][2];
I[s]=0;
cout <<"X0:"<<endl;
for(i=0;i<1;i++)
for(int j=0;j<2;j++)
cin >>X[i][j];
cout <<"X("<<X[0][0]<<";"<<X[0][1]<<")\n";
for(i=0;i<1;i++)
Y[i][j]=X[i][j];
cout <<"Y("<<Y[0][0]<<";"<<Y[0][1]<<")\n";
TWO: cout <<" __2__"<<endl;
min=f(Y[I[s]][0],Y[I[s]][1]);
i=0;
for(t=-50;t<50;t++,i++)
{
var[i]=f( Y[I[s]][0]+t*d[I[s]][0], Y[I[s]][1]+t*d[I[s]][1]);
cout <<"var ["<<i<<"] = "<<var[i]<<endl;
}
for(i=0;i<100;i++)
if(var[i] < min)
min = var[i];
cout <<"min var[] = "<<min<<endl;
for(int index=0;index<100;index++)
17
{
if( min==var[index] )
t=index-50;
}
cout <<"T = "<<t<<endl;
Y[I[s]+1][0] = Y[I[s]][0] + t*d[I[s]][0];
Y[I[s]+1][1] = Y[I[s]][1] + t*d[I[s]][1];
cout <<"Y["<<I[s]+1<<"] = ("<<Y[I[s]+1][0]<<";";
cout <<Y[I[s]+1][1]<<")"<<endl;
cout <<" __3__"<<endl;
if(I[s] < n-1)
{
cout <<"I[s] < n-1"<<endl;
I[s]=I[s]+1;
cout <<"I[s] = "<<I[s]<<endl;
goto TWO;
} //*/
if(I[s] == n-1)
{
cout <<"I[s] == n-1"<<endl;
if( (Y[n][0]==Y[0][0]) && (Y[n][1]==Y[0][1]) ){
Xz[0][0]=Y[n][0];
cout <<"Xz("<<Xz[0][0]<<";";
Xz[0][1]=Y[n][1];
cout <<Xz[0][1]<<")"<<endl;
}
else {
cout <<"Yn != Y0 "<<endl;
I[s]=I[s]+1;
cout <<"I[s] = "<<I[s]<<endl;
goto TWO; }
}
if(I[s] == n)
{
cout <<"I[s] == n"<<endl;
if( (Y[n+1][0]==Y[1][0]) && (Y[n+1][1]==Y[1][1]) ){
Xz[0][0]=Y[n+1][0];
cout <<"Xz("<<Xz[0][0]<<";";
Xz[0][1]=Y[n+1][1];
cout <<Xz[0][1]<<")"<<endl;
}
if( (Y[n+1][0]!=Y[1][0]) || (Y[n+1][1]!=Y[1][1]) ){
goto Fourth;
}
}
Fourth: cout <<" __4__"<<endl;
X[k+1][0]=Y[n+1][0]; cout <<"X["<<(k+1)<<"] = ("<<X[k+1][0];
X[k+1][1]=Y[n+1][1]; cout <<";"<<X[k+1][1]<<")"<<endl;
if( pow( ( pow((X[k+1][0]-X[k][0]),2)+pow((X[k+1][1]-X[k][1]),2) ),1/2.0)<E ){
cout <<"X(k+1) - X(k) = "<<pow( ( pow((X[k+1][0]-X[k+1][0]),2)+
pow((X[k+1][1]-X[k+1][1]),2) ),1/2.0);
Xz[0][0]=X[k+1][0];
Xz[0][1]=X[k+1][1];
}
18
if( pow( ( pow((X[k+1][0]-X[k][0]),2)+pow((X[k+1][1]-X[k][1]),2) ),1/2.0)>E ){
d[0][0]=d[n][0]=Y[n+1][0]-Y[1][0]; cout <<"d0 = ("<<d[0][0];
d[0][1]=d[n][1]=Y[n+1][1]-Y[1][1]; cout <<";"<<d[0][1]<<")"<<endl;
d[I[s]][0]=d[I[s]+1][0];
d[I[s]][1]=d[I[s]+1][1];
if( (d[1][0]*d[2][1]-d[1][1]*d[2][0]) != 0){
cout <<"rang(D1,...,Dn) = n"<<endl;
Y[0][0]=X[k+1][0]; cout <<"Y0 = ("<<Y[0][0]<<";";
Y[0][1]=X[k+1][1]; cout <<Y[0][1]<<")\n";
k=k+1;
I[s]=0;
goto TWO;
}
if( (d[1][0]*d[2][1]-d[1][1]*d[2][0]) == n){
cout <<"rang(D1,...,Dn) < n"<<endl;
Y[0][0]=X[k+1][0];
Y[0][1]=X[k+1][1];
k=k+1; I[s]=0;
goto TWO;
}
}
19
Download