Лабораторная работа 3
.docФедеральное агенство по образованию РФ
СПбГЭТУ «ЛЭТИ»
Кафедра МО-ЭВМ
Факультет КТИ
ОТЧЕТ
по лабораторной работе № 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)