Имея экспериментальное значение скорость сходимости метода видим, что скорость сходимости метода хорд линейна. Действительно, согласно
неравенству | − | < | |
− | |
порядок сходимости метода равен 1, т.е. |
||
|
|
−1 |
|
|
линеен. |
|
|
|
|
Теперь, имея приближение корня, примем ≈ 0.867084. С помощью |
||||
данного приближения |
вычислим |
= | − |, и оценим с |
его помощью |
|
чувствительность метода к ошибкам в исходных данных. При |
≤ будем |
|||
считать, что задача хорошо обусловлена – хор., иначе пл. – плохо. Результаты эксперимента занесены в табл. 2.
Выводы.
Проанализировав результаты применения метода простых итераций,
можно сказать, что при расчете данной функции он дает очень хорошие результаты, и сходится за приемлемое число итераций, которое соответствует теоретическому значению порядка.
По результатам эксперимента по определению обусловленности метода простых итераций можно оценить абсолютную обусловленность как значение в диапазоне (0.1; 1], что говорит о хорошей обусловленности метода. Из недостатков метода можно выделить дополнительные ограничения на начальные условия, в частности необходимость подбора функции ( ), соответствующую этим ограничениям.
6
Таблица 2 – Обусловленность метода при различных и
Значение |
Значение |
|
|
Значение |
Значение |
Значение |
|
|
|
Значение |
|
k |
|
≥ |
|
|
|
||||||
|
|
|
|
|
|
|
|
0.1 |
0.01 |
0.85 |
|
2 |
0.017084 |
хор. |
|
|
|
|
|
|
|
|
|
0.01 |
0.01 |
0.87 |
|
3 |
0.002916 |
хор. |
|
|
|
|
|
|
|
|
|
0.001 |
0.01 |
0.87 |
|
3 |
0.002916 |
пл. |
|
|
|
|
|
|
|
|
|
0.0001 |
0.01 |
0.87 |
|
3 |
0.002916 |
пл. |
|
|
|
|
|
|
|
|
|
0.00001 |
0.01 |
0.87 |
|
3 |
0.002916 |
пл. |
|
|
|
|
|
|
|
|
|
0.000001 |
0.01 |
0.87 |
|
3 |
0.002916 |
пл. |
|
|
|
|
|
|
|
|
|
0.1 |
0.001 |
0.853 |
|
2 |
0.014084 |
хор. |
|
|
|
|
|
|
|
|
|
0.01 |
0.001 |
0.867 |
|
3 |
0.000084 |
хор. |
|
|
|
|
|
|
|
|
|
0.001 |
0.001 |
0.867 |
|
3 |
0.000084 |
хор. |
|
|
|
|
|
|
|
|
|
0.0001 |
0.001 |
0.867 |
|
3 |
0.000084 |
хор. |
|
|
|
|
|
|
|
|
|
0.00001 |
0.001 |
0.867 |
|
3 |
0.000084 |
пл. |
|
|
|
|
|
|
|
|
|
0.000001 |
0.001 |
0.867 |
|
3 |
0.000084 |
пл. |
|
|
|
|
|
|
|
|
|
0.1 |
0.0001 |
0.8526 |
|
2 |
0.014484 |
хор. |
|
|
|
|
|
|
|
|
|
0.01 |
0.0001 |
0.8671 |
|
3 |
0.000016 |
хор. |
|
|
|
|
|
|
|
|
|
0.001 |
0.0001 |
0.8671 |
|
3 |
0.000016 |
хор. |
|
|
|
|
|
|
|
|
|
0.0001 |
0.0001 |
0.8671 |
|
3 |
0.000016 |
хор. |
|
|
|
|
|
|
|
|
|
0.00001 |
0.0001 |
0.8671 |
|
3 |
0.000016 |
пл. |
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <iostream> #include <conio.h>
double delta;
#ifndef __NEWTON #define __NEWTON #endif
#ifndef __ITER #define __ITER #endif
#ifndef M_PI
#define M_PI 3.14159265358979323846 #endif // !M_PI
#ifndef FF(x)
#define FF(x) ( (M_PI * pow(x, M_PI + 7) + 2 * M_PI*pow(x, M_PI + 3) + M_PI * pow(x, M_PI - 1) + 4 * pow(x, 3)) / (pow(x, 8) + 2 * pow(x, 4) + 1) )
#define FFF(x) ( (PI2*pow(x, M_PI + 10) - M_PI * pow(x, M_PI + 10) + 3 * PI2*pow(x, M_PI + 6) - 3 * M_PI*pow(x, M_PI + 6) + 3 * PI2*pow(x, M_PI + 2) - 3 * M_PI*pow(x, M_PI + 2) - 20 * pow(x, 6) + PI2 * pow(x, M_PI - 2) - M_PI*pow(x,M_PI-2) + 12 * pow(x, 2)) / (pow(x, 12) + 3 * pow(x, 8) + 3 * pow(x, 4) + 1) )
#endif
extern double F(double); /******************************************************************/
/* Функция F(X) , задаваемая пользователем */
/******************************************************************/
#ifdef __NEWTON
extern double F1(double); /******************************************************************/
/* Производная функции F(X) , задаваемая пользователем */
/******************************************************************/
#endif
8
#ifdef __ITER
extern double PHI(double); /******************************************************************/
/* |
Функция PHI(X) , задаваемая пользователем |
*/ |
/* |
Данная функция используется в методе |
*/ |
/* |
простых итераций |
*/ |
/******************************************************************/
#endif
double Round(double, double); /******************************************************************/
/* |
Функция Round (X, |
Delta) , предназначена для округления |
*/ |
/* |
X |
с точностью Delta |
*/ |
/******************************************************************/
double BISECT(double, double, double, int&); /******************************************************************/
/* |
Функция |
BISECT предназначена для решения уравнения F(X)=0 |
*/ |
/* |
методом |
деления отрезка пополам. Использованы обозначения: |
*/ |
/* |
Left - левый конец промежутка |
*/ |
|
/* |
Right |
- правый конец промежутка |
*/ |
/* |
Eps - |
погрешность вычисления корня уравнения; |
*/ |
/* |
N - число итераций |
*/ |
|
/******************************************************************/
double ITER(double, double, int&); /******************************************************************/
/* |
Функция |
ITER предназначена для решения уравнения F(X)=X |
*/ |
|
/* |
методом простой итерации. Использованы обозначения: |
*/ |
||
/* |
X0 - начальное приближение корня |
*/ |
||
/* |
Eps |
- |
погрешность вычисления корня уравнения; |
*/ |
/* |
N - |
число итераций |
*/ |
|
/******************************************************************/
double HORDA(double, double, double, int&); /******************************************************************/
/* |
Функция |
HORDA предназначена для решения уравнения F(x)=0 |
*/ |
/* |
методом хорд. Использованы обозначения: |
*/ |
|
/* |
Left - левый конец промежутка |
*/ |
|
/* |
Right |
- правый конец промежутка |
*/ |
/* |
Eps - |
погрешность вычисления корня уравнения; |
*/ |
/* |
N - число итераций |
*/ |
|
/******************************************************************/
9
double NEWTON(double, double, int&); /******************************************************************/
/* |
Функция |
NEWTON предназначена для решения уравнения F(X)=0 |
*/ |
|
/* |
|
методом касательных. Использованы обозначения: |
*/ |
|
/* |
X |
- |
начальное приближение корня |
*/ |
/* |
Eps |
- погрешность вычисления корня уравнения; |
*/ |
|
/* |
N |
- |
число итераций |
*/ |
/******************************************************************/
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);
}
}
double F(double x) {
// функция f(x)
extern double delta; double s;
long S;
s = pow(x, M_PI) - 1/(pow(x,4)+1);
s = Round(s, delta);
return s;
}
double F1(double x) {
// функция f'(x)
double f = (M_PI * pow(x, M_PI + 7) + 2 * M_PI*pow(x, M_PI + 3) + M_PI * pow(x, M_PI - 1) + 4 * pow(x, 3)) / (pow(x, 8) + 2 * pow(x, 4) + 1);
return f;
}
double PHI(double x) {
10