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