Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab10.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
566.78 Кб
Скачать

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]