gadget59.ru · лекция Численные методы · Лекция 2 · 28 слайдов
01

Лекция №2: Локализация корней и численные методы решения уравнений

Как найти корень уравнения, если формулы не помогают

ОП.10 Численные методы · Специальность 09.02.07 «Информационные системы и программирование»
Лекция 2 · 2 академических часа (90 минут)

Сегодня мы перейдём от теории погрешностей к настоящей «боевой» задаче — поиску корней уравнений. Вы узнаете, как компьютер находит решения там, где бессильна школьная алгебра, и напишете свои первые численные алгоритмы на Python.

🎯 Корни уравнений 📊 Локализация ✂️ Метод бисекции 🔄 Метод итераций 🐍 Python 📐 f(x) = 0
02

Зачем программисту искать корни уравнений?

В школе мы решали уравнения по формулам: квадратное — через дискриминант, линейное — переносом слагаемых. Но в реальной разработке 90% уравнений не имеют аналитического решения.

Где это встречается в IT

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

03

План лекции

Что мы разберём за одну пару:

  1. Постановка задачи: что такое корень уравнения.
  2. Алгебраические и трансцендентные уравнения.
  3. Почему нельзя решить всё аналитически.
  4. Два этапа решения: отделение корней и уточнение.
  5. Графический метод локализации.
  6. Аналитический метод локализации (теорема о промежуточном значении).
  7. Метод половинного деления (бисекции) — теория и алгоритм.
  8. Блок-схема метода бисекции.
  9. Пример на Python: метод половинного деления.
  10. Метод простой итерации — теория.
  11. Условия сходимости итераций.
  12. Пример на Python: метод итераций.
  13. Сравнение методов и скорость сходимости.
  14. Анонс практической работы №2.
  15. Вопросы для самопроверки и итоги.
04

Постановка задачи: что такое корень уравнения

Рассмотрим уравнение вида:

f(x) = 0

где f(x) — заданная функция, а x — неизвестная величина, которую нужно найти.

Корень уравнения — это такое значение x, при котором функция f(x) обращается в ноль. Геометрически — это точка пересечения графика функции с осью Ox (абсцисс — горизонтальной осью).

Пример

Уравнение x² − 4 = 0 имеет два корня: x = 2 и x = −2. На графике параболы y = x² − 4 это точки, где кривая пересекает горизонтальную ось.

Уравнение может иметь один корень, несколько корней, бесконечно много корней или не иметь корней вовсе. Наша задача — найти все действительные корни (или те, что нас интересуют).

05

Алгебраические и трансцендентные уравнения

Все уравнения делятся на два больших класса. Понимание этой разницы — ключ к выбору метода решения.

Алгебраические уравнения

Функция f(x) — алгебраическая: содержит только сложение, вычитание, умножение, деление, возведение в степень.

Примеры:

  • x² − 5x + 6 = 0 (квадратное)
  • x³ − 2x + 1 = 0 (кубическое)
  • 2x⁵ + x − 7 = 0 (пятой степени)

Трансцендентные уравнения

Функция f(x) содержит тригонометрические, показательные, логарифмические или другие «неалгебраические» операции.

Примеры:

  • sin(x) = x/2
  • e^x = 3x
  • ln(x) + x² = 5
  • cos(x) − x = 0

Важно: алгебраические уравнения степени 5 и выше не имеют общей формулы корней (теорема Абеля — Абеля Руффини, доказана в 1824 году). Трансцендентные уравнения почти всегда решаются только численно.

06

Почему нельзя решить всё аналитически?

«Аналитически» — значит по формуле, точно, без приближений. Как x = (−b ± √D) / (2a) для квадратного уравнения.

Проблемы аналитического подхода

Выход: вместо точного решения мы ищем приближённое значение корня с заданной точностью (например, до 6 знаков после запятой). Это и есть численный метод.

Пример: уравнение cos(x) = x имеет корень x ≈ 0.7390851332. Точной формулы нет, но компьютер найдёт это значение за миллисекунды.

07

Два этапа решения уравнения

Численное решение любого уравнения всегда состоит из двух последовательных этапов. Пропустить один из них — нельзя.

Этап 1: Локализация (отделение) корней

Находим промежутки, на каждом из которых лежит ровно один корень.

Результат: «на отрезке [a, b] есть один корень».

