Rozkład LU to rozkład pewnej macierzy A na macierz dolnotrójkątną L oraz górnotrójkątną U tak, że A = LU. Wyznaczenie obydwu macierzy jest możliwe przy pomocy metody eliminacji Gaussa. W tym artykule zostanie przedstawione krok po kroku jak należy to obliczyć.
Poszukujemy rozkładu pewnej macierzy A o wymiarach n×n na macierze L i U. Przykładowo dla n = 3 równanie miałoby postać:
W wyniku eliminacji Gaussa zostanie uzyskana macierz górnotrójkątna. Z kolei macierz dolnotrójkątną należy wyznaczyć w następujący sposób. Pierwszy krok eliminacji Gaussa polega na wyzerowaniu kolumny poniżej elementu a11. Zerując i-tym wierszem j-ty wiersz należy wpisać na pozycji Lji współczynnik przez który został pomnożony wiersz i-ty. Ponadto macierz dolnotrójkątna ma zawsze na diagonali wartości 1. Po wykonaniu eliminacji Gaussa zostaną uzyskane dwie macierze L i U.
W wyniku eliminacji Gaussa zostanie uzyskana macierz górnotrójkątna. Z kolei macierz dolnotrójkątną należy wyznaczyć w następujący sposób. Pierwszy krok eliminacji Gaussa polega na wyzerowaniu kolumny poniżej elementu a11. Zerując i-tym wierszem j-ty wiersz należy wpisać na pozycji Lji współczynnik przez który został pomnożony wiersz i-ty. Ponadto macierz dolnotrójkątna ma zawsze na diagonali wartości 1. Po wykonaniu eliminacji Gaussa zostaną uzyskane dwie macierze L i U.
Rozpoczynamy elementu a11. Wyzerowane zostaną wartości a21 i a31 poprzez odjęcie odpowiednią ilość razy pierwszego wiersza od drugiego oraz trzeciego.
W ten sposób zostały otrzymane wartości L21 = 2 i L31 = 3, które jak było wspominane oznaczają ile razy został odjęty pierwszy wiersz od kolejno drugiego i trzeciego. Pozostało teraz jeszcze wybrać pozycją a22 i wyzerować wszystko poniżej:
Od ostatnieg wiersza odjęto dwa razy drugi, więc L32 = 2. Eliminacja Gaussa została zakończona. Uzyskana macierz końcowa to poszukiwana macierz górnotrójkątna. Druga macierz L dolnotrójkątna będzie miała następującą postać:
W ramach sprawdzenia należałoby pomnożyć macierze L oraz U, aby sprawdzić czy faktycznie A = LU.
Napisz program, która dla podanej macierzy A zwróci rozkład LU zapisany w postaci jednej macierzy. Taki zapis jest możliwy, ponieważ wiadomo, że macierz dolnotrójkątna ma zawsze 1 na diagonali, więc pomija się je i obie macierze można zapisać w jednej. Oto przykład:
Sprawdź poprawność napisanego rozwiązania. Do wykonywania podstawowych operacji na macierzach można skorzystać z biblioteki matrix.h.
Poniższy kod funkcji rozkladLUGauss() przyjmuje jeden argument A - macierz dla której ma zostać wyznaczony rozkład LU. Wynikiem działania funkcji jest zwrócenie połączonej macierzy L i U.
(2.) Sprawdź czy macierz jest kwadratowa. Jeśli tak to (3.) pobierz jej rozmiar i (4.) utwórz nową macierz. Następnie (5.) dla każdego wiersza: (6. - 7.) przepisz elementy z A, które należą do U, a potem (8.) rozpocznij zerowania danej kolumny poniżej elementu z diagonali. (9.) Oblicz współczynnik, który (10.) należy wpisać do macierzy wynikowej oraz (11. - 12.) przeprowadź odejmowanie dwóch wierszy.
Poniższy fragment kodu wczytuje od użytkownika macierz, a następnie wypisuje dla niej połączony rozkład LU uzyskany metodą eliminacji Gaussa.
Napisz funkcję rozlozMacierzLU(), która wypisz oddzielnie macierz L oraz U na podstawie macierzy zwracanej przez funkcję rozkladLUGauss() z omówionego wcześniej zadania.
Przykładowo dla macierzy:
program ma wypisać: