Как найти максимум и минимум функции на отрезке

Как найти максимум и минимум функции на отрезке Полезное

Максимум функции на промежутке — это ее наибольшее значение, минимум — наименьшее. Для непрерывной функции на отрезке [a, b] оба значения существуют всегда (теорема Вейерштрасса) и достигаются либо в стационарных точках внутри отрезка, либо на его концах. Ниже — точный алгоритм поиска, разбор на числовом примере и проверка результата кодом на Python (код проверен на Python 3.12, 19.09.2026).

Максимум, минимум и точка экстремума — разные вещи

Здесь легко перепутать три сущности:

  • x0 — точка экстремума (значение аргумента);
  • f(x0) — значение экстремума (то, что мы называем максимумом или минимумом);
  • экстремум — общее название для максимума и минимума как явления.

Формально: f(x0) — максимум функции y = f(x) на множестве X, если для любого x из X выполняется f(x) <= f(x0). Минимум — зеркально, f(x) >= f(x0). Если неравенство верно только в окрестности x0, а не на всем X, экстремум называют локальным; если на всем рассматриваемом множестве — глобальным (наибольшим или наименьшим значением функции).

Стационарные и критические точки

Стационарная точка — точка, в которой производная функции равна нулю: f'(x0) = 0. Это необходимое условие экстремума для дифференцируемой функции (теорема Ферма), но не достаточное: в стационарной точке может быть и точка перегиба без экстремума, например f(x) = x^3 в x = 0.

Упрощение, которое часто дают без оговорки: «экстремум всегда там, где производная равна нулю». Это верно не всегда. Во-первых, экстремум на закрытом отрезке может находиться на его конце, где условие f'(x0) = 0 не проверяется вовсе. Во-вторых, экстремум может быть в точке, где производная не существует, а не равна нулю — например, у f(x) = |x| минимум в x = 0, а производной там нет. Такие точки вместе со стационарными называют критическими.

Алгоритм поиска наибольшего и наименьшего значения на отрезке

Для непрерывной на [a, b] функции:

  1. Проверить непрерывность функции на всем отрезке [a, b].
  2. Найти производную f'(x).
  3. Решить уравнение f'(x) = 0 и отдельно выписать точки, где f'(x) не существует — это критические точки.
  4. Оставить из них только те, что попадают в [a, b].
  5. Вычислить значения функции в отобранных критических точках.
  6. Вычислить значения функции на концах отрезка: f(a) и f(b).
  7. Наибольшее из всех полученных значений — максимум на отрезке, наименьшее — минимум.

Разбор на примере: f(x) = x^3 — 3x на отрезке [-2; 3]

Пройдем алгоритм руками, шаг за шагом, до получения ответа.

Шаг 1-2. Функция непрерывна и дифференцируема на всей числовой прямой, значит и на [-2; 3]. Производная: f'(x) = 3x^2 — 3.

Шаг 3-4. Решаем 3x^2 — 3 = 0, откуда x^2 = 1, x = -1 или x = 1. Производная существует везде, других критических точек нет. Обе точки лежат в [-2; 3].

Шаг 5. Значения в критических точках:
— f(-1) = (-1)^3 — 3(-1) = -1 + 3 = 2;
— f(1) = 1^3 — 3
1 = 1 — 3 = -2.

Шаг 6. Значения на концах:
— f(-2) = -8 — (-6) = -2;
— f(3) = 27 — 9 = 18.

Шаг 7. Собираем все четыре значения: 2, -2, -2, 18. Наибольшее — 18 (в точке x = 3, это конец отрезка). Наименьшее — -2, и оно достигается сразу в двух точках: на левом конце x = -2 и в стационарной точке x = 1. Совпадение минимума в двух разных точках — нормальная ситуация, не ошибка алгоритма.

Уравнение f'(x) = 0 не всегда решается в явном виде — для сложных функций (например, с тригонометрией, логарифмами и многочленами вперемешку) аналитического корня может не найтись вовсе. В таком случае вместо алгебраического решения используют численный перебор точек на отрезке: с достаточно мелким шагом сетки это дает рабочее приближение к максимуму и минимуму без решения уравнения руками. Именно так устроен код ниже.

Проверяем результат в Python

Ниже полный рабочий скрипт: он находит те же максимум и минимум перебором точек на отрезке — сначала встроенными max()/min(), затем тем же самым вручную через цикл, чтобы сравнить оба способа на одинаковых данных.

def f(x):
    return x**3 - 3 * x

a, b = -2.0, 3.0
step = 0.001
n = int(round((b - a) / step))
points = [(a + i * step, f(a + i * step)) for i in range(n + 1)]

# способ 1: встроенные max() и min() с параметром key
x_max_b, y_max_b = max(points, key=lambda p: p[1])
x_min_b, y_min_b = min(points, key=lambda p: p[1])

# способ 2: тот же поиск руками, через цикл
best_max = points[0]
best_min = points[0]
for point in points[1:]:
    if point[1] > best_max[1]:
        best_max = point
    if point[1] < best_min[1]:
        best_min = point

print(f"builtin max: x={x_max_b:.3f}, y={y_max_b:.3f}")
print(f"builtin min: x={x_min_b:.3f}, y={y_min_b:.3f}")
print(f"loop    max: x={best_max[0]:.3f}, y={best_max[1]:.3f}")
print(f"loop    min: x={best_min[0]:.3f}, y={best_min[1]:.3f}")

Результат:

builtin max: x=3.000, y=18.000
builtin min: x=-2.000, y=-2.000
loop    max: x=3.000, y=18.000
loop    min: x=-2.000, y=-2.000

Оба способа дают одно и то же: максимум 18 на правом конце отрезка, минимум -2. Обратите внимание, что и min(), и ручной цикл вернули x = -2, хотя аналитически минимум -2 достигается и в x = 1 тоже — при равенстве значений оба способа берут первую по порядку перебора точку, это не ошибка, а свойство алгоритма поиска.

Разберем скрипт по частям. points — список пар (x, f(x)), построенный перебором отрезка с шагом 0.001: это не аналитический расчет, а численная аппроксимация, ее точность зависит от шага. max(points, key=lambda p: p[1]) сравнивает пары по второму элементу (значению функции) и возвращает всю пару целиком. Ручной цикл делает то же самое явно: держит текущий лучший результат в best_max/best_min и на каждом шаге сравнивает с ним новую точку — это и есть то, что max()/min() делают внутри себя.

Открытый интервал и точки без экстремума

На закрытом отрезке [a, b] непрерывная функция гарантированно имеет и максимум, и минимум — это как раз теорема Вейерштрасса. На открытом интервале (a, b) гарантии уже нет: значение может не достигаться, даже если функция ограничена.

Пример: f(x) = x на интервале (0, 1). Супремум (точная верхняя граница) равен 1, но ни при каком x из (0, 1) функция не принимает значение 1 — максимума нет. Аналогично инфимум 0 не достигается — минимума тоже нет.

Тип промежутка Максимум и минимум
Закрытый [a, b] Гарантированы для непрерывной функции (теорема Вейерштрасса)
Открытый (a, b) Могут не существовать, даже если функция ограничена
Полуоткрытый [a, b) или (a, b] Экстремум на закрытой стороне гарантирован, на открытой — нет
Неограниченный (луч, вся прямая) Зависит от поведения на бесконечности (пределов и асимптот); Вейерштрасс тут неприменим

Выводы

  • Максимум — наибольшее значение функции на промежутке, минимум — наименьшее; на закрытом отрезке у непрерывной функции есть оба (теорема Вейерштрасса).
  • Экстремум ищут среди критических точек: там, где f'(x) = 0, и там, где производная не существует, — плюс отдельно проверяют концы отрезка.
  • Равенство производной нулю — необходимое, но не достаточное условие экстремума: нужна отдельная проверка (смена знака производной или сравнение значений).
  • На открытых и неограниченных промежутках максимум или минимум может не существовать, даже когда функция ограничена.
  • Численный перебор на Python (встроенный max()/min() или ручной цикл) дает тот же результат, что и аналитическое решение, но с точностью, ограниченной шагом сетки.

Где применяется / связь с практикой

Поиск максимума и минимума функции — база для оптимизации, с которой постоянно работают в анализе данных: подбор параметров модели, минимизация ошибки, поиск точки безубыточности. Тот же принцип «сравнить значения и оставить лучшее», который мы разобрали в цикле на Python, лежит в основе градиентного спуска и других методов оптимизации, только вместо перебора всех точек там используют производную, чтобы двигаться сразу в сторону улучшения.

Освойте тему на практике

Если разбор кода в статье дался тяжело или хочется системно разобраться с Python до такого уровня задач, на курсе Python Developer. Basic разбирают язык с нуля, включая работу с функциями и данными, которая нужна для подобных вычислений. Также можно заглянуть на открытые уроки Otus и посмотреть, как разбирают похожие задачи вживую.

Тема тесно связана с основами Python и работой с функциями, циклами и списками.

FAQ

Может ли непрерывная функция на отрезке не иметь ни максимума, ни минимума?
Нет, если отрезок замкнут и ограничен (вида [a, b]), а функция непрерывна на нем — оба значения гарантированы теоремой Вейерштрасса. Без этих условий (открытый интервал, разрыв, неограниченность) экстремума может не быть.

Могут ли максимум и минимум функции на отрезке совпадать по значению?
Да, если функция на этом отрезке постоянна: тогда любое ее значение одновременно и максимум, и минимум. Для непостоянной функции такое невозможно.

Как понять, максимум или минимум в найденной стационарной точке, не строя график?
Проверить знак производной по обе стороны от точки: смена с плюса на минус означает максимум, с минуса на плюс — минимум. Альтернатива — вторая производная: f»(x0) < 0 дает максимум, f»(x0) > 0 — минимум.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)