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

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 

10 

 

 

>> [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ń.