Grzegorz Pasek 171604
METODY NUMERYCZNE – SPRAWOZDANIE NR 2
·Rozwiązywanie układów równań liniowych
Zad 1
Należało napisać i zaimplementować algorytmy rozwiązań układów równań liniowych metodą Gaussa, Gaussa z częściowym wyborem elementu głównego oraz Gaussa z pełnym wyborem elementu głównego.
Należało przetestować algorytmy na układach z losowo wygenerowanymi liczbami dla macierzy:
Małej, 2x2 podanej na liście,
Vandermonde’a
Trójprzekątniowej z oraz bez dominującej przekątnej.
Implementację rozpocząłem od algorytmu Gaussa bez wyboru elementu głównego.
i=1;
j=1;
imax=a+1;
jmax=b;
pam=0;
poczatek=0;
k=1;
koniec=0;
while j<=a-1
poczatek=0;
while A(i+j-1,j)==0 && i<9 %czy mamy zero ?
i=i+1;
end
if i+j-1==j && poczatek==0 %nie mamy zera i jestesmy w pierwszym wersie
i=i+1;
if A(i+j-1,j)==0 %wers drugi jest zerowy
pam=i;
while koniec==0 && i+j-1<=imax && A(i+j-1,j)==0 %szukamy niezerowego wersa
i=i+1;
if i+j-1==imax
koniec=1;
end
end %tu powinno byc sprawdzanie czy wypadlismy z zakresu
while k<=jmax && koniec==0%przepisanie na tymczasowe zeby nie zgubic danych
tymcz(k)=A(pam+j-1,k);
tymcz2(k)=A(i+j-1,k);
k=k+1;
end
k=j;
while k<=jmax && koniec ==0%przepisanie z tymczasowych
A(i+j-1,k)=tymcz(k);
A(pam+j-1,k)=tymcz2(k);
k=k+1;
end
k=j;
i=1;
poczatek=1; %spadamy na poczatek
end
if A(i+j-1,j)~=0 && poczatek==0 &&koniec==0%wers drugi nie jest zerowy
k=j;
wspolcz=-A(i+j-1,k)/A(i+j-1-1,k);
while k<=jmax
A(i+j-1,k)=A(i+j-1,k)+wspolcz*A(i+j-1-1,k);
k=k+1;
end
k=j;
i=1;
poczatek=1;
end
end
if i+j-1~=1 && poczatek ==0 && koniec==0 %nie jestesmy w pierwszym wersie i nie mamy zera
while k<=jmax %przepisanie na tymczasowe zeby nie zgubic danych
tymcz(k)=A(1,k);
tymcz2(k)=A(i+j-1,k);
k=k+1;
end
k=j;
while k<=jmax %przepisanie z tymczasowych
A(1,k)=tymcz2(k);
A(i+j-1,k)=tymcz(k);
k=k+1;
end
k=j;
i=1;
end
if koniec==1
j=j+1;
koniec=0;
end
end
A
wyniki=rand(a,1);
x=zeros(a,1);
indeks=a;
k=1;
suma=0;
while indeks>0
while k<=a
suma=(suma+x(k)*A(indeks,k));
k=k+1;
end
x(indeks)= (wyniki(indeks)-suma)/A(indeks,indeks);
indeks=indeks-1;
k=1;
suma=0;
end
blad=norm(A*x-wyniki);
blad
Następnie zaimplementowałem algorytm Gaussa z częściowym wyborem elementu głównego:
<jedyną różnicą między poprzednim programem a tym było to, że dodałem flagę wyboru elementu głównego i funkcję do niej przypisaną, która wykonuje się dokładnie raz przy przejściu z każdego wiersza>
if wyb_elem_gl==1
pami=A(k,j);
pamw=k;
while k<a
if A(k+1,j)>pami
pami=A(k+1,j);
pamw=k+1;
end
k=k+1;
end
k=j;
while k<=jmax
tymcz(k)=A(j,k);
tymcz2(k)=A(pamw,k);
k=k+1;
end
k=j;
while k<=jmax
A(j,k)=tymcz2(k);
A(pamw,k)=tymcz(k);
k=k+1;
end
k=j;
wyb_elem_gl=0;
end
Na koniec poprawiłem program żeby dokonywał pełnego wyboru elementu głównego:
if wyb_elem_gl==1
pami=A(k,j);
pamw=k;
pamk=j;
c=j;
while c<=b
while k<=a
if A(k,c)>pami
pami=A(k,c);
pamw=k;
pamk=c;
end
k=k+1;
end
k=j;
c=c+1;
end
c=j;
while k<=jmax %zamiana wierszy
tymcz(k)=A(j,k);
tymcz2(k)=A(pamw,k);
k=k+1;
end
k=j;
while k<=jmax
A(j,k)=tymcz2(k);
A(pamw,k)=tymcz(k);
k=k+1;
end
while c<=a %zamiana kolumn
temp(c)=A(c, pamk);
temp2(c)=A(c,j);
c=c+1;
end
c=j;
while c<=a
A(c,pamk)=temp2(c);
A(c,j)=temp(c);
c=c+1;
end
c=j;
k=j;
wyb_elem_gl=0;
end
M1 | Macierz: | 2x2 | 10x10 | 15x15 | 20x20 |
---|---|---|---|---|---|
Zadana | 0 | --- | --- | --- | |
Vandermonde’a | 0 | 1.8200e-007 | 1.6004e-009 | 7.9950e-006 | |
Trójprzek. B gl | 1.1102e-016 | 2.719037e-16 | 2.25905e-16 | 3.62045e-16 | |
Trójprzek. Z gl | 1.122302e-16 | 5.561943e-17 | 2.02063e-16 | 1.66735e-16 | |
M2 | |||||
Zadana | 0 | --- | --- | --- | |
Vandermonde’a | 0 | 1.27106e-006 | 2.3350e-006 | 0.001419 | |
Trójprzek. B gl | 0 | 8.233637e-16 | 2.80457e-16 | 7.098052e-16 | |
Trójprzek. Z gl | 0 | 4.710275e-16 | 2.00148e-16 | 2.220413e-16 | |
M3 | |||||
Zadana | 0 | --- | --- | --- | |
Vandermonde’a | 0 | 1.30098e-06 | 2.1277e-014 | 0.00516095 | |
Trójprzek. B gl | 0 | 5.26652e-16 | 3.04059e-16 | 7.18052e-16 | |
Trójprzek. Z gl | 0 | 2.48253e-16 | 5.5511e-017 | 2.93103e-16 |
M1-metoda bez wyboru elementu głównego
M2-metoda z częściowym wyborem elem. głównego
M3-metoda z całkowitym wyborem elem. głównego