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