Проверить программы онлайн · файлы остаются в браузере

Численные методы — практикум

10 класс, углублённый уровень. Занятие четырнадцатое. Уравнение, для которого нет формулы, решают приближённо: отделяют корни перебором с шагом и уточняют каждый половинным делением — до нужной точности.

План на пару. Сначала тренажёр: шесть коротких задач о том, как работают численные методы, — какие отрезки найдёт отделение корней, что даст подбор с шагом, где окажется отрезок после шагов половинного деления, сколько шагов нужно, сколько точек пройдёт цикл с шагом, где корень по таблице значений. Потом три программы — практическая работа «Численное решение уравнений». Проверяет оболочка Проверка.bat из общей папки: она запускает программу на девяти наборах данных и сверяет найденные корни с точными. Интернет не нужен.

Часть 1. Тренажёр: как работают численные методы

Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: выпиши столбиком, что происходит на каждом шаге цикла. Ответ — всё напечатанное через пробел, так, как печатает Python: вещественное число с точкой (2.0, а не 2), дробная часть через точку, а не через запятую. Ошибся — ниже появится разбор рисунком: таблица шагов и что напечатано, — и кнопка «Новые числа»: реши такую же ещё раз.

0 верно из 6

Часть 2. Как решают уравнение численно

Где корень: смена знака

Если функция непрерывна, а на концах отрезка у неё разные знаки, на этом отрезке есть корень: от минуса к плюсу нельзя перейти, не пройдя через ноль. Проверка одной строкой — произведение меньше нуля: f(a) * f(b) < 0. Одинаковые знаки ничего не гарантируют: корней может не быть, а может быть два.

Отделение корней — перебор с шагом

фрагмент программы — набери его сам

Программа печатает отрезки -3 -2, 0 1, 2 3 — на каждом по корню. Последний x в range(a, b) — это b − 1, поэтому отрезок [b − 1; b] тоже проверен.

Уточнение — половинное деление

фрагмент программы — набери его сам

Каждый шаг вдвое укорачивает отрезок, где лежит корень. От длины 1 до 0.001 — всего 10 шагов: 2¹⁰ = 1024. Перебор с шагом 0.001 потратил бы тысячу вычислений. Знак <=, а не <: если середина попала точно в корень, f(c) = 0 — корень остаётся на отрезке.

Вещественные числа

Деление / всегда даёт вещественное число: 10 / 5 — это 2.0. Вещественные хранятся приближённо (0.1 + 0.2 — это 0.30000000000000004), поэтому их не сравнивают через ==, а цикл пишут через «длина больше точности». Ровно три знака после точки печатает f"{x:.3f}"; round(x, 3) для этого не годится — у него round(2.0, 3) это 2.0.

Часть 3. Практическая работа: численное решение уравнений

Задание 1 Отделение корней

Программа код читает в первой строке два целых числа код и код, во второй — два целых код и код (−10 ≤ a < b ≤ 10). Для уравнения x³ + p·x + q = 0 она печатает все отрезки [x; x + 1] с целыми концами внутри [a; b], на концах которых f(x) = x³ + p·x + q разного знака, — каждый отрезок в своей строке, слева направо. Если таких нет — строку код. В целых точках f(x) ≠ 0 — это гарантируется.

Вход

-7 1
-5 5

Вывод

-3 -2
0 1
2 3

Проверяется: три отрезка, ни одного, корень в последнем отрезке [b − 1; b], отрезки левее нуля и случайные уравнения.

Если застрял

Функция код — она видит код и код программы. Дальше цикл код и условие код. Нашёлся ли хоть один отрезок — запомни в переменной код, после цикла проверь.

Задание 2 Половинное деление

Программа код читает натуральное код (1 ≤ N ≤ 1000) и печатает корень уравнения x³ + x = N с точностью 0.001 — ровно три знака после точки. Корень лежит на отрезке [0; N]: функция x³ + x − N на нём возрастает от отрицательного значения к положительному.

Вход

15

Вывод

2.331

Проверяется: N = 1 (корень меньше единицы), N = 2 и N = 10 (корни целые: 1 и 2), N = 1000 и случайные.

Если застрял

Отрезок код, код; цикл код, середина код; если код — код, иначе код. После цикла печать код для середины последнего отрезка.

Ловушка. При N = 2 первая же середина — ровно корень 1, и f(c) = 0. Со знаком код вместо код программа решит, что корень справа, и уйдёт к 2.000.

Задание 3 Все корни уравнения

Программа код читает те же данные, что задание 1: код и код, потом код и код. Она находит все корни уравнения x³ + p·x + q = 0 на отрезке [a; b] с точностью 0.001 и печатает их по возрастанию, каждый в своей строке, ровно с тремя знаками после точки. Если корней нет — код. Гарантируется: в целых точках f ≠ 0, и в каждом отрезке [x; x + 1] не больше одного корня.

Вход

-7 1
-5 5

Вывод

-2.714
0.143
2.571

Проверяется: три корня, ни одного, корень в последнем отрезке, отрицательный корень и случайные уравнения.

Если застрял

Это задание 1 и задание 2 вместе. Отделение — тот же цикл по отрезкам; а вместо печати отрезка — уточнение корня на нём половинным делением. Деление удобно вынести в функцию код, которая возвращает середину последнего отрезка.

Часть 4. Сдача

  1. Три файла лежат в одной твоей папке, отладочные print убраны.
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

Оболочка показывает, на каких данных программа ошиблась, что она вывела и что должна была. Исправляй и проверяй снова, попыток сколько угодно. Отметка: три задания — «5», два — «4», одно — «3».

Подсказка: численные методы

Численный метод

Корень уравнения f(x) = 0 ищут приближённо: считают f в разных точках и сужают место, где лежит корень, до нужной точности.

Смена знака

Непрерывная f разного знака на концах отрезка — на нём есть корень. Проверка: f(a) * f(b) < 0. Одинаковые знаки ничего не гарантируют.

Отделение корней

Перебор с шагом: for x in range(a, b), условие f(x) * f(x + 1) < 0 — на отрезке [x; x + 1] корень. Последний x — это b − 1.

Половинное деление

Пока b − a больше точности: c = (a + b) / 2; если f(a) * f(c) <= 0 — b = c, иначе a = c. Ответ — середина последнего отрезка, ошибка не больше половины точности.

Сколько шагов

Каждый шаг делит отрезок пополам: из длины 1 до 0.001 — 10 шагов, потому что 2¹⁰ = 1024. Перебор с шагом 0.001 — тысяча вычислений.

Вещественные числа

/ всегда даёт вещественное: 10 / 5 это 2.0. Вещественные не сравнивают через ==. Три знака после точки — f"{x:.3f}".

Материалы подготовлены с использованием технологий искусственного интеллекта.