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

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_