Numeric Methods Gauss Jordan Elimination

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

MNUM projekt 1

Lidia Łuczkiewicz

Metoda eliminacji Gaussa-Jordana z częściowym wyborem elementu


głównego.

Układ n równań liniowych

można przedstawić w postaci

gdzie

Metoda polega na kolejno zerowaniu kolumn macierzy współczynników A z dołączonym wektorem


wyrazów wolnych b wyrazem, który jest największy co do modułu.

Algorytm postepowania dla j-tej kolumny:

 Wybieramy element który jest największy co do modułu i zamieniamy i-ty wiersz, w którym
się znajduje z j-tym wierszem mnożąc lewostronnie przez macierz P, która jest macierzą
jednostkową z przestawionymi jedynkami w i-tym i j-tym rzędzie
 Od i-tego wiersza poza j-tym odejmujemy j-ty wiersz pomnożony przez iloraz wyrazu a ij i a jj

 Algorytm powtarzamy dla wszystkich kolumn

Po wyzerowaniu wyrazów otrzymujemy macierz diagonalną, z której wyznaczenie wektora


wynikowego jest proste i następuje według wzoru:

Algorytm
function [x, texe] = GJ(A,b)
tic;
Ab = [A b];
n = numel(b);
for j= 1 : n
P = eye(n);
[~, k] = max(abs(Ab(j : n, j)));%wybór elementu głównego
k = k + j - 1;
P(j,j) = 0;
P(k,k) = 0;
P(k,j) = 1;
P(j,k) = 1;
Ab = P * Ab;%zamiana wierszy
for i = 1:n
if i ~= j
l = (Ab(i, j)/Ab(j, j));
Ab(i,:) = Ab(i,:) - l*Ab(j,:);%zerowanie kolumn
end
end
end

b = Ab(:,end);
x = zeros(n,1);

for i = 1:n
x(i) = b(i)/Ab(i,i);
end

texe = toc;

Badanie zależności błędu i czasu rozwiązania algorytmu w zależności


od liczby równań
Eksperymenty przeprowadzono dla n układów równań, gdzie n = 5, 10, 25, 50, 100, 200 dla macierzy
współczynników danych wzorami
Błąd rozwiązania jest mały, rzędu 1e-13. Wraz ze wzrostem liczby równań rośnie w przybliżeniu
wykładniczo.

Czas rozwiązania również rośnie wykładniczo, jest rzędu setnej sekundy.

Porównanie jakościowe powyższej metody oraz metody Gaussa-Seidla


Analogicznie jak wyżej porównano na wykresach wyniki eksperymentu dla metody Gaussa-Jordana
oraz Gaussa-Seidla dla tych samych n i macierzy współczynników danych wzorami

Dane porównano w tabelach:

czas obliczeń
liczba równań 5 10 25 50 100 200
Gauss-Jordan(s) 0.0049 0.0001 0.0003 0.0031 0.0107 0.0607
Gauss-Seidel(s) 0.0050 0.0005 0.0013 0.0057 0.0063 0.0159

błąd rozwiązania
liczba równań 5 10 25 50 100 200
Gauss-
0.03 0.11 0.51 1.72 5.31 17.72
Jordan(1e-13)
Gauss-Seidel(1e-
0.445 1.090 1.161 1.574 0.950 1.136
8)
Charakterystyki błędu i czasu rozwiązania dla metody Gaussa-Jordana prezentują się podobnie jak w
poprzednim eksperymencie. Błędy są około cztery razy większe, ale nadal rzędu 1e-13. Czas
rozwiązania z początku maleje i dla 100 zaczyna rosnąć wykładniczo. Czas rozwiązań dla danych
macierzy i macierzy danych w poprzednim eksperymencie pozostaje praktycznie taki sam z lekkimi
odchyleniami dla niższych rzędów.

Dla metody Gaussa-Seidla błąd rozwiązania jest rzędu 1e-8, choć dla niewielkiej ilości równań
gwałtownie rośnie, a następnie maleje dla 100 równań, dalej rośnie. Trudno jest określić jego
dokładną charakterystykę ze względu na małą ilość danych. Podobnie czas rozwiązania jest
nieregularny-znacząco maleje dla mniejszych rzędów, dalej rośnie w przybliżeniu wykładniczo.

Porównując te dwie metody, druga jest zdecydowanie szybsza dla większej liczby równań, za to
kosztem większego błędu obliczeń.

Aproksymacja funkcją wielomianową metodą najmniejszych


kwadratów
Mając dane wektory

Szukamy takiego wektora współczynników a, żeby zminimalizować błąd średniokwadratowy

gdzie

oraz

Układ równań normalnych


W zadanej postaci mamy układ nad określony, aby móc rozwiązać układ równań mnożymy obie strony
lewostronnie przez transponowaną macierz AT . Otrzymujemy macierz Grama G = AT A oraz wektor
wyrazów wolnych b = AT y .
Taki układ równań ma n+1 równań i n+1 niewiadomych. W przeprowadzonym eksperymencie
najpierw rozwiązujemy go metodą Gaussa-Jordana, a potem Gaussa-Seidla. Dla tej drugiej metody

gdzie n jest liczbą równań.

Algorytmy:
Gauss-Jordan
function [a] = approxGJ(xi, yi, n)
A = zeros(numel(xi), n+1);
for i = 0 : n
A(:, i + 1) = xi.^(i);
end

b = A'*yi;
G = A'*A;
a = GJ(G, b);
a = flip(a);
Gauss-Seidel
function [a] = approxGS(xi, yi, n)
A = zeros(numel(xi), n+1);
for i = 0 : n
A(:, i + 1) = xi.^(i);
end

b = A'*yi;
G = A'*A;
a = GJ(G, b);
a = flip(a);
Rozkład QR
Ponieważ macierz Grama jest źle uwarunkowana, możemy zastosować rozkład QR macierzy A.
Następnie mnożymy obustronnie z lewej strony przez transponowaną macierz QT . Ponieważ macierz
R jest macierzą trójkątną górną, współczynniki wyznaczamy metodą backward substitution.

Algorytm
function [a] = approxQR(xi, yi, n)
A = zeros(numel(xi), n+1);
for i = 0 : n
A(:, i + 1) = xi.^(i);
end

[Q, R] = qr(A);
b = Q'*yi;
n = n+1;
a = zeros(n,1);
a(n) = b(n)/R(n,n);
for k = n-1:-1:1
sum = 0;
for j = k+1:n
sum = sum + R(k,j)*a(j);
end
a(k) = (b(k) - sum)/R(k,k);
end
a = flip(a);
Porównanie kolejno metod Gaussa-Jordana, Gaussa-Seidla oraz rozkładu QR na
wykresach oraz w tabeli.
Błąd liczony w normie euklidesowej
Stopień GJ GS QR
3 0.8109 0.8109 0.8109
5 0.6792 0.6792 0.6792
7 0.6178 1.3095e+4 0.6178
9 0.0036 6.5882e+5 0.0036
10 1.333e-10 2.3186e+7 1.1191e-13

Błąd liczony w normie maksimum

stopień GJ GS QR
3 1.3700 1.3700 1.3700
5 1.1866 1.1866 1.1866
7 1.0173 2.7716e+4 1.0173
9 0.0062 1.0648e+6 0.0062
10 1.5643e-10 4.5446e+7 1.1908e-13

Metody Gaussa-Jordana oraz rozkład QR dają prawie identyczne wyniki z wyjątkiem stopnia 10, dla
którego rozkład QR ma około 1000 razy mniejszy błąd, przy czym dla obu metod jest on niewielki,
nieprzekraczający rzędu 1e-10. Metoda Gaussa-Seidla daje te same wyniki dla stopni 3 i 5, natomiast
dla reszty błąd gwałtownie rośnie aż do rzędu 1e+7, co widoczne jest na wykresach-funkcja
aproksymująca ma znaczne odchylenia od danych.

Wszystkie metody dobrze generalizują rozkład danych dla małych stopni, natomiast dla większych
metoda Gaussa-Seidla jest zupełnie nieefektywna, a pozostałe dwie zbyt mocno skupiają się na
przecięciu wykresu z danymi, gdzie sensowniejszy jest ogólny zarys rozkładu danych.

You might also like