Вы находитесь на странице: 1из 24

Министерство науки и высшего образования Российской

Федерации
Федеральное государственное бюджетное образовательное
учреждение
высшего образования
«Московский государственный технический университет
имени Н.Э. Баумана
(национальный исследовательский университет)»
(МГТУ им. Н.Э. Баумана)

Факультет: «Специальное машиностроение»

Кафедра: «Робототехнические системы и мехатроника»

Домашнее задание №2

по курсу «Численные методы»

Вариант 19

Выполнил: Серебренников Александр


Группа: СМ7-33Б
Проверил(а): Чередниченко А.В.

Москва, 2023 г.
Оглавление
Условие ...................................................................................................................................................3
Аналитическое решение .......................................................................................................................4
Функция и её график ..............................................................................................................................5
Вспомогательные функции ...................................................................................................................6
Метод наискорейшего спуска ...............................................................................................................8
Градиентный метод с дроблением шага ...........................................................................................11
Метод Сопряженных градиентов .......................................................................................................14
Метод Ньютона ......................................................................................................................................5
Квазиньютоновский метод Давидона-Флетчера-Пауэлла .................................................................6
Метод циклического покоординатного спуска .................................................................................23
Условие
Дана квадратичная функция двух переменных. Найти точку минимума этой функции и
её минимальное значение.
1. Решить данную задачу аналитически – получить точное решение. Доказать, что
найденная точка действительно является точкой минимума (см «ЛА и ФНП»).
2. Решить численно задачу безусловной минимизации квадратичной функции с
заданными начальной точкой и двумя вариантами параметров точности поиска.
Данную задачу решить следующими методами (которые мы успеем пройти):
2.1.методом наискорейшего спуска;
2.2.градиентным методом с дроблением шага;
2.3.методом сопряженных градиентов;
2.4.методом Ньютона;
2.5.квазиньютоновским методом Давидона-Флетчера-Пауэлла (ДФП);
2.6.методом прямого поиска: циклическим покоординатным спуском.
Для каждого метода построить траекторию последовательности точек (нанести точки
релаксационной последовательности на плоскость с указанными линиями уровня),
указать количество проведенных итераций для каждого метода и эквивалентное
количество вычисленных значений целевой функции (считать, что вычисление одного
антиградиента эквивалентно вычислениям значений целевой функции, а вычисление
матрицы Гессе – вычислений значений целевой функции, где – размерность линейного
пространства). Сравнить решения, полученные различными методами. Сравнить эти
решения с точным решением задачи. Работа должна заканчиваться выводами. Все
требования к оформлению, сформулированные в условии домашнего задания №1,
действуют и для этого домашнего задания.
Аналитическое решение
𝑓(𝑥, 𝑦) = 5 ⋅ 𝑥 2 + 4 ⋅ 𝑥 ⋅ 𝑦 + 2 ⋅ 𝑦 2 + 4 ⋅ √5 ⋅ (𝑥 + 𝑦) + 51

Представим исходную функцию в матричном виде:


𝑓(𝑥, 𝑦) = (𝐴𝑥, 𝑥) + (𝐵, 𝑥) + 𝐶 , где

, ,
Матрица А по критерию Сильвестра положительно определенная:
Угловые миноры: 𝛿1 = 5 > 0, 𝛿2 = 6 > 0

Следовательно функция сильно выпуклая и имеет стационарную точку,


которая является точкой минимума, причем единственную.

𝑋 ∗ = − 𝐻−1 𝐵, где матрица Гесса


Функция и её график
Дано:
𝑓(𝑥, 𝑦) = 5 ⋅ 𝑥 2 + 4 ⋅ 𝑥 ⋅ 𝑦 + 2 ⋅ 𝑦 2 + 4√5 ⋅ (𝑥 + 𝑦) + 51

Начальная точка (-18.0, -9.0)


Код функции на Julia:

function func(x)

F = 5*x[1]^2 + 4*x[1]*x[2] + 2*x[2]^2 + 4*sqrt(5)*(x[1] + x[2]) + 51

return F

end

Рис.1 График целевой функции


Вспомогательные функции
Функция одномерной минимизации:
function minimize(F::Function, left, right, epsilon)::Float64

lenght = right - left

t = (sqrt(5) + 1)/2

