2.1. Задача отделения корней. Уточнение корней методом половинного деления (метод дихотомии)

Вобщем случае редко удается точно найти все кор­­­ни в алгебраических уравнениях, а если к то­му же ко­эф­фи­циенты в уравнении даны с по­греш­нос­тью, то во­прос о точном определении корней во­­­­об­ще теряет вся­кий смысл. Однако если пред­по­­­ло­­жить, что задано урав­нение типа (1.15), то тог­­да без огра­ничения об­щ­нос­ти можно ут­вер­ж­дать, чтоF(х) име­ет корни, для ко­то­рых су­щес­т­ву­­ет ок­рест­ность, содержащая толь­ко один прос­­той ко­рень. Та­кой корень иногда на­зы­ва­ют изо­­­­ли­ро­ван­ны­м. В ре­зуль­тате общая задача на­хо­ж­де­ния кор­ней или ну­лей функции бу­­дет состоять из сле­ду­ю­­­щих этапов:

  1. отделения корней, т.е. устано­вле­­ния ин­тер­ва­ла , где содержится один и толь­ко один ко­­рень урав­­нения;

  2. задачи уточнения одним из известных ме­­то­дов най­ден­ного корня xс за­дан­­­ной погрешностьюe.

Предположим теперь, что найден от­ре­зок [а, b] та­­­кой, чтоF(а)F(b)< 0. Тогда, согласно те­­о­ре­ме Боль­ца­но-Коши [Бахвалов, 1973б], внут­ри от­рез­ка [а, b] су­щес­т­ву­ет точкаx, в которойF(x)= 0. Да­­лее не­об­хо­димо убе­дить­ся, что най­ден­­ная точкаxединс­т­вен­ная на от­рез­ке [а, b]. Од­­ним из методов яв­ляется де­ле­ние отрезка на не­сколь­­­ко частей, на­при­­мер на че­ты­ре, и проверка на кон­­цах каждого из от­рез­ков зна­ка функции.

Нули функции на практике вычисляют при­бли­­­жен­­­но несколькими способами. Одним из са­мых рас­­­про­стра­ненных и не очень точных яв­ля­ет­ся гра­фи­­­ческий ме­тод, заключающийся в том, чтоF(х) пред­­­ставляют какF(х)= =j(х)+ y(х), гдеj(х) иy(х) бо­лее простые по срав­нению сF(х) функ­­­ции. Да­лее стро­ят два гра­фи­каy = j(х); y = y(х) и оп­ре­деляют точки их пе­ре­се­че­ния. Этим ме­­тодомвы­год­но решать уравнения вида хn + ах + b = 0 или ах + b + sin(сх)= = 0 и т.п. Но следует пом­нить, что этот метод дает лишь грубое при­бли­жение ре­ше­­ния.

Другим, не менее распространенным яв­­ляется ме­тод про­изводных. Он за­клю­ча­­ет­ся в том, что ищут и при­рав­ни­ва­­ют к нулю про­­изводную функ­ции F'(х). Затем на от­рез­кахрас­смат­ри­вают знакфунк­­­ции F'(х), гдехi - корни урав­не­нияF'(х)= 0. Таким об­­­ра­­­зом, всю чис­ло­вую ось раз­бивают на два ин­тервала и бо­­лее.Этот ме­тод еще называют ме­то­­дом экст­ремумов функ­ции.

Если исследуемая функция представлена по­ли­но­­мом n-й степени, то используют метод удаления кор­­­ней: опре­де­ля­ют один корень, и по теореме Ви­ет­­­та функ­циюF(х) пред­ставляют какF(х)= g(х)(х - х1), гдеx1 - пер­вый най­ден­ный корень, аg(х) - полином сте­пени (n - 1). Для про­вер­ки кратности корняx1 сле­­ду­­ет подставить вg(х),и еслиg(x1)=0, то го­во­рят, чтоx1 являетсякрат­ным корнем, аF(х) за­пи­­сы­ва­ет­­сяF(х)= g(х)(х - x1)2, гдеg(х) - те­перь по­ли­ном сте­­пени (n -2). Следуя этому про­цес­­су, мож­но уда­лить все корни, т.е. пред­ста­вить

.

Чтобы погрешность с каждым шагом не уве­ли­чи­­ва­лась, а очередной корень определялся с вы­со­кой сте­пенью точности, следует уточнение корня де­­лать по F(х), а не поg(х). Это особенно важ­но, когда удалено мно­го (больше по­ло­ви­ны) корней.

