- •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. Запрограммировать метод доверительных областей. Показать его работу на функциях.
8. Метод дихотомии. Запрограммировать, показать работу на функциях.
def bsearch(interval, tol):
a = interval[0]
b = interval[1]
coords = []
g = df(a)
neval = 1
while (np.abs(b-a) > tol) and (np.abs(g) > tol) :
x = 0.5 * (a + b)
coords.append(x)
g = df(x)
if g > 0:
b = x
else:
a = x
neval += 1
xmin = 0.5 * (a + b)
fmin = f(xmin)
neval += 1
answer_ = [xmin, fmin, neval, coords]
return answer_
Метод дихотомии/метод золотого сечения - когда какой лучше?
Метод дихотомии хорош для учебных и простых случаев — он интуитивно понятен.
Метод золотого сечения — оптимизированная версия дихотомии, уменьшает количество вычислений функции (на одной итерации требуется только одно новое значение), поэтому он эффективнее и быстрее, особенно при малом допуске.
Могут ли быть разные толы? - да, могут. Как понять, какой тол меньше, какой больше? (чел так и не ответил, но каримов забил)
Да, могут — например, tol_x для точности по аргументу и tol_f для точности по значению функции.
Меньший tol означает более строгую точность (требуется меньшее изменение между итерациями), больший — грубее.
То есть:
tol = 1e-6 → точнее, чем tol = 1e-3.
Можно ли добавить какой-то еще КОП? - да, можно, например условие по количеству итераций
Да, можно. Например:
по количеству итераций (k > k_max),
по малости приращения функции,
или по малости производной, если она есть.
Вот есть метод трехточеченого деления, вопрос, во сколько раз уменьшается интервал? ответ - в 2 раза на каждой итерации (чтобы понять, на доске нарисовать пришлось)
На каждой итерации интервал уменьшается в 2 раза, потому что при сравнении трёх точек отсекается половина текущего интервала неопределённости.
Можно ли с помощью метода дихотомии не искать минимум, а искать значение, при котором функция = 0? ответ - да, можно, нужно в проге проверять не производные, а функции
Да, можно. Тогда вместо проверки знаков производной (как при поиске минимума) проверяют знаки самой функции f(a) и f(b) — то есть это превращается в классический метод половинного деления (bisection) для нахождения корня.
Если производная не задана, её нужно численно приближать:
На это требуется два вычисления функции вместо одного. Значит, число вычислений ЦФ увеличивается примерно в 2 раза на каждой итерации.
9. Метод трехточечного деления. Запрограммировать, показать работу на функциях.
def three_point_search(interval, tol):
a, b = interval
coords = []
x_m = (a+b)/2
fm = f(x_m)
neval = 1
while np.abs(b - a) > tol:
# выбираем две внутренние точки
x1 = a + (b - a) / 4
x2 = b - (b - a) / 4
f1 = f(x1)
f2 = f(x2)
# fm = f(x_m)
coords.append(x_m)
neval+=2
# если f(x1) < f(x2), минимум ближе к a → x2
if f1 < fm:
b = x_m
x_m = x1
fm = f1
elif f1 >= fm and fm<= f2:
a = x1
b = x2
elif fm > f2:
a = x_m
x_m = x2
fm = f2
xmin = x_m
fmin = fm
print(fmin, f(x_m))
answer_ = [xmin, fmin, neval, coords]
return answer_
