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

30. Запрограммировать метод bfgs. Показать его работу на функциях.

В чем заключается основная идея метода БФГШ и к какому классу методов он относится? Метод БФГШ относится к квазиньютоновским методам оптимизации. Его идея состоит в аппроксимации обратной матрицы Гессе без вычисления вторых производных, используя информацию о градиентах:

Hk≈(∇2f(xk))^−1.

Как определяется направление поиска в методе БФГШ? Направление поиска вычисляется по формуле

pk=−Hk∇f(xk).

Какую роль играет матрица Hk​ в алгоритме БФГШ и что она аппроксимирует? Матрица Hk аппроксимирует обратную матрицу Гессе:

Hk≈(∇2f(xk))^−1,

и используется для учета кривизны целевой функции.

Какие условия должны выполняться, чтобы матрица Hk​ оставалась положительно определенной? Необходимо выполнение условия кривизны:

yk⊤dk>0,

а также положительная определенность начальной матрицы H0​. Обычно это обеспечивается линейным поиском по условиям Вульфа.

Что такое уравнение секущих и зачем оно используется в методе БФГШ? Уравнение секущих имеет вид

Hk+1 yk=dk​,

и используется для согласования аппроксимации обратной матрицы Гессе с изменением градиента.

Какие величины обозначаются через dk​ и yk, и каков их смысл?

dk=xk+1−xk

yk=∇f(xk+1)−∇f(xk).

Вектор dk​ — шаг по переменным, yk​ — изменение градиента.

Почему в методе БФГШ требуется линейный поиск и какие методы обычно используются? Линейный поиск нужен для выбора шага αk​, обеспечивающего убывание функции и выполнение условия кривизны:

xk+1=xk+αkpk​.

Обычно используются правило Армихо и условия Вульфа.

Каковы вычислительная сложность и требования к памяти классического БФГШ? Вычислительная сложность одного шага:

O(n2),

память:

O(n2).

В чем заключаются основные проблемы применения БФГШ для задач большой размерности? Основная проблема — необходимость хранения матрицы Hk∈Rn×nH, что приводит к высоким затратам памяти и вычислений.

В каких задачах метод БФГШ особенно эффективен по сравнению с градиентным спуском? Метод БФГШ эффективен для гладких задач средней размерности, где учет кривизны ускоряет сходимость по сравнению с методом градиентного спуска.

31. Запрограммировать метод l- bfgs. Показать его работу на функциях.

В чем заключается основная идея метода БФГШ и к какому классу методов он относится?

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

32. Запрограммировать метод доверительных областей. Показать его работу на функциях.

Идея:

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

В одном предложении (идеально для ответа)

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

внутри модели используется метод золотого сечения

def goldensectionsearch(f, interval, tol):

a = interval[0]

b = interval[1]

Phi = (1 + np.sqrt(5)) / 2

L = b - a

x1 = b - L / Phi

x2 = a + L / Phi

y1 = f(x1)

y2 = f(x2)

neval = 2

xmin = x1

fmin = y1

# main loop

while np.abs(L) > tol:

if y1 > y2:

a = x1

xmin = x2

fmin = y2

x1 = x2

y1 = y2

L = b - a

x2 = a + L / Phi

y2 = f(x2)

neval += 1

else:

b = x2

xmin = x1

fmin = y1

x2 = x1

y2 = y1

L = b - a

x1 = b - L / Phi

y1 = f(x1)

neval += 1

answer_ = [xmin, fmin, neval]

return answer_

def pparam(pU, pB, tau):

if (tau <= 1):

p = np.dot(tau, pU)

else:

p = pU + (tau - 1) * (pB - pU)

return p

эта функция ищет минимум квадратичной модели

def doglegsearch(mod, g0, B0, Delta, tol):

# dogleg local search

xcv = np.dot(-g0.transpose(), g0) / np.dot(np.dot(g0.transpose(), B0), g0)

pU = xcv * g0

xcvb = inv(- B0)

pB = np.dot(inv(- B0), g0)

func = lambda x: mod(np.dot(x, pB))

al = goldensectionsearch(func, [-Delta / norm(pB), Delta / norm(pB)], tol)[0]

pB = al * pB

func_pau = lambda x: mod(pparam(pU, pB, x))

tau = goldensectionsearch(func_pau, [0, 2], tol)[0]

pmin = pparam(pU, pB, tau)

if norm(pmin) > Delta:

pmin_dop = (Delta / norm(pmin))

pmin = np.dot(pmin_dop, pmin)

return pmin

def Hnew(dk, yk, H):

p1 = np.dot(dk, dk.transpose()) / np.dot(dk.transpose(), yk)

p2 = np.dot(np.dot(np.dot(H, yk), yk.transpose()), H) / np.dot(np.dot(yk.transpose(), H), yk)

return H + p1 - p2

def trustreg(f, df, x0, tol):

# PLACE YOUR CODE HERE

eta = 0.1 порог n

delta = 0.25

coords = []

radii = []

B = np.eye(2) начальная модель

H = np.eye(2) начальная модель

f0 = f(x0)

g0 = df(x0)

rmax = 0.1

k = 0

kmax = 1000

dx = 1

while (norm(dx) >= tol) and (k < kmax):

mk = lambda x: f0 + np.dot(np.array(x).transpose(), g0) + 1 / 2 * np.dot(np.dot(np.array(x).transpose(), B),

np.array(x))

p0 = doglegsearch(mk, g0, B, delta, tol)

ro = ((f(x0) - f(x0 + p0)) / (mk(0) - mk(p0)))[0][0]

if (ro > eta):

xnew = x0 + p0

else:

xnew = x0

if (ro < 0.25):

delta = 0.25 * delta

elif (ro > 0.75 and norm(p0) == delta):

delta = min(2 * delta, rmax)

coords.append(xnew)

radii.append(delta)

gnew = df(xnew)

dx = xnew - x0

dy = gnew - g0

H = Hnew(dx, dy, H)

B = np.linalg.inv(H)

f0 = f(xnew)

x0 = xnew

g0 = gnew

k += 1

xmin = x0

fmin = f(xmin)

neval = k

answer_ = [xmin, fmin, neval, coords, radii]

return answer_