Hа практике пред­по­ла­­га­емые корни уточняют раз­­лич­ными спе­ци­аль­ны­­ми вычислительными ме­то­­дами. Од­ним из них можно назвать ме­тод ди­хо­то­­мии (би­­сек­ции, по­ло­вин­ного деления), от­но­ся­щий­ся к ите­­ра­ци­он­ным. Он сос­то­ит в по­стро­е­нии по­­­сле­­до­ва­тель­ности вло­жен­ных от­рез­ков, на кон­­цах ко­то­рыхF(х) имеет разные зна­ки. Каж­дый по­­­сле­­ду­ю­щий от­ре­зок получают де­ле­ни­­ем по­по­лампре­ды­ду­­ще­го. Этот процесс по­стро­е­ния по­­­сле­­до­­ва­тель­нос­ти вло­жен­ных отрезков по­зво­ляет най­­­ти нуль функ­ции (F(х) = 0) с лю­бой за­дан­ной точ­­­ностью.

Опишем подробно один шаг итерации. Пусть на k-м ша­ге найден отрезок [аk , bk],на концах ко­­то­рого F(х) меняет знак. Заметим, что обязательно [аk, bk [а, b].Разделим те­перь отрезок [аk, bk] пополам и вы­де­­лим F(x), гдеx- се­ре­ди­­на [аk , bk]. Здесь воз­мож­­ны два слу­чая: первый, ког­даF(x) = 0, тогда мы го­ворим, что ко­рень найден; вто­рой, ког­даF(x)¹0, тог­да срав­­ниваем знакF(x) сF(аk) иF(bk) и из двух по­­ло­­вин [аk, x] и [x, bk] вы­бираем ту, на концах ко­то­рой функ­ция меняет свойзнак. Та­ким образом,аk = а , bk = x, еслиF(x)F(аk) < 0 , иаk =x , bk = b, ес­лиF(x)F(bk) < 0.

При заданной точности e деление пополам про­­­­­­дол­жа­ют до тех пор, пока длина отрезка не ста­­­­­нет меньше 2e, тогда координата середины по­­след­­­­него най­­­денного от­резка и есть значение кор­­ня тре­бу­е­мой точ­ности.

Метод дихотомии — простой и надежный ме­тод по­­­ис­ка простого корня1уравненияF(х) = 0. Он схо­дит­ся для лю­бых непрерывных функ­­цийF(х), в том чис­ле и не­­диф­фе­рен­ци­ру­е­мых. Недостатки метода:

  1. проблема определения отрезка, на ко­то­ром функ­­ция ме­няет свой знак (как правило, это отдельная вы­чис­ли­тель­ная задача, на­и­бо­лее слож­ная и трудоемкая час­ть ре­ше­ния);

  2. если корней на выделенном отрезке не­сколь­ко, то нельзя заранее сказать, к какому из них сой­­­дет­ся про­цесс;

  3. не применим к корням четной крат­нос­ти;

  4. для корней нечетной, но высокой кратности ме­­­тод неустойчив, дает большие ошибки;

  5. медленно сходится. Для достижения eне­­об­­хо­димо выполнить N итераций2, т.е. для по­лу­че­­ния 3 верных цифр (e = 0.0005) на­до вы­полнить около 10 ите­­раций, ес­ли отрезок имеет единичную длину.

Программа, по которой можно вычислить кор­ни ме­­­­­тодом дихотомии, построена по сле­ду­ю­ще­­му ал­го­рит­му:

  1. Определить входные параметры А, В, ЕРS.

  2. Присвоить: АА;ВВ;КЬ0.

  3. Присвоить: ХА1;Х В1;КЬ К+ 1;Х3Ь (В1+А1)/2.

  4. Если F(Х1)´F(Х3) < 0, то перейти на шаг 5 ина­че на шаг 7.

  5. Присвоить: ВХ3.

  6. Если | А1 -В1| <ЕРS, то перейти на шаг 10 ина­­че на шаг 3.

  7. Если F(Х2)´F(Х3) < 0, то перейти на шаг 8 ина­­­че на шаг 11.

  8. Присвоить: АХ3.

  9. Перейти на шаг 6.

  10. Печать: Х3 - корень уравнения;К- ко­ли­чес­тво ите­­­раций.

  11. | А1 -В1| / 2 - погрешность решения.

  12. Конец программы.

Это наиболее простое решение задачи, но не са­­мое эф­фективное. Эффективность можно по­вы­сить, если:

  1. заменить произведения F(х1F(х3) иF(х2F(х3) на ис­­поль­зование встро­ен­ной функции sign(х, у). В тех вер­си­ях язы­ка, где нет этой встро­­ен­ной функции, мож­но заранее на­­пи­­­сать со­­­от­вет­ст­ву­ю­щую про­це­ду­ру;

  2. определить процедуру-функцию, вы­чис­ля­ю­щуюF(х) толь­­ко один раз;

  3. заменить в операторе цикла медленный оператор (А+В)/2 на более быстрый (А+В)*0.5. Заметим, что имен­­но для этой про­­грам­мы дан­ное усо­вер­шен­ство­ва­­­ние бу­дет не­за­мет­но, хотя в случае боль­ших про­­грамм учет скорости вы­пол­­­нения опе­ра­ций в ма­шине да­ет ощу­­­ти­мый ре­з­­уль­тат.

Формальные параметры процедуры. Входные: a,b(типreal) - определяют длину от­рез­­ка;eps(типre­­al) - оп­ределяет заданную точ­ность вы­числений;it(типin­te­ger) - определяет на­и­боль­­шее раз­ре­шен­ное количество ите­раций (для из­бе­жа­ния за­цик­ли­ва­­­ния про­цесса в слу­чае не­пра­виль­ного опре­де­ле­ния от­рез­ка).Выходные:х(типreal) -в нем со­дер­жит­­ся ис­комый ко­рень срав­не­ния; k (тип integer) - в не­го за­носится количество вы­пол­нен­ных ите­­ра­ций.

Учитывая все замечания, окон­ча­тель­­­­ный ва­риант про­це­­дуры bisect может быть сле­­­ду­ющим:

procedure bisect (a,b,eps :real; it:integer;

var x : real; var k:integer);

var a1, b1: real; x1, x2, x3 : integer;

begin

k := 0;

x1 := sign (func(a));

x2 := sign (func(b));

a1 := a;

b1 := b;

repeat

inc (k);

x := (a1+b1)*0.5;

x3 := sign (func (x));

if x3=0 then exit;

if abs(b1-a1)<(2*eps) then exit;

if (x1=x2) and (x2=x3) then exit;

if x1=x3 then

begin

a1 := x;

x1 := x3;

end

else

begin b1 := x;

x2 := x3;

end;

until k>it;

end.

Перед началом работы программы опре­­­деляют func(x) - процедуру-функцию, по которой вы­чис­ля­­­­ют зна­­­че­нияF(х).Тип функции должен быть ве­­щес­­­твен­ным. Ес­ли в библиотеке стан­дарт­но­го ма­те­­­матического ­обес­­пе­че­­­ния отсутствует про­це­ду­ра-функ­цияsign, то ее сле­дует на­­пи­сать самостоятельно.

Предложенная процедура проверялась напри­­­­­­м­е­рере­ше­ния уравненияx2- 5 sinx= 0.

Графическим методом находился от­ре­зок,на ко­­­­­­то­ром рас­­полагался один из корней дан­ного урав­­­­­­­­нения [1.57; 3.14]; (второй ко­рень три­­­ви­аль­ный,х = 0 на­хо­дит­ся лег­ко). Для того, что­бы най­­­ти корень на отрезке [1.57; 3.14]с ука­­зан­ной точ­нос­тью, полагали ерs = 0.0005.

Результаты проверки работы предлагаемой про­­­­­­­­­цедуры при­водятся в табл. 1.5.

Таблица 1.5

Отрезок

Номер

Левый конец

Правый конец

Центральная точка

итерации

А

sign (А)

В

sign (В)

x

sign (x)

k

1.0

— 1

4.0

+1

2.5000

0

1.000000

— 1

2.500000

+1

1.750000

+1

1

1.750000

— 1

2.500000

+1

2.125000

+1

2

1.750000

— 1

2.125000

+1

1.937500

— 1

3

1.937500

— 1

2.125000

+1

2.031250

— 1

4

2.031250

— 1

2.125000

+1

2.078125

— 1

5

2.078125

— 1

2.125000

+1

2.101563

— 1

6

2.101563

— 1

2.125000

+1

2.089844

+1

7

2.101563

— 1

2.089844

+1

2.083984

+1

8

2.101563

— 1

2.083984

+1

2.086914

— 1

9

2.086914

— 1

2.083984

+1

2.085449

+1

10

Окончаниие таблицы 1.5

Отрезок

Номер

Левый конец

Правый конец

Центральная точка

итерации

А

sign (А)

В

sign (В)

x

sign (x)

k

2.086914

— 1

2.085449

+1

2.086182

— 1

11

2.086182

— 1

2.085449

+1

2.085815

+1

12

2.085815

— 1

2.086182

+1

2.085999

— 1

13

2.085815

— 1

2.085999

+1

2.085907

+1

14

2.085815

— 1

2.085907

+1

2.085953

— 1

15

2.085907

— 1

2.085953

+1

2.085930

+1

16

2.085930

— 1

2.085953

+1

2.085941

— 1

17

РЕШЕНИЕ: Х = 2.085936; F(x) = 0.0000066938; К = 18

2.2. ПРИБЛИЖЕННОЕ РЕШЕНИЕ УРАВНЕНИЯ F(x)= 0

Соседние файлы в папке glava1