6) Метод простых итераций.
Метод
простых итераций решения уравнения
состоит в замене исходного уравнения
эквивалентным ему уравнением
и построении последовательности
,
сходящейся при n
к точному решению.
Рассмотрим
один шаг итерационного процесса. Исходя
из найденного на предыдущем шаге значения
,
вычисляется
.
Если
,
то принимается xn
= y
и выполняется очередная итерация. Если
же
,
то вычисления заканчиваются и за
приближенное значение корня принимается
величина xn
= y.
Погрешность результата вычислений
зависит от знака производной
при
погрешность определения корня составляет
,
а при
погрешность не превышает .
Здесь q
- число такое, что
на отрезке (a,
b).
Для применения метода простых итераций
определяющее значение имеет выбор
функции
в уравнении
,
эквивалентном исходному. Функцию
необходимо подбирать так, чтобы
.
Это обусловливается тем, что если
на отрезке (a, b),
то последовательные приближения
будут колебаться около корня c,
если же
,
то последовательные приближения будут
сходиться к корню c
монотонно. Следует также помнить, что
скорость сходимости последовательности
{xn}
к корню c функции
тем выше, чем меньше число q.
![]()
![]()
![]()
![]()
З

|
eps |
итерации |
|
0,1 |
2 |
|
0,01 |
5 |
|
0,001 |
9 |
|
0,0001 |
13 |
|
0,00001 |
18 |
|
0,000001 |
22 |
Обусловленность
метода при разном delta
при
.
![]()
|
delta |
|
|
|
|
|
0,1 |
0,8603335890 |
0,9 |
0,039666411 |
0,047011931 |
|
0,01 |
0,8603335890 |
0,86 |
0,000333589 |
0,004701193 |
|
0,001 |
0,8603335890 |
0,86 |
0,000333589 |
0,000470119 |
|
0,0001 |
0,8603335890 |
0,8603 |
3,3589E-05 |
4,70119E-05 |
|
0,00001 |
0,8603335890 |
0,86033 |
3,589E-06 |
4,70119E-06 |
|
0,000001 |
0,8603335890 |
0,860334 |
4,11E-07 |
4,70119E-07 |
3) Сравнительная характеристика методов.
Корень уравнения
,
рассчитанный различными методами
(Eps=0.000001).
|
|
Бисекции |
Хорд |
Ньютона |
Пр. итераций |
|
X |
0.860334 |
0.860334 |
0.860333 |
0.860334 |
Зависимость числа итераций от Eps для различных методов.
|
Eps |
Бисекции |
Хорд |
Ньютона |
Пр. итераций |
|
0.1 |
2 |
1 |
1 |
2 |
|
0.01 |
5 |
1 |
2 |
5 |
|
0.001 |
8 |
2 |
3 |
9 |
|
0.0001 |
12 |
3 |
3 |
13 |
|
0.00001 |
15 |
4 |
3 |
18 |
|
0.000001 |
18 |
5 |
3 |
22 |
3. Текст программы.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
extern double F(double);
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)));
}
//-------------------------------------------------------------------------
//-------------------------- End of module --------------------------------
double c, d;
double F(double x)
{
return tan(x)-(1/x);
}
//------------------------------------------------------------------------
void main()
{
double delta, left, right,eps;
cout<<"\nВведите левую границу: ";
cin>>left;
cout<<"\nВведите правую границу: ";
cin>>right;
cout<<"\nВведите коэффициент точности вычислений: ";
cin>>eps;
cout<<"\nВведите коэффициент точности округления: ";
cin>>delta;
double x;
int k;
x=BISECT(left,right,eps,k);
x=Round(x,delta);
cout<<"\nx= "<<x;
cout<<"\nКоличество шагов при вычислении: "<<k;
}
Выводы: рассчитали корень
уравнения
различными методами. С точностью
Eps=0.000001 x=0.860334
(методы бисекции, хорд и простых итераций),
x=0.860333 (метод Ньютона).
