
Ключевой факт: антиградиент — локально наилучшее направление спуска.
Идея: двигаться в направлении антиградиента с постоянным шагом .
Алгоритм:
Проблема: выбор

Заметно «зигзагообразное» движение, особенно при вытянутых линиях уровня.
Идея: на каждой итерации выбирать оптимальный шаг в направлении антиградиента.
Это одномерная задача оптимизации → решаем методами из лекции 4 (золотое сечение и др.)
Алгоритм:

Преимущество перед фиксированным шагом: меньше итераций, автоматическая адаптация.
Пример: ,
| Итер. | |||||
|---|---|---|---|---|---|
| 0 | 4.000 | 4.000 | (8.0, 32.0) | — | 80.0 |
| 1 | 2.462 | −0.308 | (4.9, −2.5) | 0.193 | 6.15 |
| 2 | 0.529 | 0.619 | (1.1, 5.0) | 0.385 | 1.80 |
| 3 | 0.326 | −0.041 | (0.7, −0.3) | 0.193 | 0.110 |
| 4 | 0.070 | 0.082 | (0.1, 0.7) | 0.385 | 0.032 |
| 5 | 0.043 | −0.005 | (0.1, 0.0) | 0.193 | 0.002 |
Идея: использовать квадратичную аппроксимацию функции и переходить в минимум этой аппроксимации.
Разложение Тейлора второго порядка:
Минимум квадратичной аппроксимации:
Свойства:
Алгоритм:
Модификация с шагом: — повышает устойчивость.

Для квадратичных функций метод Ньютона находит минимум за один шаг.
Пример: ,
| Итер. | ||||
|---|---|---|---|---|
| 0 | 4.000 | 4.000 | (8.0, 32.0) | 80.0 |
| 1 | 0.000 | 0.000 | (0.0, 0.0) | 0.0 |
Один шаг! Для квадратичной функции метод Ньютона точен за одну итерацию.

| Метод | Итераций | Вычислений | Вычислений |
|---|---|---|---|
| Наискорейший спуск | 5+ | 10+ | 0 |
| Ньютон | 1 | 1 | 1 |
Проблема наискорейшего спуска: зигзагообразность в оврагах.
Идея: строить направления , сопряжённые относительно гессиана:
Метод сопряжённых градиентов (Fletcher-Reeves):
Для квадратичной функции переменных:
Для произвольных функций:
| Метод | Память | Скорость | Сложность итерации |
|---|---|---|---|
| Градиентный спуск | Линейная | 1 умножение матрицы | |
| Сопряжённые градиенты | Суперлинейная | 1 умножение матрицы | |
| Ньютон | Квадратичная | Обращение |

Направления не повторяются и не зигзагируют — прямой путь к минимуму.
Идея: на каждой итерации минимизировать по одной переменной, фиксируя остальные.
Алгоритм:
Достоинства: простота, не требует производных.
Недостатки: медленная сходимость при связи между переменными (овраги).

Движение параллельно осям координат — шаги перпендикулярны друг другу.
Идея: чередовать локальное исследование окрестности с ускоряющими «прыжками» в удачном направлении.
Два этапа на каждой итерации:
Параметры: начальная точка , начальный шаг , коэффициент ускорения (обычно 2), коэффициент сжатия (обычно 0.5)
Исследующий поиск вокруг точки :
Шаблонное перемещение:

Зелёные стрелки — исследующий поиск, красные — шаблонное перемещение. Метод быстро «скользит» по оврагам.
Достоинства:
Недостатки:
Применение: настройка параметров моделей, задачи с дорогостоящими вычислениями .
Идея: в каждой итерации проверять значения во всех вершинах гиперкуба с центром в текущей точке и двигаться к лучшей вершине.
Шаблон — гиперкуб: набор из вершин, полученных сдвигом по всем координатам на :
Всего комбинаций знаков .
| Размерность | Число вершин | Фигура |
|---|---|---|
| 2 | 4 | Квадрат |
| 3 | 8 | Куб |
| 4 | 16 | Тессеракт |
| Гиперкуб |
Параметры: начальная точка , размер шаблона , коэффициент сжатия (обычно 0.5), точность
Алгоритм:

На каждой итерации проверяются вершин гиперкуба (для — 4 вершины квадрата). При неудаче шаблон сжимается.
Пример: , , ,
| Итер. | Пробные точки | в них | Лучшая | |||
|---|---|---|---|---|---|---|
| 1 | (4, 4) | 1.0 | (5,5),(3,5),(5,3),(3,3) | 125,45,65,25 | (3,3) | 25 < 80 ✓ |
| 2 | (3, 3) | 1.0 | (4,4),(2,4),(4,2),(2,2) | 80,37,37,20 | (2,2) | 20 < 25 ✓ |
| 3 | (2, 2) | 1.0 | (3,3),(1,3),(3,1),(1,1) | 25,13,10,5 | (1,1) | 5 < 20 ✓ |
| 4 | (1, 1) | 1.0 | (2,2),(0,2),(2,0),(0,0) | 20,16,4,0 | (0,0) | 0 < 5 ✓ |
Достоинства:
Недостатки:
Сравнение с Хуком-Дживсом: поиск по шаблону — это только «исследующий поиск» без шаблонного перемещения. Проще, но медленнее.
Регулярный симплекс в — точек, равноудалённых друг от друга.
Для : равносторонний треугольник. Для : правильный тетраэдр.
Отличие от Нелдера-Мида: размер симплекса не изменяется — нет операций растяжения и сжатия.
Зададим начальную точку и длину ребра .
Формулы для вершин ( — размерность, , — параметры):
Для (): ,

Регулярный симплекс «шагает» по поверхности, отражая наихудшую вершину.
Достоинства:
Недостатки:
Историческая роль: метод Spendley et al. (1962) → развитие → Нелдер-Мид (1965) добавил операции деформации.
Симплекс в — множество из точек (вершин), не лежащих в одной гиперплоскости.
Для : треугольник из 3 вершин.
Идея: перемещать симплекс по поверхности , деформируя его (отражение, растяжение, сжатие) так, чтобы он «скатывался» к минимуму.
Метод не использует производных — только значения функции в вершинах.
Отличие от регулярного симплекса: размер симплекса адаптируется (растяжение при успехе, сжатие при неудаче).
Пусть — наихудшая вершина ( максимальна), — лучшая, — центроид остальных вершин.
Отражение (reflection): ,

Параметры: (отражение, 1), (растяжение, 2), (сжатие, 0.5), (глобальное сжатие, 0.5)

Симплекс деформируется и «скатывается» к минимуму, адаптируясь к форме поверхности.
Достоинства:
scipy.optimize.fmin)Недостатки:
Применение: подгонка параметров, задачи где производные недоступны (экспериментальные данные).
| Метод | Направление | Шаг | Градиент | Гессиан | Сходимость |
|---|---|---|---|---|---|
| Градиентный (фикс. шаг) | Постоянный | Да | Нет | Линейная | |
| Наискорейший спуск | Оптимальный | Да | Нет | Линейная | |
| Ньютон | 1 (или подбор) | Да | Да | Квадратичная | |
| Сопряжённые градиенты | Сопряжённые | Оптимальный | Да | Нет | Суперлинейная |
| Покоординатный | По осям | Оптимальный | Нет | Нет | Линейная |
| Хук-Дживс | Локальное + шаблон | Адаптивный | Нет | Нет | Суперлинейная |
| Поиск по шаблону | Гиперкуб ( точек) | Адаптивный | Нет | Нет | Линейная |
| Нелдер-Мид | Симплекс | Адаптивный | Нет | Нет | Линейная |
| Регулярный симплекс | Симплекс (фикс.) | Постоянный | Нет | Нет | Линейная |
Метод Ньютона:
Сопряжённые градиенты:
Градиентный спуск:
Покоординатный спуск:
Хук-Дживс / Нелдер-Мид:

Вытянутые овраги — худший случай для градиентных методов. Ньютон и сопряжённые градиенты справляются лучше.
import numpy as np
def gradient_descent(grad_f, x0, alpha=0.01, eps=1e-6, max_iter=1000):
x = np.array(x0, dtype=float)
for i in range(max_iter):
g = grad_f(x)
if np.linalg.norm(g) < eps:
break
x = x - alpha * g
return x, i + 1
def steepest_descent(f, grad_f, x0, eps=1e-6, max_iter=100):
from scipy.optimize import minimize_scalar
x = np.array(x0, dtype=float)
for i in range(max_iter):
g = grad_f(x)
if np.linalg.norm(g) < eps:
break
phi = lambda a: f(x - a * g)
alpha = minimize_scalar(phi).x
x = x - alpha * g
return x, i + 1
def newton_method(f, grad_f, hess_f, x0, eps=1e-6, max_iter=100):
x = np.array(x0, dtype=float)
for i in range(max_iter):
g = grad_f(x)
if np.linalg.norm(g) < eps:
break
H = hess_f(x)
p = np.linalg.solve(H, -g)
x = x + p
return x, i + 1
def conjugate_gradient(grad_f, x0, eps=1e-6, max_iter=100):
x = np.array(x0, dtype=float)
g = grad_f(x)
p = -g
for i in range(max_iter):
if np.linalg.norm(g) < eps:
break
phi = lambda a: f(x + a * p) # f должна быть определена
from scipy.optimize import minimize_scalar
alpha = minimize_scalar(phi).x
x = x + alpha * p
g_new = grad_f(x)
beta = np.dot(g_new, g_new) / np.dot(g, g)
p = -g_new + beta * p
g = g_new
return x, i + 1
f = lambda x: x[0]**2 + 4*x[1]**2
grad_f = lambda x: np.array([2*x[0], 8*x[1]])
hess_f = lambda x: np.array([[2, 0], [0, 8]])
x0 = [4.0, 4.0]
x, n = gradient_descent(grad_f, x0, alpha=0.05, eps=1e-6)
print(f"Градиентный спуск: x={x}, итераций={n}")
x, n = steepest_descent(f, grad_f, x0)
print(f"Наискорейший спуск: x={x}, итераций={n}")
x, n = newton_method(f, grad_f, hess_f, x0)
print(f"Метод Ньютона: x={x}, итераций={n}")
# Градиентный спуск: x=[0.000 0.000], итераций≈200
# Наискорейший спуск: x=[0.000 0.000], итераций≈6
# Метод Ньютона: x=[0.000 0.000], итераций=1
from scipy.optimize import minimize
f = lambda x: x[0]**2 + 4*x[1]**2
x0 = [4.0, 4.0]
result = minimize(f, x0, method='Nelder-Mead',
options={'xatol': 1e-6, 'fatol': 1e-6})
print(f"Нелдер-Мид: x={result.x}, f={result.fun:.8f}, итер={result.nit}")
result = minimize(f, x0, method='powell',
options={'xtol': 1e-6, 'ftol': 1e-6})
print(f"Поуэлл (шаблонный): x={result.x}, f={result.fun:.8f}, итер={result.nit}")
# Нелдер-Мид: x=[0.000 0.000], f=0.00000000, итер≈63
# Поуэлл: x=[0.000 0.000], f=0.00000000, итер≈5
Основная литература:
Дополнительная литература:
Онлайн-ресурсы:
Кратко пробегитесь по плану: начнём с постановки задачи и необходимых сведений из анализа, затем градиентные методы (наискорейший спуск, метод Ньютона, сопряжённые градиенты), после — безградиентные методы и сравнение.
Дайте постановку задачи: найти минимум функции нескольких переменных. Подчеркните, что это естественное обобщение одномерной задачи.
Шаблонный поиск Хука-Дживса — безградиентный метод, сочетающий исследующий поиск и ускоряющее перемещение по шаблону.
Поиск по шаблону с гиперкубом — простейший безградиентный метод, проверяющий окрестность текущей точки по всем вершинам гиперкуба.
Метод регулярного симплекса — предшественник Нелдера-Мида (1962). Симплекс фиксированного размера, только одна операция — отражение.