Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
непрмо_подготовка к экзую.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
6.31 Mб
Скачать

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. Ограниченная сходимость преодолевается?

Ответ: Да, именно для этого и вводят демпфирование!

Ограничения (недостатки) чистого метода Ньютона, которые преодолевает демпфирование:

  1. Невырожденность Гессе: Чистый Ньютон требует, чтобы матрица Гессе была обратимой (ее определитель не равен нулю). Если она вырождена или плохо обусловлена, обратная матрица не существует или вычисляется с огромной ошибкой.

    • Как преодолевает демпфирование: Мы работаем не с H, а с (H + μI). Добавление μI (где I — единичная матрица) делает матрицу положительно определенной и хорошо обусловленной, что гарантирует существование обратной матрицы и устойчивость решения.

  2. Сходимость только в окрестности решения: Чистый Ньютон может расходиться, если начальная точка далека от минимума.

    • Как преодолевает демпфирование: На больших μ метод ведет себя как градиентный спуск с шагом 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), но делает это быстрее и точнее.