Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа 3

.doc
Скачиваний:
65
Добавлен:
01.05.2014
Размер:
706.56 Кб
Скачать

Федеральное агенство по образованию РФ

СПбГЭТУ «ЛЭТИ»

Кафедра МО-ЭВМ

Факультет КТИ

ОТЧЕТ

по лабораторной работе № 3

Метод бисекции.

Дисциплина: вычислительная мпатематика

Студент группы 4351

Кузьменко А.

Преподаватель:

Щеголева Н.Л.

Санкт-Петербург

2006

Лабораторная работа № 3

Метод бисекции.

1. Постановка задачи.

Найти корень уравнения f(x)=0 для функции f(x)=x4-13x2+36-1/x методом бисекции с заданной точностью Eps, исследовать зависимость числа итераций от точности Eps при изменении Eps от 0.1 до 0.000001, исследовать обусловленность метода (чувствительность к ошибкам в исходных данных).

2. Теоретические сведения.

Если найден отрезок (a, b), такой, что (a)(b)  , то существует точка c, в которой значение функции равно нулю, т. е. (с) = 0, с  (a, b). Метод бисекции состоит в построении последовательности вложенных друг в друга отрезков, на концах которых функция имеет разные знаки. Каждый последующий отрезок получается делением пополам предыдущего. Процесс построения последовательности отрезков позволяет найти нуль функции f(x) (корень уравнения ) с любой заданной точностью.

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

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

3. Текст программ.

double BISECT(double Left,double Right,double Eps,int &N)

{

double E = fabs(Eps)*2.0;

double FLeft = F(Left);

double FRight = F(Right);

double X = (Left+Right)/2.0;

double Y;

if (FLeft*FRight>0.0) {puts("Неверно задан интервал \n");exit(1);}

if (Eps<=0.0) {puts("Неверно задана точность\n");exit(1);}

N=0;

if (FLeft==0.0) return Left;

if (FRight==0.0) return Right;

while ((Right-Left)>=E)

{

X = 0.5*(Right + Left);

Y = F(X);

if (Y == 0.0) return (X);

if (Y*FLeft < 0.0)

Right=X;

else

{ Left=X; FLeft=Y; }

N++;

};

return(X);

}

double Round (double X,double Delta)

{

if(Delta<=1E-9){puts("Неверно задана точность округления\n");exit(1);}

if (X>0.0) return (Delta*(long((X/Delta)+0.5)));

else return (Delta*(long((X/Delta)-0.5)));

}

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include "methods.h"

#include <conio.h>

#include <iostream.h>

double delta;

void main()

{

int k;

long int s;

float eps1,delta1,a1,b1;

double eps,a,b,x;

printf("введите eps:");

scanf("%f",&eps1);

eps = eps1;

printf("введите a:");

scanf("%f",&a1);

a = a1;

printf("введите b:");

scanf("%f",&b1);

b = b1;

printf("введите delta:");

scanf("%f",&delta1);

delta = delta1;

x = BISECT(a,b,eps,k);

printf("x=%f k=%d\n",x,k);

getch();

}

double F(double x)

{

extern double delta;

double s;

if (x==0) {printf ("Деление на 0!"); getch(); exit(1);}

{ s = (pow(x,4))-(13*(x*x))+36-(1/x);

s = Round( s,delta );

return(s);

}

}

4. Вычислительный эксперимент.

Для вычисления простых корней уравнения необходимо сначала их изолировать, то есть определить интервалы, в которых находятся только по одному корню. Уравнение f(x)=x4-13x2+36-1/x имеет 5 корней. График функции:

Таким образом, если изолировать корни уравнения, получим 5 интервалов:

(-3, -2.9), (-2.1, -2), (0.02, 0.03), (1.9, 2), (3, 3.1)

Ниже приведена таблица, в которой отражены результаты работы программы, вычисляющей корни уравнения с определенной точностью методом бисекции. (Здесь x1 – корень из интервала (-3, -2.9), x2 – из (-2.1, -2), x3 – из (0.02 , 0.03). x4 – из (1.9, 2), x5 – из (3, 3.1))

eps

delta

x1

k1

x2

k2

x3

k3

x4

k4

x5

k5

0,1

0,000001

-2,95

0

-2,05

0

0,025

0

1,95

0

3,05

0

0,05

0,000001

-2,95

0

-2,05

0

0,025

0

1,95

0

3,05

0

0,01

0,000001

-2,9875

3

-2,0375

3

0,025

0

1,9875

3

3,0125

3

0,005

0,000001

-2,99375

4

-2,03125

4

0,025

1

1,98125

4

3,00625

4

0,001

0,000001

-2,989062

6

-2,026562

6

0,02875

3

1,976562

6

3,010938

6

0,0005

0,000001

-2,988281

7

-2,025781

7

0,028125

4

1,975781

7

3,010156

7

0,0001

0,000001

-2,988867

9

-2,025195

9

0,027656

6

1,975195

9

3,010742

9

0,00005

0,000001

-2,98877

