Metody iteracyjne

background image

11.06.2012 r.

Politechnika Rzeszowska

Ignacego Łukasiewicza

Wydział Budowy Maszyn i Lotnictwa

Katedra Samolotów i Silników Lotniczych

Metody numeryczne w budowie i eksploatacji konstrukcji lotniczych

Metoda Jacobiego i Gaussa-Seidla

Jacek Kaczmarek

Katarzyna Kozendra

Łukasz Krawczyk

Tomasz Miziniak

Kamil Piotrowski

Łukasz Rupar

I MDLiK-B

background image

1. Wstęp teoretyczny

Zarówno metoda Jacobiego, jak i metoda Gaussa-Seidla są metodami iteracyjnymi pozwalającymi

obliczyć układ n równań z n niewiadomymi Ax = b. Wektor x

0

będący początkowym przybliżeniem

rozwiązania układu będzie dany (zwykle przyjmuje się go jako wektor złożony z samych zer). By

zastosować tą metodę należy najpierw tak zamienić kolejność równań układu, aby na głównej

przekątnej były elementy różne od zera.

Na początku macierz współczynników A rozłożymy na sumę trzech macierzy A = L + D + U, gdzie

L jest macierzą w której znajdują się elementy których numer wiersza jest większy od numeru

kolumny, D to macierz diagonalna z elementami tylko na głównej przekątnej, a U to macierz, w

której znajdują się elementy których numery wiersza są mniejsze od numerów kolumny. Można to

zapisać następująco:

A = L + D + U

Różnice między metodami:

Głowna różnica pomiędzy tymi metodami polega na zastosowaniu innego wzoru służącego do

obliczania kolejnych przybliżeń:

metoda Jacobiego- kolejne przybliżenia oblicza się z następującego wzoru:

gdzie:

M = I – NA

N - pewna macierz kwadratowa

I - macierz jednostkowa

W metodzie Jacobiego przyjmujemy, że N=D

-1

, to wówczas M = -D

-1

(L+U). By zastosować tą

metodę należy najpierw tak zamienić kolejność równań układu, aby na głównej przekątnej były

elementy różne od zera. Macierz D

-1

otrzymamy po podniesieniu do potęgi „-1” wszystkich

wartości na głównej przekątnej macierzy D. Metoda ta jest zbieżna dla dowolnego przybliżenia

początkowego rozwiązania x

0

, jeśli promil spektralny –D

-1

(L+U) jest mniejszy od jeden (promień

spektralny to największa wartość bezwzględna z wartości własnej macierzy). W przeciwnym

wypadku nie dla każdego przybliżenia początkowego otrzymamy rozwiązanie uk ładu.

metoda Gaussa-Seidla- kolejne przybliżenia oblicza się z następującego wzoru:

background image

Metoda Gaussa-Seidla bazuje na metodzie Jacobiego, w której krok iteracyjny zmieniono w ten

sposób, by każda modyfikacja rozwiązania próbnego korzystała ze wszystkich aktualnie

dostępnych przybliżonych składowych rozwiązania. Pozwala to zaoszczędzić połowę pamięci

operacyjnej i w większości zastosowań praktycznych zmniejsza ok. dwukrotnie liczbę obliczeń

niezbędnych do osiągnięcia zadanej dokładności rozwiązania.

Przykład:

Obliczymy następujący układ równań:

Zapiszmy go teraz w postaci

:

Podzielmy teraz macierz

na sumę macierzy :


Obliczmy teraz macierz

:


Do tego momentu obie metody się nie różnią.

Metoda Gaussa-Seidla:

Wyznaczamy kolejno

:

Rozpoczynamy od zerowego przybliżenia czyli:

background image

Obliczmy pierwszą iterację metody, według przytoczonego na początku wzoru:

Kolejna iteracja:

Można teraz obliczyć kolejną iterację. Każda z nich przybliża nas do dokładnego wyniku.

Metoda Jacobiego:

Wyznaczamy kolejno

:

Rozpoczynamy od zerowego przybliżenia czyli:

Obliczmy pierwszą iterację metody, według przytoczonego na początku wzoru:

background image

Kolejna iteracja:

Można teraz obliczyć kolejną iterację. Każda z nich przybliża nas do dokładnego wyniku.

2. Kod źródłowy programów w których zaimplementowano powyższe iteracje

METODA JACOB IEGO

function

[x, it, blad] = jacobi(A, b, max_it, tol)

% [x, it, blad] = jacobi(A, b, max_it, tol)

%

% Układ służy do rozwiązywania liniowych układów równań metoda Jacobiego

% typu Ax=b

%

% wejscie A macierz wspolczynnikow po lewej stronie rownania

% b macierz wyrazow wolnych

% max_it maksymalna liczba iteracji

% tol tolerancja z jaką przybliżamy

%

% wyjscie x macierz rozwiazan ukladu

% it liczba wykonanych iteracji

% blad maksymalna roznica miedzy kolejnymi iteracjami

%

it=0;

[m,n]=size(A);

[p,r]=size(b);

if

m~=n

disp(

'Macierz A nie jest kwadratowa. Obliczenia nie beda dalej prowadzone.'

)

else

if

m~=p

disp(

'Liczba wierszy macierzy b nie jest zgodna z liczbą wierszy macierzy A.

Obliczenia nie beda dalej prowadzone.'

)

else

for

i=1:m;

% procedura dostosowywania macierzy A

z=norm(A(i,:));

if

z==0

% sprawdzanie czy sa zerowe wiersze

disp(

'Przynajmniej jeden z wierszy jest zerowy. Obliczenia nie beda dalej

prowadzone.'

)

else

;

while

A(i,i)==0;

% zamiana kolejnosci rownan aby nie

bylo zer na glownej przekatnej

for

j=1:n-1;

bufor=A(j,:);

A(j,:)=A(j+1,:);

A(j+1,:)=bufor;

background image

bufor=A(j+1,:);

A(j+1,:)=A(n-j,:);

A(n-j,:)=bufor;

buforb=b(j,:);

b(j,:)=b(j+1,:);

b(j+1,:)=buforb;

buforb=b(j+1,:);

b(j+1,:)=b(n-j,:);

b(n-j,:)=buforb;

end

end

end

end

L=zeros(m,n);

D=L;

U=L;

for

i=1:m-1;

for

j=1:i;

L(i+1,j)=A(i+1,j);

end

end

for

i=1:m;

D(i,i)=A(i,i);

end

for

i=1:m-1;

for

j=i:n-1;

U(i,j+1)=A(i,j+1);

end

end

N=D^-1;

M=zeros(m,n);

M=-1*N*(L+U);

x=zeros(p,r);

blad=max(abs(b));

while

(it<max_it & abs(blad)>tol);

x1=M*x+N*b;

blad=max(abs(x-x1));

x=x1;

it=it+1;

end

if

it>=max_it;

disp(

'Osiagnieto maksymalna liczbe iteracji.'

)

else

disp(

'Osiagnieto wymagana dokladnosc.'

)

end

end

end

end


background image

METODA GAUSSA-SEIDLA

function

[x, it, blad] = gauseidl(A, b, max_it, tol)

% [x, it, blad] = gauseidl(A, b, max_it, tol)

%

% Układ służy do rozwiązywania liniowych układów równań metoda

% Gaussa- Seidla typu Ax=b

%

% wejscie A macierz wspolczynnikow po lewej stronie rownania

% b macierz wyrazow wolnych

% max_it maksymalna liczba iteracji

% tol tolerancja z jaką przybliżamy

%

% wyjscie x macierz rozwiazan ukladu

% it liczba wykonanych iteracji

% blad maksymalna roznica miedzy kolejnymi iteracjami

%

it=0;

[m,n]=size(A);

[p,r]=size(b);

if

m~=n

disp(

'Macierz A nie jest kwadratowa. Obliczenia nie beda dalej prowadzone.'

)

else

if

m~=p

disp(

'Liczba wierszy macierzy b nie jest zgodna z liczbą wierszy macierzy A.

Obliczenia nie beda dalej prowadzone.'

)

else

for

i=1:m;

% procedura dostosowywania macierzy A

z=norm(A(i,:));

if

z==0

% sprawdzanie czy sa zerowe wiersze

disp(

'Przynajmniej jeden z wierszy jest zerowy. Obliczenia nie beda dalej

prowadzone.'

)

else

;

while

A(i,i)==0;

% zamiana kolejnosci rownan aby nie

bylo zer na glownej przekatnej

for

j=1:n-1;

bufor=A(j,:);

A(j,:)=A(j+1,:);

A(j+1,:)=bufor;

bufor=A(j+1,:);

A(j+1,:)=A(n-j,:);

A(n-j,:)=bufor;

buforb=b(j,:);

b(j,:)=b(j+1,:);

b(j+1,:)=buforb;

buforb=b(j+1,:);

b(j+1,:)=b(n-j,:);

b(n-j,:)=buforb;

end

end

end

end

L=zeros(m,n);

D=L;

U=L;

for

i=1:m-1;

for

j=1:i;

L(i+1,j)=A(i+1,j);

end

background image

end

for

i=1:m;

D(i,i)=A(i,i);

end

for

i=1:m-1;

for

j=i:n-1;

U(i,j+1)=A(i,j+1);

end

end

M=zeros(m,n);

M=(L+D)^-1;

x=zeros(p,r);

blad=max(abs(b));

while

(it<max_it & abs(blad)>tol);

x1=-1*M*U*x+M*b;

blad=max(abs(x-x1));

x=x1;

it=it+1;

end

if

it>=max_it;

disp(

'Osiagnieto maksymalna liczbe iteracji.'

)

else

disp(

'Osiagnieto wymagana dokladnosc.'

)

end

end

end

end


3. Porównanie wydajności metod

Dokonano również porównania w wydajności obydwóch metod iteracyjnych.

>> A=[4 -1 -0.2 2; -1 5 0 -2; 0.2 1 10 -1; 0 -2 -1 4]

A =

4.0000 -1.0000 -0.2000 2.0000

-1.0000 5.0000 0 -2.0000

0.2000 1.0000 10.0000 -1.0000
0 -2.0000 -1.0000 4.0000

>> b=[30;0;10;5]

b =

30
0
10
5

>> [x, it, blad] = gauseidl(A, b, 200, 0.00000001)
Osiągnięto wymagana dokładność.

background image

x =

6.8083
2.4382
0.8892
2.6914

it =

%liczba iteracji

14

blad =

6.5911e-009

>> g=A*x

%sprawdzenie

g =

30.0000
-0.0000
10.0000
5.0000

>> [x, it, blad] = jacobi(A, b, 200, 0.00000001)
Osiągnięto wymaganą dokładność.

x =

6.8083
2.4382
0.8892
2.6914


it =

%liczba iteracji

40


blad =

7.1697e-009

>> h=A*x

%sprawdzenie

h =

30.0000
-0.0000
10.0000
5.0000





background image

4. Podsumowanie

Obie metody są bardzo do siebie podobne pod względem głównych założeń. Różnią się jedynie
sposobem obliczania kolejnego przybliżenia. Metoda Gaussa-Seidla jest rozwinięciem metody
Jacobiego mającym na celu poprawę szybkości wykonywania obliczeń. Jak widać na przykładzie
jest to prawdą- w metodzie Jacobiego potrzebne było, aż 40 iteracji, żeby uzyskać założoną
dokładność obliczeń. Natomiast w metodzie Gaussa-Seidla wystarczyło do tego celu tylko 14
iteracji. Jest, to prawie trzy krotny wzrost prędkości wykonywania obliczeń.


Wyszukiwarka

Podobne podstrony:
Metody iteracyjne
Zadania1, Elektrotechnika AGH, Semestr III zimowy 2013-2014, Metody Numeryczne, Kolos 2 - materiały
Metody iteracyjne
metody iteracyjneddtt
metody iteracyjne
barcz,metody numeryczne, metoda iteracji prostych
T 3[1] METODY DIAGNOZOWANIA I ROZWIAZYWANIA PROBLEMOW
10 Metody otrzymywania zwierzat transgenicznychid 10950 ppt
metodyka 3
organizacja i metodyka pracy sluzby bhp
metodyka, metody proaktywne metodyka wf
epidemiologia metody,A Kusińska,K Mitręga,M Pałka,K Orszulik 3B
GMO metody wykrywania 2
Metody i cele badawcze w psychologii
E learning Współczesne metody nauczania

więcej podobnych podstron