ЗАДАНИЕ 2
Для нелинейного (алгебраического или трансцендентного) уравнения, приведённого в таблице 5, произвести отделение его корней и уточнить их с помощью разработанных алгоритмов и программ.
Аргументы тригонометрических функций принять в радианах, а урав-нение выбрать в соответствии с последней цифрой шифра зачётной книжки и первой буквой фамилии.
Методические указания к выполнению задания 2
При решении любое нелинейное уравнение, например , пред-варительно приводится к виду , т. е. , при этом функции могут быть алгебраическими, у которых над аргументом х выполняются лишь арифметические операции, и трансцендентными, которые содержат, кроме того, показательные, логарифмические, тригонометрические функции аргумента х. Такие уравнения далеко не всегда можно решить точно, а для практических расчётов точное решение не всегда является обязательным.
Поэтому особое значение с развитием вычислительной техники приобрели способы приближённого вычисления корней и оценки их точности.
Данная процедура состоит из двух этапов: 1) отделение корней, т. е.. выделение таких отрезков [a, b], в каждом из которых находится только один корень уравнения или нахождение первоначальных приближений корней;
2) уточнение корней, т. е.. нахождение их на найденных отрезках с заданной степенью точности.
1. Простейшим способом отделения корней является графический. На графике функции определяются отрезки [a, b], в пределах которых лежат точки пересечения функции с осью 0х, являющимися приближенными значениями корней. Например, при решении уравнения сначала вычисляем значения функции , по заданным значениям аргумен-та х (таблица 6) и затем по полученным данным строим график (рисунок 12).
Как видно из графика, уравнение имеет 3 корня на отрезках [–2, –1],
[–1,0] и [1,2].
Отделить корни можно также программным способом. Для составления алгоритма решения данной задачи рассмотрим поведение функции на интервале от хнач до хкон с шагом h (рисунок 13)
Рисунок 13 График функции при наличии корней
Как видно из рисунка, корни уравнения находятся в точках А, В и С, где . Данные точки можно обнаружить, рассчитывая значения функ-ции от хнач до хкон с шагом h и наблюдая за изменением её знака. Так, в точке А значение функции изменяется с «» на «+», а в точке В с «+» на «» и т. д. Обнаружить изменение знака функции можно путём перемножения двух её значений, вычисленных от аргументов х, находящихся в соседних точках на расстоянии h одно от другого. Для точки А, например, это будут значения функции D и F.
Отделение корней по рассмотренному методу реализует алгоритм, представленный на рисунке 14.
В блоке 2 вводятся начальное значение аргумента функции хнач, конечное хкон и шаг его изменения h.
В блоке 3 принимается текущее значение х за хнач и количество корней
m = 0, а в блоке 4 вычисляется первоначальное значение функции у1 при х = хнач.
Блок 5 организует цикл по изменению х от х + h до хкон с шагом h. В блоке 6 вычисляется очередное значение функции в точке ( ). Затем в блоке 7 проверяется, не пересекла ли функция ось ОХ. В случае отсутствия пересечения полученное значение у в блоке 10 запоми-нается как у1, а в блоке 5 значение х опять изменяется на величину шага h. Затем в блоке 6 снова вычисляется у и в блоке 7 проверяется функция на из-менение знака. Так как в этом случае (точки D и F на рисунок 4), то в блоке 8 выводятся значения аргумента х h и x, в пределах которых нахо-дится корень уравнения, а в блоке 9 фиксируется увеличение количества найденных корней на единицу. Циклический процесс повторяется до приня-того конечного значения аргумента хкон. В результате будут найдены отрезки, на которых находятся корни нелинейного уравнения (около точек А, В, С на рисунок 13).
Программа на языке Basic, реализующая данный алгоритм для уравне-ния , будет следующей:
PRINT Введите Xнач, Xкон, H
INPUT XN, XK, H
X = XN: M = 0
Y1 = X*X*X 3*X 1
FOR X = X + H TO XK STEP H
Y = X*X*X 3*X 1
IF Y*Y1 < 0 THEN GOTO 2 ELSE GOTO 5
2 PRINT “A=”; X H; “B=”; X
M = M + 1
5 Y1= Y
NEXT X
IF M = 0 THEN PRINT “корней нет” ELSE PRINT “корней=”;M
END
Уточнение корня, найденного на отрезке [а, b], осуществляется одним из следующих методов: деления отрезка пополам, хорд (секущих), касатель-ных (Ньютона), итераций. Рассмотрим некоторые из них, например, метод деления отрезка пополам (рисунок 15). Интервал [а, b] делится пополам и в найденной точке (с = (a + b) / 2) вычисляется значение функции y = f (с). Если y е, где е – заданная точность, то C является корнем уравнения, т.к. при полученном C функция y = f (C) меньше точности е. В противном случае вы-бираем один из отрезков - или [а, (а + b) / 2] (рисунок 15 а), или [(а + b) / 2, b] (рисунок 15 б), на концах которого f (x) имеет противоположные знаки.
Выбранный интервал снова делим пополам (с = (a + b) / 2) и вычисляем зна-чение функции y = f (с). Процесс повторяется до тех пор, пока не будет полу-чено значение y е.
Сказанное выше реализуется следующим алгоритмом (рисунок 16), где в блоке 2 вводятся полученные при отделении корней границы интер-вала [а, b] и точность вычисления корня е, а в блоке 3 вычисляется значе-ния функции у1 при х = а. Затем в блоке 4 вычисляется середина интервала [а, b], а в блоке 5 – значение функции в середине данного интервала при
с = (a + b) /2. Если при проверке в блоке 6 оказывается y е, то с – ко-рень уравнения, который выводится в блоке 10. Если же условие y е не выполняется, то в блоке 7 определяется: какую половину отрезка [а, b] ос-тавить для дальнейшего нахождения корня. Если , то левую при-своением b = с (блок 9), а если же нет, то правую присвоением a = с (блок 8) и затем в блоке 4 опять определяется середина нового суженного интер-вала и процесс повторяется до тех пор, пока значение у станет меньше за-данной точности е.
Программа на языке Basic, реализующая данный алгоритм для уравне-ния , будет следующей:
PRINT “Введите A, B, E “
INPUT A, B, E
Y1 = A*A*A 3*A 1
4 С = (A + B)/2
Y = С*С*С 3*С 1
IF ABS(Y) < E GOTO 10
IF Y*Y1< 0 THEN B = С ELSE A = С
GOTO 4
10 PRINT “корень=”; С
END
При уточнении корня методом итераций в уравнении неизвестное вы-ражают через самого себя, т. е.. уравнение приводится к виду . То-гда рассмотренное выше уравнение преобразуем к виду .
Выберем произвольную точку х внутри отрезка [а, b], на котором нахо-дится корень уравнения, и подставим это значение в правую часть преобразо-ванного уравнения, получив соответственно . Затем, приняв х равным полученному ( ), опять проведём вычисления нового xn.
Этот процесс последовательного вычисления значений по формуле будет продолжаться до тех пор, пока разность между вычисленным и пре-дыдущим х по модулю не станет меньше заданной точность е ( ). Рассмотренное выше нахождение корня реализуется следующим алгоритмом (рисунок 17).
Метод итераций применим только в том случае, если вычислительный процесс сходится (т. е. от итерации к итерации абсолютная разность будет уменьшаться. Для этого необходимо провести преобразования исход-ного уравнения к виду так, чтобы выполнялось условие для любого значения х, принадлежащего отрезку [a, b].
Для предотвращения зацикливания в случае расходящегося процесса в схему алгоритма блоком 2 вводится параметр m, обеспечивающий ограни-чение на максимальное число итераций. Количество итераций подсчитыва-ется в блоке 5 и при превышении заданного числа m блок 7 прерывает про-цесс поиска корня. Уточнение корней методом касательных подробно рас-смотрено в [4].