x1 = (right*(t - 1) + left)/t

x2 = (left*(t - 1) + right)/t

F1 = F(x1)

F2 = F(x2)

n_value = 2

while lenght > epsilon

if F1 < F2
right = x2

x2 = x1

x1 = (right*(t -1) + left)/t

F2 = F1

F1 = F(x1)

else

left = x1

x1 = x2

x2 = (left*(t - 1) + right)/t

F1 = F2

F2 = F(x2)

end

lenght = abs(right - left)

n_value+=1

end

return (left+right)/2, n_value

end
Функция градиента:
function grad(x)

return [10*x[1] + 4*x[2] + 4*sqrt(5); 4*x[2] + 4*x[1] + 4*sqrt(5)]

end
Метод наискорейшего спуска
Код функции метода FastestDescent:
function FastestDescent(X0, Y0, epsillon)

x_1 = [X0, Y0] # начальная точка

Grad = grad(x_1) # градиент функции в начальной точке

NGrad = Grad/norm(Grad) # нормированный градиент

Nw = -NGrad # нормированный антиградиент

n_value = 0 # счетчик итераций

n_iter = 2 # счетчик вычисленных значений функции

while norm(Grad) > epsillon

step, n = minimize(m -> func(x_1 + m*Nw), -200, 200, epsillon) # вычисление


шага спуска

# путем минимизации f(x + m*Nw)

n_value += n

x_k = x_1 + step*Nw

plot([x_k[1] - x_1[1]], [x_k[2] - x_1[2]]) # построение графика

Grad = grad(x_k)

NGrad = Grad/norm(Grad)

Nw = -NGrad

x_1 = x_k

n_iter += 1

n_value += 2

end

print(n_iter,"\t", n_value)

return x_1

end
Табл.1 Полученные результаты минимизации функции методом наискорейшего спуска

Параметр Количество Количество Значение Значение


точности итераций вычисленных точки целевой
значений минимума функции в
функции точке
минимума
0.01 3 95 0.0, 41.0
-2.23
0.00001 5 227 0.00078, - 41.0
2.23606

Рис.2 Релаксационная последовательности метода наискорейшего спуска при 𝜀 = 0.01

Рис.3 Релаксационная последовательность метода наискорейшего спуска при 𝜀 = 0.00001


Вывод:
Метод наискорейшего спуска выбирает шаг, минимизируя целевую функцию в
направлении антиградиента. Минимизация функции на каждой итерации является
трудоемкой задачей по сравнению со спуском с фиксированным шагом, поэтому метод
наискорейшего спуска нельзя назвать эффективным. На первых шагах метод делает
большие шаги, однако на последних итерациях спуск замедляется. Алгоритм
чувствителен к овражности функции, однако сходится независимо от выбора
начальной точки.
Градиентный метод с дроблением шага
Код функции градиентного StepSplitting:
function StepSplitting(X0, Y0, epsillon)

x_1 = [X0, Y0] # начальная точка

Grad = grad(x_1) # градиент функции в начальной точке

w = -Grad # антиградиент

n_iter = 0 # счетчик итераций

n_value = 2 # счетчик вычисленных значений функции

step0, n = minimize(m -> func(x_1 + m*w), -200, 200, epsillon) # начальный шаг находим с
помощью минимизации f(x + m*w)

n_value += n

step = step0
k = 0.5 # шаг дробления

f = func(x_1)

while norm(Grad) > epsillon # критерий останова

x_k = x_1 + step*w

plot([x_k[1] - x_1[1]], [x_k[2] - x_1[2]]) # построение графика

Grad = grad(x_k)

w = -Grad

f_k = func(x_k)

n_value+=3

step = (f - f_k) < 0.5*step*(norm(w))^2 ? step*k : step0 # если (f - fk)< 0.5*step*norm(w)^2,

# то умножаем шаг на коэффициент дробления

x_1 = x_k

f = f_k

n_iter+=1

end

print(n_iter, n_value)

return x_1

end

Табл.2 Полученные результаты минимизации функции градиентным метода с дроблением


шага
Параметр Количество Количество Значение Значение
точности итераций вычисленных точки целевой
значений минимума функции в
функции точке
минимума
0.01 33 128 0.0, 41.0
-2.23
0.00001 71 254 0.0, 41.0
-2.23606

