Министерство образования и науки РФ
Санкт-Петербургский государственный электротехнический университет
“ЛЭТИ”
кафедра МОЭВМ
Лабораторная работа №6 по дисциплине вычислительная математика
на тему:
«Метод простых итераций».
г. Санкт-Петербург
-
Год
I. Цель работы:
Найти корень уравнения для функции методом простых итераций с заданной точностью Eps, исследовать скорость сходимости и обусловленности метода.
II. Общие сведения:
Метод простых итераций решения уравнения состоит в замене исходного уравнения эквивалентным ему уравнением x=(x) и построении последовательности xn+1=(xn), сходящейся при n к точному решению.
Рассмотрим один шаг итерационного процесса. Исходя из найденного на предыдущем шаге значения xn-1, вычисляется y= (xn-1). Если , то полагается xn=y и выполняется очередная итерация. Если же , то вычисления заканчиваются и за приближенное значение корня принимается величина xn=y. Погрешность результата вычислений зависит от знака производной : при >0 погрешность определения корня составляет qq, а при <0 погрешность не превышает . Здесь q- число, такое, что q на отрезке [a,b]. Существование числа q является условием сходимости метода в соответствии с отмеченной выше теоремой.
Для применения метода простых итераций определяющее значение имеет выбор функции в уравнении , эквивалентном исходному. Функцию необходимо подбирать так, чтобы q. Это обусловливается тем, что если <0 на отрезке [a,b], то последовательные приближения xn=(xn-1) будут колебаться около корня c, если же >0, то последовательные приближения будут сходиться к корню монотонно. Следует также помнить, что скорость сходимости последовательности {xn} к корню c функции тем выше, чем выше число q.
III. Порядок выполнения работы:
-
Графически или аналитически отделить корень уравнения .
-
Преобразовать уравнение к виду так, чтобы в некоторой окрестности [Left, Right] корня производная удовлетворяла условию q. При этом следует иметь в виду, что чем меньше величина q, тем быстрее последовательные приближения сходятся к корню.
-
Выбрать начальное приближение, лежащее на [Left, Right].
-
Составить подпрограмму для вычисления значений , , предусмотрев округление вычисленных значений с точностью Delta.
-
Составить головную программу, вычисляющую корень уравнения и содержащую обращение к программам , и ITER и индикацию результатов.
-
Провести вычисления по программе. Исследовать скорость сходимости и обусловленность метода.
IV. Выполнение работы:
-
Отделим графическим методом корни уравнения , т.е. найдем отрезки
= ,
тогда Eps ≤ Delta / |1/(3x2-3+2e-x) |.
Теперь графически определим отрезок [Left, Right].
Где .
Проанализировав результаты, мы получаем отрезок [1, 2].
Теперь определим максимальное и минимальное значение на отрезке [1, 2].
x |
f'(x) |
1 |
0,735759 |
1,1 |
1,295742 |
1,2 |
1,922388 |
1,3 |
2,615064 |
1,4 |
3,373194 |
1,5 |
4,196260 |
1,6 |
5,083793 |
1,7 |
6,035367 |
1,8 |
7,050598 |
1,9 |
8,129137 |
2 |
9,270671 |
Как видно из таблицы M=9,270671, m=0.735759. Тогда мы можем вычислить следующие параметры:
αопт = 2/(m+M) = 2 / (9.270671 + 0.735759) =0.199871
q = (M-m) / (M+m) = (9.270671 – 0.735759) / (9.270671 + 0.735759) = 8.534912 / 10.00643 =
= 0.852943
φ (x) = x – α* f(x) = x – 0.199871*(x3 – 3x – 2e(-x))
φ’(x) = 1 – α * f’(x) = 1 – 0.199871*(3x2 – 3 + 2e(-x))
2)Составим подпрограмму вычисления функции и производной этой функции
double F(double x)
{
extern double delta;
double s;
long int S;
s = x-0.199871*(x*x*x-3*x-2*exp(-x));
if( s/delta < 0 )
S = s/delta - .5;
else
S = s/delta + .5;
s = S*delta;
s = Round( s,delta );
return(s);
}
double F1(double x)
{
extern double delta;
double s;
long int S;
s = 1-0.199871*(3*x*x-3+2*exp(-x));
if( s/delta < 0 )
S = s/delta - .5;
else
S = s/delta + .5;
s = S*delta;
s = Round( s,delta );
return(s);
}
3)Составляем головную программу, вычисляющую корень уравнения с заданной точностью Eps и содержащую обращение к подпрограмме f(x), программам-функциям ITER, Round и представление результатов.
void main()
{
clrscr();
int k;
long int s;
float x11,eps1,delta1;
double x1,eps,x;
double F(double);
cout<<"f(x) = x*x*x - 3*x - 2*e(deg(-x))\n\n";
printf("Input eps: ");
scanf("%f",&eps1);
eps = eps1;
printf("Input x1: ");
scanf("%f",&x11);
x1 = x11;
printf("Input delta: ");
scanf("%f",&delta1);
delta = delta1;
x = ITER(x1,eps,k);
printf("x=%f k=%d\n",x,k);
getch();
}
4) Проведем вычисления по программе, варьируя значения параметров Eps (точность вычисления корня) и Delta (точность задания исходных данных).
eps |
delta |
a |
b |
x1 |
x* |
k |
f(x*) |
f'(x) |
|
φ'(x) |
|
0,000001 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,141832 |
-0,40921 |
|
0,00001 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,141832 |
-0,40921 |
|
0,0001 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,141832 |
-0,40921 |
|
0,001 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,141832 |
-0,40921 |
|
0,01 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,141832 |
-0,40921 |
|
0,1 |
0,1 |
1 |
2 |
1,5 |
1,800000 |
2 |
0,101402224 |
7,0505978 |
0,114679 |
-0,74288 |
|
0,000001 |
0,01 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,00001 |
0,01 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,0001 |
0,01 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,001 |
0,01 |
1 |
2 |
1,5 |
|
|
|
-1 |
0,375555 |
1,532201 |
|
0,01 |
0,01 |
1 |
2 |
1,5 |
1,780000 |
2 |
-0,037524295 |
6,8424763 |
0,146146 |
-0,36761 |
|
0,1 |
0,01 |
1 |
2 |
1,5 |
1,780000 |
2 |
-0,037524295 |
6,8424763 |
0,117575 |
-0,69994 |
|
0,000001 |
0,001 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,00001 |
0,001 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,0001 |
0,001 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,001 |
0,001 |
1 |
2 |
1,5 |
|
|
|
-1 |
0,375842 |
1,531796 |
|
0,01 |
0,001 |
1 |
2 |
1,5 |
1,774000 |
2 |
-0,078393211 |
6,780534 |
0,147481 |
-0,35523 |
|
0,1 |
0,001 |
1 |
2 |
1,5 |
1,774000 |
2 |
-0,078393211 |
6,780534 |
0,118466 |
-0,68716 |
|
0,000001 |
0,0001 |
1 |
2 |
1,5 |
|
|
|
-1 |
1 |
1,199871 |
|
0,00001 |
0,0001 |
1 |
2 |
1,5 |
|
|
|
-1 |
0,375299 |
1,532564 |
|
0,0001 |
0,0001 |
1 |
2 |
1,5 |
1,785400 |
8 |
-0,000423959 |
6,8984194 |
0,144966 |
-0,37875 |
|
0,001 |
0,0001 |
1 |
2 |
1,5 |
1,786100 |
5 |
0,004407477 |
6,9056848 |
0,144721 |
-0,38108 |
|
0,01 |
0,0001 |
1 |
2 |
1,5 |
1,773800 |
2 |
-0,079749112 |
6,7784732 |
0,147526 |
-0,35482 |
|
0,1 |
0,0001 |
1 |
2 |
1,5 |
1,773800 |
2 |
-0,079749112 |
6,7784732 |
0,147612 |
-0,35403 |
|
0,000001 |
0,00001 |
1 |
2 |
1,5 |
1,785460 |
11 |
-1,00355E-05 |
6,899042 |
0,144948 |
-0,37892 |
|
0,00001 |
0,00001 |
1 |
2 |
1,5 |
1,785470 |
9 |
5,89554E-05 |
6,8991458 |
0,144946 |
-0,37893 |
|
0,0001 |
0,00001 |
1 |
2 |
1,5 |
1,785550 |
7 |
0,00061092 |
6,899976 |
0,144932 |
-0,37907 |
|
0,001 |
0,00001 |
1 |
2 |
1,5 |
1,786080 |
5 |
0,004269365 |
6,9054772 |
0,144726 |
-0,38103 |
|
0,01 |
0,00001 |
1 |
2 |
1,5 |
1,773780 |
2 |
-0,07988468 |
6,7782672 |
0,14753 |
-0,35478 |
|
0,1 |
0,00001 |
1 |
2 |
1,5 |
1,773780 |
2 |
-0,07988468 |
6,7782672 |
0,147616 |
-0,35399 |
|
0,000001 |
0,000001 |
1 |
2 |
1,5 |
1,785461 |
12 |
-3,13644E-06 |
6,8990524 |
0,144947 |
-0,37892 |
|
0,00001 |
0,000001 |
1 |
2 |
1,5 |
1,785457 |
10 |
-3,07326E-05 |
6,8990109 |
0,144949 |
-0,37891 |
|
0,0001 |
0,000001 |
1 |
2 |
1,5 |
1,785551 |
7 |
0,00061782 |
6,8999864 |
0,144932 |
-0,37907 |
|
0,001 |
0,000001 |
1 |
2 |
1,5 |
1,786081 |
5 |
0,004276271 |
6,9054876 |
0,144725 |
-0,38104 |
|
0,01 |
0,000001 |
1 |
2 |
1,5 |
1,773777 |
2 |
-0,079905014 |
6,7782362 |
0,147531 |
-0,35477 |
|
0,1 |
0,000001 |
1 |
2 |
1,5 |
1,773777 |
2 |
-0,079905014 |
6,7782362 |
0,155307 |
-0,28694 |
5) Из полученных результатов видно, что, чем более высокая точность выходных данных нам необходима, тем больше нам необходимо сделать итераций. Кроме того, из таблицы видно, что с ростом ошибок в исходных данных, уменьшается точность выходных данных. Таким образом, теоретические результаты совпадают с экспериментальными данными.