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

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

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

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

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

ОТЧЕТ

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

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

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

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

Кузьменко А.

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

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

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

2006

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

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

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

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

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

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

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

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

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))Я(1/x);

s = Round( s,delta );

return(s);

 }

}

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

Для вычисления простых корней уравнения необходимо сначала их изолировать, то есть определить интервалы, в которых находятся только по одному корню. Уравнение  f(x)=x4-13x2Я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