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

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

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

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

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

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

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

ОТЧЕТ

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

Метод хорд.

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

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

Кузьменко А.

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

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

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

2006

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

Метод хорд.

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

Найти корень уравнения для функции с заданной точностью Eps методом хорд, исследовать скорость сходимости и обусловленность метода.

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

Пусть найден отрезок (a, b), на котором функция меняет знак. Для определенности примем (a) > 0, (b) < 0. В методе хорд процесс итераций состоит в том, что в качестве приближений к значению корня уравнения принимаются значения c0, c1, . . . , cn точек пересечения хорды с осью абсцисс, как это показано на рис.3.1.

Сначала решается уравнение хорды АВ:

Для нахождения точки пересечения ее с осью абсцисс (x = c0, y = 0) используется уравнение

Далее сравниваются знаки величин (a) и (с0) и для рассматриваемого случая оказывается, что корень находится в интервале (a, c0), так как (a)(с0) < 0. Отрезок (c0, b) отбрасывается. Следующая итерация состоит в определении нового приближения c1 как точки пересечения хорды АВ1 с осью абсцисс и т. д. Итерационный процесс продолжается до тех пор, пока значение (cn) не станет по модулю меньше заданного числа  (см. 3.1).

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

#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("введите delta:");

scanf("%f",&delta1);

delta = delta1;

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

scanf("%f",&eps1);

eps = eps1;

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

scanf("%f",&a1);

a = a1;

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

scanf("%f",&b1);

b = b1;

x = HORDA(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);

}

}

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

{

double FLeft = F(Left);

double FRight = F(Right);

double X,Y;

if (FLeft*FRight>0.0)

{puts("Неверное задание интервала\n");getch();exit(1);}

if (Eps<=0.0)

{puts("Неверное задание точности\n");getch();exit(1);}

N=0;

if (FLeft==0.0) return Left;

if (FRight==0.0) return Right;

do

{

X = Left-(Right-Left)*FLeft/(FRight-FLeft);

Y = F(X);

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

if (Y*FLeft < 0.0)

{ Right=X; FRight=Y; }

else

{ Left=X; FLeft=Y; }

N++;

}

while ( fabs(Y) >= Eps );

return(X);

}

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,987132

1

-2,026237

1

0,027851

16

1,975913

1

3,00971

1

0,05

0,000001

-2,987132

1

-2,026237

1

0,027813

18

1,975913

1

3,00971

1

0,01

0,000001

-2,988648

2

-2,025059

2

0,027793

21

1,975052

2

3,010777

2

0,001

0,000001

-2,988648

2

-2,025059

2

0,027786

26

1,975052

2

3,010894

3

0,0001

0,000001

-2,988672

3

-2,025042

3

0,027786

32

1,975022

3

3,010906

4

0,00001

0,000001

-2,988672

3

-2,025042

3

0,027786

37

1,975021

3

3,010908

5

0,000001

0,000001

-2,988672

3

-2,025042

3

0,027786

43

1,975021

3

3,010908

5

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

eps

x

k

5

0,031426

7

1

0,028397

11

0,5

0,028036

13

0,1

0,027851

16

0,05

0,027813

18

0,01

0,027793

21

0,005

0,027788

23

0,001

0,027786

26

0,0005

0,027786

28

0,0001

0,027786

32

0,00005

0,027786

33

0,00001

0,027786

37

0,000005

0,027786

39

0,000001

0,027786

43

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

a

b

|a-b|

k

3

3,011

0,011

1

3

3,02

0,02

3

3

3,05

0,05

4

3

3,08

0,08

5

3

3,1

0,1

5

2,9

3,2

0,3

9

2,7

3,2

0,5

10

2,5

3,2

0,7

10

2,5

3,4

0,9

15

2,7

3,8

1,1

25

2,8

4,1

1,3

33

2,9

4,4

1,5

41

3

4,7

1,7

42

2,8

4,7

1,9

55

2,5

4,6

2,1

56

2,5

4,8

2,3

65

3

5,5

2,5

70

2,9

5,6

2,7

92

2,7

5,6

2,9

101

2,5

5,6

3,1

107

2,5

5,8

3,3

120

2,7

6,2

3,5

138

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

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

a

b

eps

delta

x

теоретически

практически

1,9

2

1E-08

1E-08

1,975021

eps/delta

обусл

погр f(x)

соотв

1,9

2

0,001

0,1

1,97619

0,01

нет

0,001169

нет

1,5

2,5

0,001

0,1

1,974928

0,01

нет

9,3E-05

да

1

3

0,001

0,1

1,973723

0,01

нет

0,001298

нет

0,1

2

0,001

0,1

1,974297

0,01

нет

0,000724

да

-1

3

0,001

0,1

1,975128

0,01

нет

0,000107

да

-2

3

0,001

0,1

1,976966

0,01

нет

0,001945

нет

1,9

2

0,01

0,25

1,975

0,04

нет

2,1E-05

да

1

3

0,01

0,25

1,978472

0,04

нет

0,003451

да

-2

3

0,01

0,25

1,975246

0,04

нет

0,000225

да

1,9

2

0,001

0,02

1,975012

0,05

да

9E-06

да

1,5

2,5

0,001

0,02

1,975202

0,05

да

0,000181

да

1

3

0,001

0,02

1,975161

0,05

да

0,00014

да

0,1

2

0,001

0,02

1,974992

0,05

да

2,9E-05

да

-1

3

0,001

0,02

1,974615

0,05

да

0,000406

да

-2

3

0,001

0,02

1,975383

0,05

да

0,000362

да

5. Вывод.

Метод хорд является универсальным методом нахождения простых корней уравнений вида f(x)=0, то есть метод дает результат при любых условиях, если локализован искомый корень. При этом при применении метода хорд в ряде случаев количество итераций меньше, чем при применении метода бисекций.

Количество итераций метода хорд зависит от:

1) требуемой точности корня: чем выше точность, тем больше итераций;

2) длины интервала локализации: чем больше интервал, тем больше итераций;

3) от угла наклона касательной к графику в точке x=0: чем круче график, тем больше итераций. То есть число итераций при прочих равных условиях зависит от первой производной функции |f (x0)|, где x0 – корень уравнения f (x)=0.

При нахождении корня методом хорд можно гарантировать соответствие корня требуемой точности, если задача хорошо обусловлена, то есть если eps/delta . При этом, даже если это условие не выполняется (при не очень большом несоответствии), точность корня, найденного методом хорд довольно высока и нередко соответствует требуемой точности.