10

-2,025098

10

0,027734

7

1,975098

10

3,01084

10

0,00001

0,000001

-2,988684

13

-2,025037

13

0,027793

9

1,975012

13

3,010901

13

0,000005

0,000001

-2,988678

14

-2,025043

14

0,027783

10

1,975018

14

3,010907

14

0,000001

0,000001

-2,988673

16

-2,025041

16

0,027784

13

1,97502

16

3,010909

16

Следующая таблица отображает зависимость количества итераций (k) метода бисекций от требуемой точности результата (eps):

eps

delta

a

b

kпракт

kтеор

0,1

0,000001

3

3,1

0

0

0,09

0,000001

3

3,1

0

0,152003093

0,08

0,000001

3

3,1

0

0,321928095

0,07

0,000001

3

3,1

0

0,514573173

0,06

0,000001

3

3,1

0

0,736965594

0,05

0,000001

3

3,1

0

1

0,04

0,000001

3

3,1

1

1,321928095

0,03

0,000001

3

3,1

1

1,736965594

0,02

0,000001

3

3,1

2

2,321928095

0,01

0,000001

3

3,1

3

3,321928095

0,009

0,000001

3

3,1

3

3,473931188

0,008

0,000001

3

3,1

3

3,64385619

0,007

0,000001

3

3,1

3

3,836501268

0,006

0,000001

3

3,1

4

4,058893689

0,005

0,000001

3

3,1

4

4,321928095

0,004

0,000001

3

3,1

4

4,64385619

0,003

0,000001

3

3,1

5

5,058893689

0,002

0,000001

3

3,1

5

5,64385619

0,001

0,000001

3

3,1

6

6,64385619

0,0009

0,000001

3

3,1

6

6,795859283

0,0008

0,000001

3

3,1

6

6,965784285

0,0007

0,000001

3

3,1

7

7,158429363

0,0006

0,000001

3

3,1

7

7,380821784

0,0005

0,000001

3

3,1

7

7,64385619

0,0004

0,000001

3

3,1

7

7,965784285

0,0003

0,000001

3

3,1

8

8,380821784

0,0002

0,000001

3

3,1

8

8,965784285

0,0001

0,000001

3

3,1

9

9,965784285

0,00009

0,000001

3

3,1

10

10,11778738

0,00008

0,000001

3

3,1

10

10,28771238

0,00007

0,000001

3

3,1

10

10,48035746

0,00006

0,000001

3

3,1

10

10,70274988

0,00005

0,000001

3

3,1

10

10,96578428

0,00004

0,000001

3

3,1

11

11,28771238

0,00003

0,000001

3

3,1

11

11,70274988

0,00002

0,000001

3

3,1

12

12,28771238

0,00001

0,000001

3

3,1

13

13,28771238

0,000009

0,000001

3

3,1

13

13,43971547

0,000008

0,000001

3

3,1

13

13,60964047

0,000007

0,000001

3

3,1

13

13,80228555

0,000006

0,000001

3

3,1

14

14,02467797

0,000005

0,000001

3

3,1

14

14,28771238

0,000004

0,000001

3

3,1

14

14,60964047

0,000003

0,000001

3

3,1

15

15,02467797

0,000002

0,000001

3

3,1

15

15,60964047

0,000001

0,000001

3

3,1

16

16,60964047

Также количество итераций зависит от длины интервала, локализующего корень:

eps

delta

a1

b1

|b1-a1|

k1

0,00001

0,000001

3

3,011

0,011

10

0,00001

0,000001

3

3,02

0,02

10

0,00001

0,000001

3

3,05

0,05

12

0,00001

0,000001

3

3,08

0,08

12

0,00001

0,000001

3

3,1

0,1

13

0,00001

0,000001

2,9

3,1

0,2

14

0,00001

0,000001

2,7

3,2

0,5

15

0,00001

0,000001

2,5

3,2

0,7

16

0,00001

0,000001

2,5

3,8

1,3

16

0,00001

0,000001

2,7

4,3

1,6

17

0,00001

0,000001

2,8

4,7

1,9

17

0,00001

0,000001

2,9

5,1

2,2

17

0,00001

0,000001

3

6

3

18

0,00001

0,000001

2,8

7

4,2

18

0,00001

0,000001

2,9

8,5

5,6

19

0,00001

0,000001

3

10

7

19

Следующая таблица содержит результаты нахождения корня уравнения в рамках исследования чувствительности метода к ошибкам во входных данных.

Рассматриваются интервалы разной длины, содержащие корень 1.975021. Так как известна функция, то можно вычислить число обусловленности задачи нахождения простого корня этой функции (1/|f (x0)|, где x0 - корень). Для данных функции и корня =0,04931. В столбце “теоретически” вычисляется отношение eps/delta и выводится “да”, если меньше его и “нет” в обратном случае. В столбце “практически” вычисляется разность найденного значения x и эталона (значения корня с наименьшей погрешностью) и выводится “да”, если это значения меньше заданной точности результата (eps)