Методы:

  • Графический
  • Аналитический (по теореме о промежуточном значении)
  • Перебор значений с шагом

Этап 2: Уточнение корня

Вычисляем значение корня с заданной точностью ε (эпсилон).

Результат: «корень равен x ≈ 0.7391 с точностью до 0.0001».

Методы:

  • Метод половинного деления (бисекции)
  • Метод простой итерации
  • Метод хорд
  • Метод касательных (Ньютона)

Аналогия из жизни: сначала вы ищете дом на улице (локализация — «дом где-то между №10 и №20»), а потом подходите к нужной двери (уточнение — «это дом №15»). Без первого этапа второй невозможен.

08

Графический метод локализации

Самый наглядный способ — построить график функции y = f(x) и посмотреть, где он пересекает ось Ox.

Как это делается

  1. Выбираем диапазон значений x (например, от −5 до 5).
  2. Вычисляем f(x) в нескольких точках (с шагом 0.5 или 0.1).
  3. Строим график (вручную на миллиметровке или в Python через matplotlib).
  4. Видим, где график пересекает горизонтальную ось — это и есть корни.

Пример на Python

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 400)
y = np.cos(x) - x  # наше уравнение cos(x) = x

plt.axhline(0, color='black', linewidth=1)
plt.plot(x, y, label='f(x) = cos(x) - x')
plt.grid(True)
plt.legend()
plt.title('Графическая локализация корня')
plt.show()

На графике видно: кривая пересекает ось один раз, примерно в точке x ≈ 0.7. Значит, корень один, и он находится на отрезке [0, 1].

09

Аналитический метод локализации

Если графика под рукой нет, используем математику. В основе — теорема о промежуточном значении (теорема Больцано — Коши).

Теорема: если функция f(x) непрерывна на отрезке [a, b] и на концах отрезка принимает значения разных знаков (то есть f(a) · f(b) < 0), то внутри отрезка существует хотя бы один корень.

Алгоритм перебора

  1. Задаём начальный диапазон [x₀, x₁] и шаг h.
  2. Вычисляем f(x₀), f(x₁), f(x₂), … с шагом h.
  3. Ищем две соседние точки, где функция меняет знак.
  4. Отрезок между ними — это «отделённый корень».

Пример

Уравнение x³ − x − 1 = 0. Считаем:

Знак изменился → на отрезке [1, 2] есть корень.

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

10

Метод половинного деления (бисекции)

Теперь, когда мы знаем, что на отрезке [a, b] есть ровно один корень, нужно его уточнить. Самый простой и надёжный метод — метод половинного деления (он же метод бисекции, от лат. bisectio — рассечение надвое).

Идея метода

Делим отрезок пополам, выбираем ту половину, где функция меняет знак, и повторяем. И так до тех пор, пока отрезок не станет достаточно малым.

Алгоритм пошагово

  1. Заданы [a, b] и точность ε.
  2. Находим середину: c = (a + b) / 2.
  3. Вычисляем f(c).
  4. Если f(c) = 0 (или |f(c)| < ε) — корень найден: x = c.
  5. Если f(a) · f(c) < 0 — корень в левой половине: b = c.
  6. Иначе — корень в правой половине: a = c.
  7. Повторяем шаги 2–6, пока |b − a| < ε.

Преимущество: метод всегда сходится (если корень есть). Недостаток: работает медленно по сравнению с другими методами.

11

Блок-схема метода бисекции

Визуально алгоритм выглядит так:

Начало: заданы [a, b], точность ε
↓
Вычислить c = (a + b) / 2
↓
Вычислить f(c)
↓
f(c) = 0 или |b − a| < ε ?
↓ (НЕТ)                                      ↓ (ДА)
f(a) · f(c) < 0 ?
Корень x ≈ c. Конец.
↓ (НЕТ)                                      ↓ (ДА)
a = c                                            b = c
↺ Возврат к шагу «Вычислить c»

На каждом шаге длина отрезка уменьшается ровно в 2 раза. Через n шагов длина станет (b − a) / 2ⁿ. Чтобы получить точность ε = 10⁻⁶ на отрезке [0, 1], нужно около 20 шагов.

12

Сколько шагов нужно?

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

Формула оценки числа шагов

n ≥ log₂((b − a) / ε)

где n — число шагов, (b − a) — длина исходного отрезка, ε — требуемая точность.

Пример

Отрезок [1, 2] (длина 1), точность ε = 0.001.

n ≥ log₂(1 / 0.001) = log₂(1000) ≈ 9.97 → нужно 10 шагов

Точность ε Число шагов n
10⁻² 7
10⁻³ 10
10⁻⁶ 20
10⁻⁹ 30

Видно: чтобы добавить ещё один верный знак после запятой, нужно примерно 3–4 дополнительных шага. Это плата за надёжность метода.

13

Пример на Python: метод бисекции

Решим уравнение cos(x) − x = 0 на отрезке [0, 1] с точностью ε = 10⁻⁶.

def f(x):
    """Наша функция: cos(x) - x"""
    import math
    return math.cos(x) - x

def bisection(a, b, epsilon):
    """Метод половинного деления"""
    step = 0
    while abs(b - a) > epsilon:
        c = (a + b) / 2
        step += 1
        print(f"Шаг {step}: a={a:.6f}, b={b:.6f}, c={c:.6f}, f(c)={f(c):.6f}")
        
        if f(c) == 0:
            return c
        elif f(a) * f(c) < 0:
            b = c  # корень в левой половине
        else:
            a = c  # корень в правой половине
    
    return (a + b) / 2

# Запуск
root = bisection(0, 1, 1e-6)
print(f"\nКорень найден: x ≈ {root:.8f}")
print(f"Проверка: f(x) = {f(root):.2e}")

Результат работы

Шаг 1: a=0.000000, b=1.000000, c=0.500000, f(c)=0.377583
Шаг 2: a=0.500000, b=1.000000, c=0.750000, f(c)=-0.018311
...
Шаг 20: a=0.739085, b=0.739086, c=0.739085, f(c)=0.000000

Корень найден: x ≈ 0.73908513
Проверка: f(x) = 2.22e-16
14

Метод простой итерации

Второй по популярности метод — метод простой итерации. Он быстрее бисекции, но требует аккуратной подготовки уравнения.

Идея метода

Преобразуем уравнение f(x) = 0 к виду:

x = φ(x)

где φ(x) — некоторая функция, полученная из f(x). Затем строим итерационный процесс:

xₙ₊₁ = φ(xₙ)

Начинаем с некоторого x₀ (приближения) и последовательно вычисляем x₁, x₂, x₃, … до сходимости.

Пример преобразования

Уравнение x³ − x − 1 = 0. Преобразуем:

x³ = x + 1 → x = ∛(x + 1)

Теперь φ(x) = ∛(x + 1). Берём x₀ = 1 и считаем:

15

Условия сходимости итераций

Метод итерации не всегда сходится. Если преобразовать уравнение неудачно, процесс может «разбегаться» в бесконечность.

Теорема о сходимости (принцип сжимающих отображений): метод итерации xₙ₊₁ = φ(xₙ) сходится, если на отрезке локализации выполняется условие:

|φ'(x)| < 1

где φ'(x) — производная функции φ(x). Проще говоря, функция φ должна быть «пологой», а не крутой.

Как проверить на практике

  1. Найти производную φ'(x).
  2. Подставить в неё границы отрезка [a, b].
  3. Если |φ'(x)| < 1 на всём отрезке — метод сойдётся.
  4. Если |φ'(x)| ≥ 1 — нужно преобразовать уравнение по-другому.

Плохой пример

Уравнение x³ − x − 1 = 0. Преобразуем неудачно: x = x³ − 1. Тогда φ'(x) = 3x². При x ≈ 1.3 получаем φ'(x) ≈ 5.07 > 1 — метод разойдётся!

Правило: чем меньше |φ'(x)|, тем быстрее сходится метод. Идеально, когда φ'(x) ≈ 0 в окрестности корня.

16

Пример на Python: метод итераций

Решим то же уравнение x³ − x − 1 = 0 методом простой итерации.

def phi(x):
    """Преобразованная функция: x = ∛(x + 1)"""
    return (x + 1) ** (1/3)

def simple_iteration(x0, epsilon, max_iter=100):
    """Метод простой итерации"""
    x = x0
    for n in range(max_iter):
        x_new = phi(x)
        print(f"Итерация {n+1}: x = {x_new:.8f}")
        
        if abs(x_new - x) < epsilon:
            return x_new
        x = x_new
    
    print("Метод не сошёлся за заданное число итераций!")
    return None

# Запуск
root = simple_iteration(1.0, 1e-6)
print(f"\nКорень найден: x ≈ {root:.8f}")

Результат работы

Итерация 1: x = 1.25992105
Итерация 2: x = 1.31229384
Итерация 3: x = 1.32271116
...
Итерация 28: x = 1.32471796
Итерация 29: x = 1.32471796

Корень найден: x ≈ 1.32471796

Метод сошёлся за 29 итераций. Для сравнения: метод бисекции на том же отрезке потребовал бы около 20 шагов, но итерации здесь быстрее — каждое вычисление проще.

17

Сравнение методов

Какой метод выбрать? Зависит от задачи. Давайте сравним два рассмотренных.

Критерий Метод бисекции Метод итераций
Надёжность ✅ Всегда сходится ⚠️ Только если |φ'(x)| < 1
Скорость сходимости Линейная (медленно) Линейная (быстрее)
Подготовка Простая: нужен только отрезок Сложнее: нужно преобразовать уравнение
Требования к функции Непрерывность Непрерывность + существование φ'(x)
Применение Надёжный старт, «грубая» локализация Быстрое уточнение, если есть хорошая φ(x)

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

18

Скорость сходимости: что это такое

Скорость сходимости — это то, как быстро метод приближается к точному корню. Измеряется порядком метода p.

Виды сходимости

Наглядный пример

Если текущая ошибка 10⁻²:

Именно поэтому метод Ньютона (метод касательных) так популярен в научных вычислениях — он находит корень за 5–7 итераций с точностью до 15 знаков!

19

Встроенные функции Python

В реальных проектах не пишут свои методы с нуля — используют готовые библиотеки. В Python это scipy.optimize.

from scipy.optimize import root_scalar
import math

def f(x):
    return math.cos(x) - x

# Метод бисекции
result = root_scalar(f, bracket=[0, 1], method='bisect', xtol=1e-8)
print(f"Бисекция: x = {result.root:.10f}, итераций: {result.iterations}")

# Метод Brent (комбинация бисекции, секущих и обратной квадратичной интерполяции)
result = root_scalar(f, bracket=[0, 1], method='brentq', xtol=1e-8)
print(f"Brent: x = {result.root:.10f}, итераций: {result.iterations}")

Результат

Бисекция: x = 0.7390851332, итераций: 27
Brent: x = 0.7390851332, итераций: 6

Метод Brent (Брента) — это «золотой стандарт» в научных вычислениях. Он сочетает надёжность бисекции и скорость других методов. Именно его использует функция root_scalar по умолчанию.

Но чтобы грамотно использовать библиотеки, нужно понимать, как работают базовые методы. Иначе вы не сможете выбрать правильный инструмент для задачи.

20

Прикладной пример: физика в играх

Рассмотрим реальную задачу из игровой разработки. Игрок бросает мяч с начальной скоростью v₀ = 20 м/с под углом α = 45°. Нужно найти, когда мяч упадёт на землю.

Математическая модель

Уравнение движения по вертикали (с учётом сопротивления воздуха, пропорционального скорости):

y(t) = v₀·sin(α)·t − (g/2)·t² − k·t³ = 0

где g = 9.81 м/с² — ускорение свободного падения, k = 0.05 — коэффициент сопротивления.

Это кубическое уравнение относительно t. Аналитически решить можно, но сложно. Проще — численно.

import math

def y(t):
    v0, alpha, g, k = 20, math.radians(45), 9.81, 0.05
    return v0 * math.sin(alpha) * t - (g/2) * t**2 - k * t**3

# Локализация: проверяем значения
for t in [0, 1, 2, 3, 4]:
    print(f"t={t}: y={y(t):.3f}")

# Видно: y(2) > 0, y(3) < 0 → корень на [2, 3]
# Уточняем бисекцией:
# ... (код из слайда 13)

Результат: мяч упадёт примерно через t ≈ 2.73 секунды. Именно так работают физические движки игр.

21

Анонс практической работы №2

На следующей паре мы проведём Практическую работу №2 по теме «Решение алгебраических и трансцендентных уравнений методом половинного деления и методом итераций» (2 академических часа).

Что вас ждёт

Что нужно подготовить:

  • Установленный Python (желательно с библиотеками numpy и matplotlib).
  • Повторить материал лекции: определения корня, этапы решения, алгоритмы.
  • Принести свой вариант уравнения (будут выданы на занятии).
