- •1. Множество. Функция. Скалярные и векторные функции.
- •2. Поле, пространство. Виды пространств.
- •3. Критические точки. Стационарные точки. Лемма Ферма. Связь оптимизации и поиска корня.
- •Вопрос 6. Чем выпуклая функция упрощает задачу оптимизации?
- •Вопрос 7. Если функция имеет одинаковые минимальные значения в двух точках, можно ли говорить о двух глобальных минимумах?
- •Вопрос 8. Как критерии максимума связаны с критериями минимума?
- •4. Градиент. Матрица Гессе. Ряд Тейлора.
- •5. Квадратичная форма. Квадратичная функция. Связь знакоопределенности и собственных чисел матрицы.
- •6. Квадратичная форма. Квадратичная функция. Критерии минимума (максимума) квадратичной формы.
- •7. Условия Вульфа. Их геометрическая интерпретация. Правило Армихо.
- •8. Метод дихотомии. Запрограммировать, показать работу на функциях.
- •9. Метод трехточечного деления. Запрограммировать, показать работу на функциях.
- •10. Метод золотого сечения. Запрограммировать, показать работу на функциях.
- •11. Метод Фибоначчи. Запрограммировать, показать работу на функциях.
- •12. Метод Ньютона одномерный. Запрограммировать, показать работу на функциях.
- •13. Метод секущих. Запрограммировать, показать работу на функциях.
- •14. Метод Мюллера. Запрограммировать, показать работу на функциях.
- •15. Метод обратной параболической интерполяции. Запрограммировать, показать работу на функциях.
- •16. Запрограммировать метод градиентного спуска. Показать его работу на функциях.
- •17. Запрограммировать метод наискорейшего спуска. Показать его работу на функциях.
- •19. Запрограммировать метод Ньютона многомерный. Показать его работу на функциях.
- •20. Запрограммировать метод Левенберга-Марквардта. Показать его работу на функциях.
- •21. Запрограммировать метод Нестерова-Немировского. Показать его работу на функциях.
- •22. Запрограммировать метод Барзилая-Борвейна 1. Показать его работу на функциях.
- •23. Запрограммировать метод Барзилая-Борвейна 2. Показать его работу на функциях.
- •28. Запрограммировать метод Армихо. Показать его работу на функциях.
- •29. Запрограммировать метод dfp. Показать его работу на функциях.
- •30. Запрограммировать метод bfgs. Показать его работу на функциях.
- •31. Запрограммировать метод l- bfgs. Показать его работу на функциях.
- •32. Запрограммировать метод доверительных областей. Показать его работу на функциях.
19. Запрограммировать метод Ньютона многомерный. Показать его работу на функциях.
def H(x0, tol, df):
n = len(x0)
H0 = np.zeros((n, n))
delta = 0.1 * tol
for j in range(n):
e_j = np.zeros_like(x0)
e_j[j] = 1
grad_plus = df(x0 + delta * e_j)
grad_minus = df(x0 - delta * e_j)
H0[:, j] = (grad_plus.flatten() - grad_minus.flatten()) / (2 * delta)
return H0
def nsearch(f, df, x0, tol):
kmax = 1000
x_k = x0.copy()
coords = [x_k.copy()]
neval = 0
k = 0
deltaX = np.ones_like(x_k) * np.inf
while (norm(deltaX) >= tol) and (k < kmax):
g0 = df(x_k)
neval += 1
H0 = H(x_k, tol, df)
neval += 2 * len(x0)
dx = np.linalg.solve(-H0, g0)
x_new = x_k + dx
deltaX = x_new - x_k
x_k = x_new
coords.append(x_k.copy())
k += 1
xmin = x_k
fmin = f(xmin)
answer_ = [xmin, fmin, neval, coords]
return answer_
Вопросы для самопроверки
1. Почему демпфированный метод Ньютона делает больше шагов для достижения минимума?
Демпфированный метод Ньютона использует итерацию:
xₖ₊₁ = xₖ - αₖH⁻¹(xₖ)∇f(xₖ)
где αₖ ∈ (0,1] - демпфирующий параметр.
Причины большего числа шагов:
Математическое объяснение:
Обычный метод Ньютона: αₖ = 1 (полный шаг)
Демпфированный метод: αₖ < 1 (уменьшенный шаг)
Чем меньше αₖ, тем:
Меньше длина шага
Больше итераций до минимума
Но выше надежность сходимости
Численный пример для f(x) = x²:
Обычный Ньютон: xₖ₊₁ = xₖ - (2xₖ)/(2) = 0 (сходится за 1 шаг)
Демпфированный: xₖ₊₁ = xₖ - 0.5×(2xₖ)/(2) = 0.5xₖ (нужно ~7 шагов для tol=1e-3)
2. Почему метод Ньютона не страдает от овражности функции Розенброка?
Метод Ньютона учитывает не только направление градиента, но и кривизну поверхности через гессиан (вторые производные). Это позволяет корректировать шаг в зависимости от формы долины — в овражных задачах он делает шаги, согласованные с геометрией функции. В результате траектория не «зигзагирует», как в методе наискорейшего спуска, а идёт более прямым путём к минимуму, быстро выравниваясь вдоль оси оврага.
Математическая суть:
Метод Ньютона использует итерацию:
xₖ₊₁ = xₖ - H⁻¹(xₖ)∇f(xₖ)
где H(xₖ) - гессиан (матрица вторых производных).
Для функции Розенброка:
f(x,y) = (1-x)² + 100(y-x²)²
Гессиан H = [[∂²f/∂x², ∂²f/∂x∂y],
[∂²f/∂y∂x, ∂²f/∂y²]]
∂²f/∂x² = 2 + 1200x² - 400y
∂²f/∂x∂y = -400x
∂²f/∂y² = 200
Ключевое преимущество:
Гессиан содержит информацию о кривизне:
Большие собственные значения ≈ крутые направления
Малые собственные значения ≈ пологие направления
Обратный гессиан H⁻¹:
Уменьшает шаг в крутых направлениях
Увеличивает шаг в пологих направлениях
Автоматически вытягивает овраг
Сравнение с градиентным спуском:
Градиентный спуск:
xₖ₊₁ = xₖ - α∇f(xₖ)
Движется перпендикулярно линиям уровня
В овраге: градиенты почти ортогональны направлению к минимуму
Результат: зигзагообразная траектория
Метод Ньютона:
xₖ₊₁ = xₖ - H⁻¹∇f(xₖ)
H⁻¹∇f указывает почти прямо на минимум вдоль оврага
Учитывает "форму" функции
Результат: почти прямая траектория к минимуму
ВОПРОСЫ С ПАР
1. В чем разница с одномерным методом?
Ответ: Ключевая разница — в объекте, с которым мы работаем, и в используемой информации о кривизне функции.
Аспект |
Одномерный метод Ньютона (f(x)) |
Многомерный метод Ньютона (f(\vec{x})) |
Объект |
Число x |
Вектор \vec{x} |
Производная 1-го порядка |
Первая производная f'(x) (скаляр) |
Градиент ∇f(\vec{x}) (вектор) |
Производная 2-го порядка |
Вторая производная f''(x) (скаляр) |
Матрица Гессе H(\vec{x}) (матрица вторых частных производных) |
Формула обновления |
x_{k+1} = x_k - f'(x_k) / f''(x_k) |
\vec{x}_{k+1} = \vec{x}_k - H^{-1}(\vec{x}_k) * ∇f(\vec{x}_k) |
Суть: В одномерном случае мы делим на число (вторую производную). В многомерном — мы "делим" на матрицу (матрицу Гессе), что математически эквивалентно умножению на обратную матрицу Гессе.
2. Демпфирование, можно ли в одномерном?
Ответ: Да, конечно можно. Идея демпфирования (или регуляризации) универсальна.
Одномерный демпфированный Ньютон: x_{k+1} = x_k - f'(x_k) / (f''(x_k) + μ)
Зачем это нужно? Если вторая производная f''(x_k) близка к нулю (например, в точке перегиба или на пологом участке), то шаг Ньютона станет огромным и мы можем "улететь". Добавление положительного демпфирующего коэффициента μ предотвращает это:
Когда f''(x_k) мала, μ начинает доминировать в знаменателе, делая шаг маленьким и безопасным (как в градиентном спуске).
Когда f''(x_k) велика, μ почти не влияет, и метод работает как чистый Ньютон.
3. Ограниченная сходимость преодолевается?
Ответ: Да, именно для этого и вводят демпфирование!
Ограничения (недостатки) чистого метода Ньютона, которые преодолевает демпфирование:
Невырожденность Гессе: Чистый Ньютон требует, чтобы матрица Гессе была обратимой (ее определитель не равен нулю). Если она вырождена или плохо обусловлена, обратная матрица не существует или вычисляется с огромной ошибкой.
Как преодолевает демпфирование: Мы работаем не с H, а с (H + μI). Добавление μI (где I — единичная матрица) делает матрицу положительно определенной и хорошо обусловленной, что гарантирует существование обратной матрицы и устойчивость решения.
Сходимость только в окрестности решения: Чистый Ньютон может расходиться, если начальная точка далека от минимума.
Как преодолевает демпфирование: На больших μ метод ведет себя как градиентный спуск с шагом 1/μ, который сходится глобально (хоть и медленно) для широкого класса функций. По мере приближения к решению μ уменьшается, и метод плавно переходит к быстрой ньютоновской сходимости.
4. Что ищет? По каким критериям ищет минимум или максимум?
Ответ: Многомерный метод Ньютона, как и его одномерный аналог, ищет стационарные точки, то есть точки, где градиент равен нулю: ∇f(\vec{x}) = 0.
Минимум vs Максимум: Сам по себе метод не различает, что это за точка.
Критерий определения: Характер точки определяется матрицей Гессе в этой точке:
Если H положительно определена (все собственные значения > 0) -> это локальный минимум.
Если H отрицательно определена (все собственные значения < 0) -> это локальный максимум.
Если H имеет собственные значения разных знаков -> это седловая точка.
Важно: Если мы применяем метод Ньютона для поиска минимума, но в текущей точке матрица Гессе не является положительно определенной, то направление -H^{-1}∇f может оказаться направлением не спуска, а подъема. Демпфирование как раз помогает бороться с этой проблемой, делая модифицированную матрицу (H + μI) положительно определенной.
5. Что делает демпфирующий коэффициент?
Ответ: Демпфирующий коэффициент μ — это параметр регуляризации, который управляет балансом между скоростью (Ньютон) и надежностью (Градиентный спуск).
μ = 0: Чистый метод Ньютона. Максимальная скорость сходимости в окрестности решения, но ненадежен далеко от него.
μ -> ∞: Направление p_k = - (H + μI)^{-1}∇f ≈ - (1/μ) * ∇f. Это направление антиградиента, как в градиентном спуске. Шаг становится очень маленьким, метод надежен, но медленен.
μ > 0 (умеренное): "Умная" смесь. Вдали от решения, где H может быть неопределенной, μ велико, и метод ведет себя как градиентный спуск, гарантируя сходимость. Близко к решению, где H положительно определена, μ автоматически уменьшается до почти нуля, и метод ускоряется, достигая квадратичной сходимости.
6. Может ли параметр быть больше 1, меньше нуля? Неа.
Ответ: Совершенно верно, μ не может быть меньше нуля.
μ < 0: Это катастрофа. Мы не только не решаем проблему плохой обусловленности H, но и усугубляем ее. Если H и так имеет отрицательные собственные значения (например, в седловой точке), вычитание положительного числа (μ < 0) сделает их еще более отрицательными, и матрица (H + μI) станет еще более "плохой". Направление перестанет быть направлением спуска.
μ > 1: Да, может. Иногда для стабилизации метода вдали от решения требуются quite большие значения μ (например, 10, 100, 1000). Алгоритм подбирает μ таким, чтобы гарантировать, что модифицированная матрица (H + μI) была положительно определенной и что новый шаг действительно уменьшает функцию.
7. Что делает функция linalg?
Ответ: Скорее всего, речь идет о функции из библиотеки scipy.linalg или numpy.linalg. Поскольку мы не вычисляем обратную матрицу Гессе явно (это численно неустойчиво и дорого), то используется более умный подход.
Типичный код шага Ньютона с демпфированием:
# Вычисляем градиент (g) и матрицу Гессе (H) в точке x_k
g = gradient(x_k)
H = hessian(x_k)
# Решаем линейную систему относительно направления p_k
# (H + μ*I) * p_k = -g
p_k = scipy.linalg.solve(H + mu * np.eye(n), -g)
# Делаем шаг
x_{k+1} = x_k + p_k
Что делает scipy.linalg.solve(A, b)? Эта функция решает систему линейных уравнений A * x = b относительно x. В нашем случае A = (H + μI), а b = -∇f.
Почему это лучше, чем обратная матрица?
Вычисление обратной матрицы — это более сложная и менее точная операция, чем решение системы.
solve использует эффективные и устойчивые численные методы (например, LU-разложение или разложение Холецкого для положительно определенных матриц).
Таким образом, код solve(H, -g) математически эквивалентен inv(H) * (-g), но делает это быстрее и точнее.
