Teoria współbieżności - ćwiczenia laboratoryjne

Transkrypt

Teoria współbieżności - ćwiczenia laboratoryjne
Równania różniczkowe i różnicowe - ćwiczenia laboratoryjne
Nr ćwiczenie
Temat ćwiczenia
Cel ćwiczenia
3
Optymalny algorytm rozwiązujący układ równań linowych
pochodzących z obliczeń metodą różnic skończonych / metodą
elementów skończonych
Zapoznanie studentów z algorytmami rozwiązującymi układy
równań liniowych generowanymi przez metodę różnic
skończonych / elementów skończonych
Cel ćwiczenia
Celem ćwiczenia jest omówienie struktury równań liniowych wygenerowanych w Ćwiczeniu 1 przez
zastosowanie metody różnic skończonych, lub w ćwiczeniu 4, poprzez zastosowanie metody elementów
skończonych.
W szczególności przedstawiony jest klasyczny algorytm eliminacji Gaussa, który ze względu na
trójdiagonalny kształt macierzy jest wysoce kosztowny z punktu widzenia złożoności obliczeniowej O(N3)
i pamięciowej O(N2).
Celem ćwiczenia jest zapoznanie studentów z algorytmem eliminacji Gaussa pracującym na macierzy
trójdiagonalnej, dostarczającym złożoność obliczeniową rzędu O(N) oraz złożoność pamięciową rzędu
O(N), zwanym algorytmem frontalnym.
Kolejnym celem ćwiczeń jest zaprezentowanie jak ważny jest pivoting w algorytmie eliminacji Gaussa w
przypadku gdy wygenerowana macierz nie jest dodatnio określona.
Wprowadzenie teoretyczne
Podczas ćwiczenia używany jest program w MATLABie przedstawiający klasyczną eliminację Gaussa.
Plan ćwiczenia
Proszę przeanalizować algorytm klasycznej eliminacji Gaussa
function GaussianElimination(A,b,n)
%A to macierz nxn
%b to wektor n
%n to rozmiar
%pętla po wierszach
for r=1:n
%PIVOTING
Równania różniczkowe i różnicowe - ćwiczenia laboratoryjne
%poszukujemy najwiekszego wyrazu w kolumnie r
max=abs(A(r,r)); imax=r;
for i=r+1:n
if(abs(A(i,r))>max)
imax=i;
max=abs(A(i,r));
end
end
%numer wiersza o maksymalnej wartosci w kolumnie r to “imax”
%zamieniamy wiersze r-ty oraz imax
for i=r:n
buff = A(r,i);
A(r,i)=A(imax,i);
A(imax,i)=buff;
end
%dzielimy wiersz r-ty przez wartosc z przekatnej
divider=A(r,r);
for i=r:n
A(r,i)=A(r,i)/divider;
end
%podobnie dla prawej strony
b(r)=b(r)/divider;
%robimy 0 ponizej przekatnej (odejmujemy wiersze)
%petla po wierszach od r+1 do n
for i=r+1:n
%odejmujemy wiersze i-ty = i-ty - A(i,r)*r-ty
mult = A(i,r);
for j=r:n
Równania różniczkowe i różnicowe - ćwiczenia laboratoryjne
A(i,j)=A(i,j)-mult*A(r,j);
end
b(i)=b(i)-mult*b(r);
end
end
%w tym miejscu mamy macierz trojkatna gorna
%rozwiazujemy uklad rownan zaczynajac od ostatniego
x(n)=b(n)/A(n,n);
%petla po rownaniach od przedostatniego do pierwszego
for k=n-1:-1:1
%dla kazdego rownania, mamy
% A(k,k)x(k)+A(k,k+1)x(k+1)+...+A(k,n)x(n)=b(n)
sum=0;
for i=k+1:n
sum=sum+A(k,i)*x(i);
end
x(k)=(b(k)-sum)/A(k,k);
end
Ćwiczenie polega na wykonaniu następujących czynności:
1. Proszę założyć, iż macierz na której pracuje algorytm eliminacji Gaussa jest macierzą
trójdiagonalną. Proszę macierz zapisać w tablicy 3xN
2. Proszę zmodyfikować algorytm eliminacji Gaussa bez pivotingu, w taki sposób aby pracował on
na macierzy skompresowanej do tablicy 3xN
3. Proszę przetestować algorytm na kilku równaniach zdyskretyzowanych MRS (np. na równaniu
konwekcji-dyfuzji)
4. Proszę dodać pivoting do algorytmu. Czy macierz może być nadal przechowywana w tablicy 3xN
?
Równania różniczkowe i różnicowe - ćwiczenia laboratoryjne
Sposób oceny
1. Poprawność modyfikacji algorytmu eliminacji Gaussa bez pivotingu dla macierzy trójdiagonalnej
2. Poprawność modyfikacji algorytmu eliminacji Gaussa z pivotingiem dla macierzy trójdiagonalnej
3. Poprawne działanie programu przetestowane na kilku przykładach
Literatura
1. Podręcznik użytkownika MATLAB
2. Irons B., A frontal solution program for finite-element analysis.
International Journal of Numerical Methods in Engineering, 2 (1970) 532