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