22

Вопросы для самопроверки (часть 1)

  1. Что такое корень уравнения? Дайте определение.
  2. Чем алгебраическое уравнение отличается от трансцендентного? Приведите примеры.
  3. Почему уравнения 5-й степени и выше нельзя решить по общей формуле?
  4. Что значит «решить уравнение аналитически»? А «численно»?
  5. Из каких двух этапов состоит численное решение уравнения?
  6. В чём суть графического метода локализации?
  7. Сформулируйте теорему о промежуточном значении (теорему Больцано — Коши).
  8. Как аналитически отделить корни уравнения?
23

Вопросы для самопроверки (часть 2)

  1. В чём идея метода половинного деления (бисекции)?
  2. Запишите алгоритм метода бисекции пошагово.
  3. По какой формуле оценивается число шагов метода бисекции?
  4. Каковы преимущества и недостатки метода бисекции?
  5. В чём идея метода простой итерации?
  6. Как преобразовать уравнение f(x) = 0 к виду x = φ(x)?
  7. При каком условии метод итераций сходится?
  8. Что такое скорость сходимости? Какие виды сходимости вы знаете?
  9. Какой метод быстрее: бисекция или итерация? Почему?
  10. Какие встроенные функции Python можно использовать для поиска корней?
24

Что должен уметь студент после этой лекции

После изучения этой темы и выполнения практической работы вы должны:

Знать

  • Постановку задачи поиска корней уравнения.
  • Разницу между алгебраическими и трансцендентными уравнениями.
  • Два этапа численного решения: локализацию и уточнение.
  • Алгоритм метода половинного деления.
  • Алгоритм метода простой итерации.
  • Условия сходимости итераций.

Уметь

  • Локализовать корни уравнения графически и аналитически.
  • Реализовать метод бисекции на Python.
  • Реализовать метод итераций на Python.
  • Оценивать скорость сходимости методов.
  • Выбирать подходящий метод для конкретной задачи.
  • Использовать встроенные функции scipy.optimize.

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

25

Домашнее задание

  1. Повторить материал лекции: определения, алгоритмы, условия сходимости.
  2. Решить вручную (на бумаге) уравнение x³ − 2x − 5 = 0 методом бисекции на отрезке [2, 3] с точностью ε = 0.1. Сделать 4 шага.
  3. Творческое задание (со звёздочкой): написать на Python программу, которая сравнивает скорость работы метода бисекции и метода итераций для уравнения cos(x) − x = 0. Вывести число итераций и время работы каждого метода (используйте модуль time).
  4. Прочитать в учебнике Лапчика М.П. «Элементы численных методов» главу 2 (раздел о методе половинного деления).
  5. Подготовиться к практической работе №2: установить Python, проверить работу matplotlib.

Подсказка для задания 3:

import time
start = time.time()
# ... ваш код ...
end = time.time()
print(f"Время работы: {end - start:.6f} секунд")
26

Типичные ошибки студентов

На практических работах часто встречаются одни и те же промахи. Избегайте их!

Ошибка Почему это плохо Как правильно
Пропуск этапа локализации Метод может сойтись не к тому корню или разойтись Всегда сначала стройте график или делайте перебор
Слишком большой шаг при переборе Можно «проскочить» два близких корня Используйте шаг 0.1 или меньше
Неправильное преобразование к x = φ(x) Метод итераций разойдётся Проверяйте условие |φ'(x)| < 1
Сравнение float через == Условие никогда не сработает (см. лекцию 1) Используйте abs(a - b) < epsilon
Бесконечный цикл Программа «зависает» Всегда ставьте ограничение на число итераций

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

27

Итоги лекции

Сегодня мы сделали огромный шаг вперёд — перешли от теории погрешностей к реальным численным алгоритмам.

Краткое резюме

Главная мысль: численные методы — это не «костыли» вместо точной математики, а мощный инструмент, без которого не работает современная наука, инженерия и IT.

28

Что дальше?

На следующей лекции — метод хорд и метод касательных (Ньютона).
Это самые быстрые методы уточнения корней!

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

🎯 Корни ✂️ Бисекция 🔄 Итерации 📈 Сходимость 🐍 Python

Спасибо за внимание!
До встречи на практической работе №2!