Рис.4 Релаксационная последовательность градиентного метода с дроблением шага при 𝜀 =


0.01

Рис.5 Релаксационная последовательность градиентного метода с дроблением шага при 𝜀 =


0.00001
Вывод:
Данный метод является эффективнее метода наискорейшего спуска за счет того, что
нам не нужно проводить дорогую одномерную оптимизацию на каждом шаге. Вместо
этого мы определяем начальный размер спуска и проверяя условие дробления шага,
что требует вычисления значения функции на каждой итерации. Сходимость метода на
последних циклах выше, чем в методе наискорейшего спуска.
Метод Сопряженных градиентов
Код функции метода ConjugateGradients:
function ConjugateGradients(X0, Y0, epsillon)

x_1 = [X0, Y0] # начальная точка

Grad = grad(x_1) # градиент функции в начальной точке

w = -Grad # антиградиент

step = w # шаг спуска

n_iter = 0 # счетчик итераций

Q = [10 4; 4 4] # квадратичная форма

n_value = 2 # счетчик вычисленных значений функции

while norm(Grad) > epsillon # критерий останова

k = (transpose(w)*w)/(transpose(step)*(Q'step))

x_k = x_1 + k*step

plot([x_k[1] - x_1[1]], [x_k[2] - x_1[2]]) # построение графика

Grad = grad(x_k)

w_k = -Grad

n_value += 2

l=((norm(w_k))^2)/(norm(w))^2 # метод Флетчера-Ривса

step = w_k + l*step

w = w_k

x_1 = x_k

n_iter+=1

end
print(n_iter,"\t", n_value)

return x_1

end
Табл.3 Полученные результаты минимизации функции методом сопряженных градиентов

Параметр Значение Значение Количество Количество


точности точки целевой функции итераций вычисленных
минимума в точке значений
минимума функции

0.01 0.0, 41.0 2 6


-2.23

0.00001 0.0, 41.0 2 6


-2.23606

Рис.6 Релаксационная последовательность метода сопряженных градиентов при 𝜀 = 0.01

Рис.7 Релаксационная последовательность метода сопряженных градиентов при 𝜀 = 0.00001


Вывод:
Сходимость оказалась гораздо выше метода наискорейшего спуска и градиентного
метода дробления шага. Основная идея метода сопряженных градиентов заключается в
том, чтобы использовать информацию о предыдущих направлениях спуска для
определения нового направления. Таким образом, на каждой итерации мы движемся не
только в направлении наискорейшего спуска, но и учитываем предыдущие шаги, что
позволяет эффективно приближаться к оптимальному решению.
Метод Ньютона
Код функции Newton:
function Newton(X0, Y0, epsillon)

x_1 = [X0; Y0] # начальная точка

Grad = grad(x_1) # градиент функции в начальной точке

w = -Grad # антиградиент

H = ges(x_1) # Гессиан в начальной точке

n_iter = 0 # счетчик итераций

n_value = 2 # счетчик вычисленных значений функции

while norm(Grad) > epsillon

step = inv(H) * w # шаг спуска

x_k = x_1 + step

plot([x_k[1] - x_1[1]], [x_k[2] - x_1[2]]) # построение графика

Grad = grad(x_k)

w = -Grad

H = ges(x_k)

x_1 = x_k

n_value += 2 + 2^3/2

n_iter += 1

end

return x_1

end
Табл.4 Полученные результаты минимизации функции методом Ньютона

Параметр Значение Значение Количество Количество


точности точки целевой итераций вычисленных
минимума функции в значений
точке функции
минимума
0.01 0.0, 41.0 1 12
-2.23
0.00001 0.0, 41.0 1 12
-2.23606

Рис.8 Релаксационная последовательность метода Ньютона при 𝜀 = 0.01

Рис.9 Траектория релаксационной последовательности метода Ньютона при 𝜀 = 0.00001

Вывод:
Метод Ньютона позволил найти минимум заданной функции с такой же высокой
точностью, как и метод сопряженных градиентов. Помимо этого, поиск занял всего
одну итерацию при обеих значения точности. Количество вычисленных значений
эквивалентно методу сопряженных градиентов. Однако стоит отметить, что метод
Ньютона имеет свои недостатки. В частности, для его работы необходимо вычислять и
обращать матрицу Гессе на каждой итерации, что может быть дорогостоящей
операцией. Тем не менее, благодаря своей скорости, метод Ньютона оказывается
одним из самых быстрых для поиска минимума целевой функции. Важно отметить, что
метод Ньютона не является универсальным и может иметь проблемы со сходимостью
в некоторых случаях. В частности, его сходимость зависит от выбора начальной
точки.
Квазиньютоновский метод Давидона-Флетчера-Пауэлла
Код функции DFP:
function DFP(X0, Y0, epsillon)

x_1 = [X0, Y0]

Grad = grad(x_1) # градиент функции в начальной точке

w = -Grad # антиградиент

step = w # шаг спуска

I = [1 0; 0 1] # единичная матрица

n_iter = 0 # счетчик итераций

n_value = 2 # счетчик вычисленных значений функции

while norm(w) > epsillon # критерий останова


k = (transpose(w)*step)/(transpose(step)*(Q'step))

x_k = x_1 + step * k

plot([x_k[1] - x_1[1]], [x_k[2] - x_1[2]]) # построение графика

w_k = -grad(x_k) # антиградиент в k точке

n_value += 2

dx = x_k - x_1 # изменение x

dw = w_k - w # изменение антиградиента

dI = (dx * transpose(dx))/dw'dx + (I * dw * transpose(I * dw))/(I'dw)'dw # поправочная


матрица

I_k = I - dI

step = I_k * w_k

w = w_k

x_1 = x_k

I = I_k

n_iter += 1

end

print(n_iter,"\t", n_value)

return x_1

end
Табл.5 Полученные результаты минимизации функции методом сопряженных градиентов

Параметр Значение Значение Количество Количество


точности точки целевой итераций вычисленных
минимума функции в значений
точке функции
минимума
0.01 0.0, 41.0 2 6
-2.23
0.00001 0.0, 41.0 2 6
-2.23606

Рис.10 Релаксационная последовательность метода ДФП при 𝜀 = 0.01

Рис.11 Релаксационная последовательность метода ДФП при 𝜀 = 0.00001


Вывод:
Хотя количество итераций немного больше, чем в методе Ньютона, каждая итерация в
данном методе гораздо проще. Вместо расчета матрицы Гессе и решения системы
линейных уравнений, мы решаем более простую задачу одномерной минимизации. В
результате получаем метод, который отлично работает с овражными функциями, имеет
малую зависимость от выбора начальной точки и требует меньшего количества
итераций. Этот метод оказался более эффективным, чем метод Ньютона.
Метод циклического покоординатного спуска
Код функции CyclicDescent:
function CyclicDescent(X0, Y0, epsillon)

x_1 = [X0, Y0] # начальная точка

x_k = x_1

Grad = grad(x_1) # градиент функции в начальной точке

w = -Grad # антиградиент

n_iter = 0 # счетчик итераций

n_value = 2 # счетчик вычисленных значений функции

while norm(Grad) > epsillon

x_k[1], n_x = minimizeX(x_1[1], x_1[2], epsillon) # минимизация по х

x_k[2], n_y = minimizeY(x_1[1], x_1[2], epsillon) # минимизация по у

Grad = grad(x_k)

x_1 = x_k

n_value += n_x + n_y

n_iter += 1

end

return x_1

end

Табл.6 Полученные результаты минимизации функции методом прямого поиска

Параметр Количество Количество Значение Значение


точности итераций вычисленных точки целевой
значений минимума функции в
функции точке
минимума
0.01 7 74 -0.01, 41.0
-2.23
0.00001 12 112 -0.00001, 41.0
-2.23606
Рис.12 Релаксационная последовательность метода прямого поиска при 𝜀 = 0.01

Рис.13 Релаксационная последовательность метода прямого поиска при 𝜀 = 0.00001

Вывод:
Метод циклического покоординатного спуска не приводит к значительному
улучшению стоимости и точности вычислений, его скорость сходимости оставляет
также не высока. Однако, данный метод является эффективным в случае, когда
минимизируемая функция представляет собой сумму функций, каждая из которых
зависит только от одной координаты. Главным преимуществом метода является
простота его реализации.

Вам также может понравиться