"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Решение уравнений на компьютере часто сводится к поиску такого значения x, при котором функция f(x) обращается в ноль. Для многих уравнений точной формулы нет, поэтому применяют численные методы: вычисляют значения функции и постепенно приближаются к корню. Один из простых и надёжных способов — метод половинного деления. Он сохраняет отрезок, где функция меняет знак, и на каждом шаге уменьшает его длину вдвое.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Уравнение f(x) = 0 — условие, которому должны удовлетворять искомые значения x. Многие уравнения можно привести к такому виду, перенеся все слагаемые в одну часть. Это позволяет рассматривать разные задачи единым способом: искать, где функция обращается в ноль.
Корень уравнения — значение переменной, при котором уравнение выполняется, то есть f(x) = 0. Например, для уравнения x² − 2 = 0 корнем является число √2. Понятие корня помогает точно сформулировать цель вычислений, даже если получить его в виде формулы не удаётся.
Численный метод — способ находить приближённое решение уравнения с помощью последовательных вычислений. Вместо вывода точной формулы метод задаёт понятные шаги, которые можно повторять вручную или поручить компьютеру. Такой подход нужен, когда вычислить функцию можно, а выразить её корень точно нельзя.
Точность решения — допустимая погрешность приближённого корня; её обычно задают заранее. Например, точность 0,1 означает, что требуется приблизиться к корню с погрешностью не больше установленного допуска. Выбор точности помогает определить, когда вычисления пора остановить.
Компьютер обычно ищет корень приближённо, потому что у многих уравнений нет удобной точной формулы. Даже если формула существует, она может быть слишком сложной для практического вычисления. Зато компьютер может много раз подставлять числа в функцию и быстро вычислять результат. Поэтому задачу часто заменяют последовательностью вычислений, которая постепенно уточняет ответ.
Чтобы начать поиск методом половинного деления, выбирают отрезок [a; b] и проверяют значения функции на его концах. Если f(a) и f(b) имеют разные знаки, график непрерывной функции между концами должен пересечь уровень нуля. Это следует из того, что непрерывная функция не может перейти от отрицательного значения к положительному, не приняв значение 0. Разные знаки указывают на наличие корня, но сами по себе не доказывают, что он единственный.
Затем находят середину отрезка: c = (a + b) / 2, и вычисляют f(c). Если результат равен нулю, корень найден точно; в остальных случаях сравнивают знаки значений на концах двух половин. Оставляют ту половину, на концах которой знаки различаются. Так корень сохраняется в выбранном отрезке, а ненужная часть поиска отбрасывается.
Повторение деления пополам приближает ответ, потому что каждый раз сокращает отрезок, содержащий корень. После одного шага его длина вдвое меньше исходной, после двух — в четыре раза, после n шагов — в 2ⁿ раз. Середина короткого отрезка близка к каждому его концу, а значит, и к находящемуся внутри корню. Чем меньше оставшаяся длина, тем точнее можно определить положение корня.
В программе задают функцию, границы отрезка и требуемую точность ε, а затем организуют повторение шагов в цикле. На каждой итерации вычисляют середину и обновляют одну из границ, сохраняя смену знака. Цикл завершают, когда длина отрезка стала не больше ε; приближённым ответом можно взять его середину. Перед началом полезно проверить границы, а также отдельно обработать случай, когда на конце уже получен ноль.
| Этап или проверка | Что вычислить или проверить | Действие |
|---|---|---|
| Начальные границы отрезка | Задать a и b так, чтобы a < b | Указать отрезок поиска и вычислить его длину b − a |
| Знаки функции на концах | Найти f(a) и f(b) | При разных знаках продолжить; если знак на конце нулевой, принять его за корень |
| Середина отрезка | Вычислить c = (a + b) / 2 и f(c) | Проверить, равен ли результат нулю, и определить знаки половин |
| Выбор новой границы | Сравнить знаки функции на концах половин | Оставить половину со сменой знака, заменив a или b на c |
| Условие остановки | Проверить, стала ли длина b − a не больше ε | Если условие не выполнено, повторить деление; если выполнено, завершить цикл |
| Приближённый ответ | Найти середину оставшегося отрезка | Сообщить полученное значение вместе с заданной точностью |
Таблица описывает один полный проход метода: от задания границ до проверки остановки. При переходе к следующему проходу сохраняйте именно ту половину, где значения функции имеют разные знаки. До запуска вычислений проверьте начальный отрезок и задайте ε.
Нужно найти число, квадрат которого равен 2, не используя его точную запись как ответ. Проверим знаки на концах, а затем последовательно сократим отрезок. Для остановки будем требовать, чтобы его длина стала не больше 0,1.
Вычислим значения на границах: f(1) = 1² − 2 = −1, f(2) = 2² − 2 = 2. Знаки разные, значит, непрерывная функция имеет корень внутри. Середина равна 1,5, а f(1,5) = 0,25, поэтому оставляем [1; 1,5].
Середина отрезка [1; 1,5] равна 1,25, при этом f(1,25) = −0,4375. Отрицательное значение означает, что смена знака теперь на [1,25; 1,5]. Его середина 1,375 даёт f(1,375) = −0,109375, поэтому сохраняем [1,375; 1,5].
Проверим условие остановки: длина отрезка пока 0,125, что больше 0,1. После следующего деления середина равна 1,4375, и f(1,4375) > 0, поэтому остаётся [1,375; 1,4375]. Длина этого отрезка 0,0625, значит, можно остановиться и взять середину 1,40625.
Ответ: корень приближённо равен 1,40625, точность по длине оставшегося отрезка не хуже 0,1. Само значение √2 примерно равно 1,414, что согласуется с найденным приближением. Последняя проверка показывает, что требуемая точность достигнута.
Представим левую часть как функцию f(x) = x³ − x − 1. На концах отрезка получаем f(1) = −1 и f(2) = 5, то есть знаки различаются. Поэтому для непрерывной функции на этом отрезке есть корень, и можно применять половинное деление.
Зададим границы a = 1 и b = 2, а также выбранную точность ε. Пока b − a больше ε, будем вычислять середину c = (a + b) / 2. Это условие задаёт количество вычислений автоматически: цикл продолжится, пока отрезок не станет достаточно коротким.
Найдём f(c). Если f(c) = 0, можно сразу завершить работу с точным корнем. Если f(a) и f(c) имеют разные знаки, положим b = c; иначе положим a = c. В обоих случаях сохраняется половина, содержащая корень при непрерывности функции.
Когда b − a станет не больше ε, вычислим (a + b) / 2 и выведем это число как приближённый корень. Перед циклом нужно проверить, что начальные значения имеют разные знаки или один из концов уже является корнем. Иначе условия для выбранного метода не выполнены.
Ответ: алгоритм состоит из проверки начального отрезка, цикла с вычислением середины и обновлением одной границы, а затем вывода середины оставшегося отрезка. Значение ε определяет, насколько длинным будет цикл. Например, меньшая ε потребует больше повторений.
Программа должна получить от пользователя границы a и b и точность ε, а вычисление f(x) удобно оформить отдельной функцией. Так одну и ту же процедуру поиска можно использовать с разными уравнениями, заменяя только правило вычисления f. Рассмотрим общий алгоритм, не привязанный к конкретной функции.
Сначала проверим, что a < b, а ε > 0, и вычислим f(a), f(b). Если значение на границе равно нулю, выведем эту границу как корень. Если ненулевые значения одного знака, сообщим, что отрезок не подходит для метода, вместо того чтобы запускать цикл.
Пока b − a > ε, вычисляем c = (a + b) / 2 и f(c). Если середина оказалась корнем, заканчиваем поиск. Иначе сравниваем знаки f(a) и f(c): при их различии заменяем b на c, а в другом случае заменяем a на c.
После завершения цикла выводим середину оставшегося отрезка и сообщаем заданную точность. На каждом шаге меняется граница, поэтому длина отрезка уменьшается и цикл в конечном счёте завершается. Если функцию нельзя вычислить в какой-либо точке отрезка, это также следует проверить и обработать.
Ответ: основа программы — отдельное вычисление функции, проверка начального отрезка и цикл с условием b − a > ε. В результате программа сообщает приближённое значение корня. Такая организация не даёт начать поиск без нужной проверки и делает условие завершения явным.
Ошибка — выбирать половину только потому, что значение функции в её середине ближе к нулю. Это не подтверждает, что корень остался именно там: можно случайно отбросить нужный отрезок. Сравнивайте знаки на концах обеих половин и сохраняйте ту, где они различаются.
Смена знака иногда воспринимается как доказательство единственного корня. На самом деле для непрерывной функции она гарантирует хотя бы один корень, но между концами могут находиться и другие. Проверить единственность одной только сменой знака нельзя; не делайте вывод о количестве корней без дополнительных сведений.
Если в цикле не обновлять границу, отрезок останется прежним и программа может зациклиться. Слишком слабое условие остановки, наоборот, способно завершить вычисления до достижения нужной точности. Проверьте, что после каждой итерации длина уменьшается, а цикл заканчивается при b − a ≤ ε.
Точность корня не следует путать с тем, насколько мало значение функции в найденной точке. В методе половинного деления обычно контролируют длину отрезка, который содержит корень. Если проверять только f(x), можно ошибочно решить, что погрешность самого x уже мала. Убедитесь, что условие остановки соответствует заданному допуску на решение.
Для метода нужны навыки вычисления значений функции, сравнения чисел и работы с отрезками. В программе также потребуется уметь организовывать цикл и обновлять значения переменных. Эти умения позволяют не только выполнить отдельный расчёт, но и построить алгоритм, который повторяет его до достижения нужной точности.
Методы приближённых вычислений используют в задачах моделирования и при вычислении величин, для которых нет простой формулы. Метод половинного деления показывает общий принцип: заменить трудное точное решение последовательностью проверяемых шагов. Похожие вычислительные идеи встречаются в других задачах, где результат уточняют постепенно.
Почему компьютер не может просто решить любое уравнение точной формулой?
Для многих уравнений нельзя выразить корень через привычные арифметические действия и функции. Компьютер может вычислять значения функции и с заданной точностью приближаться к корню численным методом.
Как понять, что на выбранном отрезке есть корень?
Проверьте значения функции на концах отрезка: если они разных знаков, непрерывная функция хотя бы один раз проходит через ноль. Это не означает, что корень обязательно один.
Почему при делении отрезка пополам корень не теряется?
Вычисляют функцию в середине и оставляют ту половину, на концах которой значения имеют разные знаки. При непрерывности функции в этой половине остаётся корень.
Как определить, сколько шагов вычислений нужно выполнить?
После каждого шага длина отрезка уменьшается вдвое. Чтобы получить длину не больше ε, достаточно выбрать n так, чтобы исходная длина отрезка, делённая на 2ⁿ, была не больше ε.
Что делать, если значения функции на концах отрезка одного знака?
Метод половинного деления нельзя запускать на этом отрезке: наличие корня таким способом не подтверждено. Проверьте другие границы или выберите иной метод; корень внутри всё же возможен, например если функция пересекает ноль чётное число раз.
§ 70. Решение уравнений