2.2. Метод простих ітерацій
Для уточнення кореня методом простих ітерацій необхідно задане нелінійне рівняння перетворити до рівносильного рівняння
де
– ітеруюча
функція.
Послідовні наближення обчислюються за ітераційною формулою
,
(2)
Числовий
есперимент 1.
Для
рівняння
ітеруюча функція може бути такою
.
Обчислення послідовних наближень за програмою
program num_exper1;
uses
crt;
var
x:real;
k:byte;
function fi(x:real):real;
begin
fi:=exp(-x);
end;
begin
clrscr;
write (‘Нульове наближення x=’); readln(x);
for k:=1 to 10 do
begin
x:=fi(x);
writeln(k, ‘ ‘, x);
end;
end.
дає
Нульове наближення x=0.5
1 0.607
2 0.545
3 0.580
4 0.560
5 0.571
6 0.565
7 0.568
8 0.566
9 0.568
10 0.567
Видно,
що різниця між сусідніми послідовними
наближеннями зменшується із збільшенням
k,
що є ознакою того, що ітераційний процес
збігається. Корінь рівняння
.
При виборі іншого нульового наближення, далекого від кореня ітераційний процес також збіжний:
Нульове наближення x=10.5
1 0.000
2 1.000
3 0.368
4 0.692
5 0.500
6 0.606
7 0.545
8 0.580
9 0.560
10 0.571
11 0.565
12 0.568
13 0.566
14 0.568
15 0.567
16 0.567
Експеримент з різними нульовими довели, що ітераційний процес для заданого рівняння збігається до кореня за будь-якого вибору нульового наближення. Від вибору нульового наближення залежить лише кількість необхідних ітерацій.
Числовий
експеримент 2.
Якщо для
рівняння
вибрати ітеруючу функцію у вигляді
,
то за програмою num_exper1 з функцією
Але для такої ітеруючої функції обчислення послідовних наближень за програмою
function fi(x:real):real;
begin
fi:=10*exp(-x);
end;
одержуємо такі послідовні наближення:
Нульове наближення x=10.5
1 6.065
2 0.023
3 9.770
4 0.001
5 9.994
6 0.000
7 9.995
8 0.000
9 9.995
10 0.000
При іншому нульовому наближенні маємо
Нульове наближення x=1.7
1 1.827
2 1.609
3 2.000
4 1.353
5 2.585
6 0.754
7 4.706
8 0.091
9 9.135
10 0.001
Така поведінка послідовних наближень свідчить про те вони не мають границі.
Чисельний
експеримент 3.
Для
рівняння
з ітеруючою функцією
обчислення послідовних наближень за програмою num_exper1 з функцією
function fi(x:real):real;
begin
fi:=exp(2*x)-2;
end;
дають такі результати
Нульове наближення x=0.5
1 0.718
2 2.206
3 80.470
Runtime error 205 at 0000:0050
Така
поведінка послідовних наближень свідчить
про розбіжність ітераційного процесу.
Між тим рівняння має корінь
.
Чисельні експерименти 1,2,3 показують, що ітераційний процес (2) може бути збіжним, може не мати границі, може бути розбіжним. Тому для уточнення кореня нелінійного рівняння необхідно мати умову збіжності.
Можна довести, що такою умовою збіжності є
(3)
Стала q можна вибрати по різному. Досить часто її вибирають у вигляді:
Можна довести, що похибка k – наближення до кореня
.
З цієї
рівності можна одержати умову закінчення
ітераційного процесу, якщо врахувати,
що за постановкою задачі має виконуватися
нерівність
:
,
де
. (4)
Якщо
або
,то
рівність (4) спрощується:
. (4a)
Якщо
важко оцінити
,
то можна скористатися наступною умовою
закінчення ітераційного процесу
(4b)
Заміну
нелінійного рівняння
рівносильним
можна формалізувати, якщо ітеруючу
функцію вибрати у вигляді
,
(5)
p – число, яке задовольняє умовам
,
.
Для наближеного знаходження максимуму довільної функції на довільному відрізку скористатися такою програмою:
program max_function;
var
a,b,max,x,fx:real; {a,b – границі відрізку, на якому необхідно знайти максимум функції, h – крок зміни аргументу функції x, max – максимальне значення функції}
ix, nx :byte; {nx – кількість точок по x, ix – номер точки}
begin
write(‘a=’); readln(a);
write(‘b=’); readln(b);
write(‘h=’); readln(n);
{Підрахунок кількості точок по x}
nx:=round((b-a)/h);
max:=f(a);
for ix:=1 to nx do
begin
x:=a+ix*h; fx:=f(x)
if fx>max then max:=fx;
end;
writeln(‘max=’,max:1:4);
end;
Алгоритм уточнення кореня нелінійного рівняння методом простих ітерацій реалізований такою процедурою:
procedure mpi(var x:real; eps:real;kmax:byte; var error:byte);
{Процедура уточнює корінь нелінійного рівняння до заданої точності.
Вхідні дані
x – нульове наближення кореня;
eps – параметр, що характеризує точність кореня рівняння;
kmax – максимальна кількість ітерацій.
Вихідні дані:
x – уточнений корінь рівняння;
k – кількість виконаних ітерацій;
error –код помилки;
0 – корінь уточнено;
2 – різниця між послідовними наближеннями зростає;
3 – не досягнуто точності за kmax ітерацій.}
var
d,dpop,xpop:real; {d – різниця між двома останніми наближеннями, dpop – різниця між передостанніми наближеннями, xpop – попереднє наближення кореня рівняння}
k:byte;
begin
error:=0; xpop:=x; dpop:=1e20;
{ітерації}
for k:=1 to kmax do
begin
x:=fi(x); d:=abs(x-xpop);
{якщо віддаль між послідовними наближеннями зростає, то вихід з процедури}
if d>dpop then begin error:=2; exit;end;
if abs(xpop-x)>eps then begin xpop:=x; dpop:=d end
else exit;
end;
error:=3;
end;
Процедура mpi звертається до функції function fi(x:real):real;,яка в нашому випадку має вигляд:
function fi(x:real):real;
begin
fi:=cos(x);
end;
