Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
172
Добавлен:
11.05.2015
Размер:
3.8 Mб
Скачать
      1. 1.2.2. Уточнение корня.

Уточнение корня может быть осуществлено тремя основными методами:

        1. 1.2.2.1 Метод деления отрезка пополам

Он состоит в следующем. Допустим, что мы нашли отрезок [a,b],на котором имеется кореньс уравненияF(x)=0, причем единственный. В качестве начального приближения корняс0берем середину этого отрезка, т.е.с0=(a+b)/2.Далее исследуем значения функцииF(x)на концах отрезков[a,c0]и[c0,b],т.е. в точкахa,c0,b.Тот из них, на концах которого функция принимает значения разных знаков, содержит искомый корень; поэтому его принимаем в качестве нового отрезка. Вторую половину отрезка[a,b],на котором знак функции не меняется, отбрасываем.

Пусть для определенности F(a)<0, F(b)>0(см.рис.3). В рассматриваемом случаеF(с0)<0, поэтому далее рассматриваем отрезок[c0,b].Следующее приближение:с1=(с0+b)/2. Далее отбрасываем отрезок[c1,b], посколькуF(c1)>0 иF(b)>0. Аналогично находим другие приближения:с2=(с01)/2и т.д.

Процесс уточнения корня продолжаем до тех пор, пока значение функции F(x)в найденной точке не станет меньшим по модулю некоторого заданного числаE,т.е.|F(cn)|<E. Можно также оценивать длину полученного отрезка: если она становится меньше допустимой погрешности, то счет прекращается.

y

F(b)

y=F(x)

a c0 c2 b

x

c1

F(a)

Рис 3. Метод деления отрезка пополам

Этот итерационный процесс продолжается до тех пор, пока не будет достигнута требуемая точность; например

| f (cn) | < или | cn-1 cn | <

Недостаток метода – медленная сходимость. Для достижения требуемой точности необходимо совершить N итераций :

N log 2 ((b—a)/)

Это означает, что для получения каждых трех верных значащих цифр необходимо совершить около 10 итераций.

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

Ниже представлена блок-схема алгоритма уточнения корня методом деления отрезка пополам. Здесь сужение отрезка производится путем замены границы aилиbна текущее значение корняc.

начало

ввод a,b,E

c:=(a + b)/2

Нет Да

a := c F(a)•F(c)<0 b := c

Нет Да

| F(c)|>E

вывод

c, F(c) конец

Рис. 4. Блок-схема метода деления отрезка пополам

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

Пример 1.1

Найти решения уравнения cos(x)– x2=0 на отрезке [-π/2,π/2]

// отделение корня и метод бисекций

#include <iostream>

#include <math>

float f(float x);

float kor(float a, float b, float e);

main()

{ float a,b,h,e,x1,x2,y1,y2,x; int k=0;

cout<<"\n вводи a,b,h,e "; cin>>a>>b>>h>>e;

x1=a;

m1: x2=x1+h; y1=f(x1);

if (x2<b) { y2=f(x2);

if (y1*y2<0) {x=kor(x1,x2,e); k++; cout<<"\n x["<<k<<"]="<<x;

cout<<" f(x)="<<f(x);}

x1=x2; } else goto mm1;

goto m1;

mm1: return 0;}

//функция – левая часть уравнения

float f(float x)

{ float fun=cos(x)-x*x; return fun;}

// функция, реализующая метод бисекций

float kor(float a, float b, float e)

{ float c;

m2: c=(a+b)/2; if (f(a)*f(c)<0) b=c; else a=c;

if (fabs(f(c))>e) goto m2; return c; }

В результате на заданном отрезке при h=0.1, E=0.00001 получим результаты: