rozkład LU

W analizie numerycznej i algebrze liniowej , rozkład dolny-górny ( LU ) lub faktoryzacja macierzy jako iloczyn dolnej macierzy trójkątnej i górnej macierzy trójkątnej (patrz rozkład macierzy ) . Produkt czasami zawiera również macierz permutacji . Dekompozycję LU można postrzegać jako postać macierzową eliminacji Gaussa . Komputery zwykle rozwiązują kwadratowe układy równań liniowych za pomocą dekompozycji LU, a także jest kluczowym krokiem podczas odwracania macierzy lub obliczania wyznacznika macierzy . Rozkład LU został wprowadzony przez polskiego matematyka Tadeusza Banachiewicza w 1938 roku. Nazywa się go również rozkładem LR (rozkłada na lewe i prawe trójkątne macierze).

Definicje

Dekompozycja LDU macierzy Walsha

Niech A będzie macierzą kwadratową. Faktoryzacja LU odnosi się do faktoryzacji A , z odpowiednim uporządkowaniem wierszy i / lub kolumn lub permutacji, na dwa czynniki - dolną macierz trójkątną L i górną macierz trójkątną U :

W dolnej trójkątnej macierzy wszystkie elementy powyżej przekątnej są zerowe, w górnej trójkątnej macierzy wszystkie elementy poniżej przekątnej są zerowe. Na przykład dla macierzy A 3 × 3 jej rozkład LU wygląda następująco:

Bez odpowiedniego uporządkowania lub permutacji w macierzy faktoryzacja może się nie urzeczywistnić. Na przykład łatwo jest zweryfikować (rozwijając mnożenie macierzy ), że za . Jeśli , to co najmniej jeden z i musi wynosić zero, co implikuje że albo Ł lub U jest liczbą pojedynczą . Jest to niemożliwe, jeśli A nie jest osobliwe (odwracalne). To jest problem proceduralny. Można go usunąć, po prostu zmieniając kolejność wierszy A , tak aby pierwszy element permutowanej macierzy był różny od zera. Ten sam problem w kolejnych krokach faktoryzacji można usunąć w ten sam sposób; patrz podstawowa procedura poniżej.

Faktoryzacja LU z częściowym obracaniem

Okazuje się, że odpowiednia permutacja w wierszach (lub kolumnach) jest wystarczająca do faktoryzacji LU. Faktoryzacja LU z częściowym obracaniem (LUP) często odnosi się do faktoryzacji LU tylko z permutacjami wierszy:

gdzie L i U są ponownie dolnymi i górnymi macierzami trójkątnymi, a P jest macierzą permutacji , która po pomnożeniu w lewo do A zmienia kolejność wierszy A . Okazuje się, że wszystkie macierze kwadratowe można rozłożyć na czynniki w tej postaci, a faktoryzacja jest w praktyce numerycznie stabilna. To sprawia, że ​​dekompozycja LUP jest użyteczną techniką w praktyce.

Faktoryzacja LU z pełnym obracaniem

Faktoryzacja LU z pełnym obracaniem obejmuje zarówno permutacje wierszy, jak i kolumn:

gdzie L , U i P są zdefiniowane jak poprzednio, a Q jest macierzą permutacji, która zmienia kolejność kolumn A .

Dekompozycja dolna-przekątna-górna (LDU).

dolnej przekątnej-górnej (LDU) jest dekompozycją formy

gdzie D jest macierzą diagonalną , a L i U macierzami jednostkowymi trójkątnymi , co oznacza, że ​​wszystkie wpisy na przekątnych L i U są równe.

Macierze prostokątne

Powyżej wymagaliśmy, aby A była macierzą kwadratową, ale wszystkie te dekompozycje można również uogólnić na macierze prostokątne. W takim przypadku L i D są macierzami kwadratowymi, z których obie mają taką samą liczbę wierszy jak A , a U ma dokładnie takie same wymiary jak A . Górny trójkąt należy interpretować jako mający tylko zero wpisów poniżej głównej przekątnej, która zaczyna się w lewym górnym rogu. Podobnie, bardziej precyzyjnym określeniem dla U jest to, że jest to „forma schodkowa wiersza” macierzy A. _

Przykład

Rozkładamy następującą macierz 2 na 2:

Jednym ze sposobów znalezienia rozkładu LU tej prostej macierzy byłoby po prostu rozwiązanie równań liniowych przez sprawdzenie. Rozszerzenie mnożenia macierzy daje

Ten układ równań jest niedookreślony . W tym przypadku dowolne dwa niezerowe elementy L i U są parametrami rozwiązania i można je dowolnie ustawić na dowolną niezerową wartość. Dlatego, aby znaleźć unikalny rozkład LU, konieczne jest nałożenie pewnych ograniczeń na macierze L i U. Na przykład, możemy wygodnie wymagać, aby dolna trójkątna macierz L była jednostkową macierzą trójkątną (tzn. ustawić wszystkie wpisy jej głównej przekątnej na jedynki). Wówczas układ równań ma następujące rozwiązanie:

Podstawienie tych wartości do powyższego rozkładu LU daje wyniki

Istnienie i wyjątkowość

Macierze kwadratowe

macierz kwadratowa rozkłady na czynniki LUP i PLU . Jeśli , to dopuszcza rozkład na czynniki LU (lub LDU ) wtedy i tylko wtedy, gdy wszystkie jego wiodące główne drugorzędne są niezerowe (na przykład [ nie dopuszcza LU ani LDU faktoryzacja). Jeśli jest macierzą liczby pojedynczej o randze , to dopuszcza faktoryzację LU , jeśli pierwsze główne drugorzędne są niezerowe, chociaż odwrotność nie jest prawdziwa.

Jeśli kwadratowa, odwracalna macierz ma LDU (rozkład na czynniki ze wszystkimi przekątnymi L i U równymi 1), to faktoryzacja jest niepowtarzalna. W takim przypadku LU jest również wyjątkowa jeśli wymagamy, aby przekątna (lub składała się z jedynek.

Ogólnie rzecz biorąc, każda macierz kwadratowa może mieć jedną z następujących cech: ZA

  1. unikalna faktoryzacja LU (jak wspomniano powyżej);
  2. nieskończenie wiele faktoryzacji LU, jeśli dwie lub więcej dowolnych pierwszych ( n -1) kolumn jest liniowo zależnych lub dowolna z pierwszych ( n -1) kolumn ma wartość 0;
  3. brak faktoryzacji LU, jeśli pierwsze ( n −1) kolumny są niezerowe i liniowo niezależne, a co najmniej jedna wiodąca główna podrzędna ma wartość zero.

W przypadku 3 można przybliżyć faktoryzację LU, zmieniając wpis ukośny na za na aby uniknąć głównego zera na początku drobny.

Symetryczne macierze dodatnio określone

Jeśli A jest symetryczną (lub hermitowską , jeśli A jest zespolona) dodatnio określoną macierzą , możemy tak ułożyć sprawy, że U jest sprzężoną transpozycją L. Oznacza to, że możemy zapisać A jako

Ten rozkład nazywa się rozkładem Choleskiego . Rozkład Cholesky'ego zawsze istnieje i jest unikalny — pod warunkiem, że macierz jest dodatnio określona. Ponadto obliczenie dekompozycji Cholesky'ego jest bardziej wydajne i liczbowo bardziej stabilne niż obliczenie niektórych innych dekompozycji LU.

Macierze ogólne

W przypadku macierzy (niekoniecznie odwracalnej) w dowolnym polu znane są dokładne warunki konieczne i wystarczające, w których ma ona rozkład na czynniki LU. Warunki są wyrażone jako rangi pewnych podmacierzy. Algorytm eliminacji Gaussa służący do uzyskiwania rozkładu LU został również rozszerzony na ten najbardziej ogólny przypadek.

Algorytmy

Zamknięta formuła

Gdy faktoryzacja LDU istnieje i jest niepowtarzalna, istnieje zamknięty (jawny) wzór na elementy L , D i U pod względem stosunków wyznaczników pewnych podmacierzy oryginalnej macierzy A . W szczególności i dla , stosunkiem do głównej Obliczanie wyznaczników jest kosztowne obliczeniowo , więc ten jawny wzór nie jest używany w praktyce.

Korzystanie z eliminacji Gaussa

Poniższy algorytm jest zasadniczo zmodyfikowaną formą eliminacji Gaussa . rozkładu LU przy użyciu tego algorytmu wymaga niższego rzędu. Częściowe obracanie dodaje tylko składnik kwadratowy; nie dotyczy to pełnego obrotu.

Procedura

Biorąc pod uwagę macierz N × N , zdefiniuj jako macierz , w której niezbędne wiersze zostały zamienione, aby spełnić pożądane warunki (takie jak częściowe obrócenie) dla pierwszej kolumny. Indeks górny w nawiasie (np. ) macierzy jest wersją macierzy Macierz jest , w której elementy poniżej głównej przekątnej zostały wyeliminowane do 0 poprzez eliminację Gaussa dla pierwszego kolumn, a niezbędne wiersze zostały zamienione, aby spełnić żądane warunki dla kolumna.

Wykonujemy operację dla każdego wiersza elementami (oznaczonymi jako gdzie ) poniżej głównej przekątnej w n -tej kolumnie . Do tej operacji

Wykonujemy te operacje na wierszach, aby wyeliminować elementy do zera. możemy zamienić wiersze, aby dla Możemy tutaj zamienić wiersze, aby wykonać częściowe przestawienie lub ponieważ element na głównej przekątnej wynosi zero (a zatem nie można go użyć do implementacji eliminacji Gaussa).

Definiujemy ostateczną macierz permutacji macierz tożsamości, która ma wszystkie te same wiersze zamienione w tej samej kolejności macierz

Po przeprowadzeniu operacji na wierszach dla pierwszych kolumn otrzymaliśmy górną macierz trójkątną która wynosi oznaczony przez . Uwaga, możemy oznaczyć jako jako tą kolumnę nie ma warunków, dla których należy zamienić wiersze. Możemy również obliczyć trójkątną , tak że , bezpośrednio wprowadzając wartości wartości za pomocą poniższego wzoru.

Przykład

Jeśli otrzymamy macierz

zdecydujemy się zaimplementować częściowe obracanie, a tym samym zamienić pierwszy i drugi wiersz, tak aby nasza macierz iteracja naszej macierzy stały się odpowiednio
Po zamianie rzędów możemy wyeliminować elementy znajdujące się poniżej głównej przekątnej w pierwszej kolumnie, wykonując czynności
takie, że
Po odjęciu tych wierszy wyprowadziliśmy z macierzy
Ponieważ wdrażamy częściowe obracanie, zamieniamy odpowiednio drugi i trzeci wiersz naszej macierzy pochodnej oraz bieżącą wersję naszej macierzy, aby uzyskać
Teraz eliminujemy elementy poniżej głównej przekątnej w drugiej kolumnie, wykonując takie, że . Ponieważ żadne elementy niezerowe nie istnieją poniżej głównej przekątnej w naszej bieżącej iteracji , to odejmowanie wierszy wyprowadza naszą ostateczną macierz (oznaczoną jako ) } i końcowa macierz:
Teraz możemy uzyskać naszą ostateczną macierz:
Teraz te macierze mają taką relację, że .

Relacje, gdy żadne wiersze nie są zamienione

Jeśli w ogóle nie zamieniliśmy wierszy podczas tego procesu, możemy wykonać operacje na wierszach jednocześnie dla każdej kolumny, ) { (n)}:= L_ { n} gdzie jest macierzą identyczności N × n -tą kolumną zastąpioną wektor Innymi słowy, dolna macierz trójkątna

na wierszach dla pierwszych kolumn za pomocą jest równoważna znalezieniu rozkładu

Oznacz tak, że .

Teraz obliczmy sekwencję . Wiemy następującą

Jeśli istnieją dwie dolne trójkątne macierze z jedynkami na głównej przekątnej i żadna z nich nie ma elementu niezerowego poniżej głównej przekątnej w tej samej kolumnie co druga, możemy uwzględnić wszystkie elementy niezerowe w tym samym miejscu w produkcie z dwóch macierzy. Na przykład:

pomnóż razem i skondensowaną macierz oznaczoną jako jak wspomniano Używając macierzy , otrzymujemy

Oczywiste jest, że aby ten algorytm działał, na każdym kroku trzeba mieć (zobacz definicję ). Jeśli to założenie zawiedzie w pewnym momencie, przed kontynuowaniem należy zamienić n -ty wiersz z innym wierszem poniżej. To dlatego rozkład LU ogólnie wygląda tak: .

LU Rozkład krouta

Zauważ, że rozkład uzyskany dzięki tej procedurze jest rozkładem Doolittle'a : główna przekątna L składa się wyłącznie z 1 s. Gdybyśmy postępowali usuwając elementy powyżej głównej przekątnej, dodając wielokrotności kolumn ( zamiast usuwać elementy poniżej przekątnej, dodając wielokrotności wierszy ) , otrzymalibyśmy rozkład Crouta , w którym główna przekątna U wynosi 1 s .

Innym (równoważnym) sposobem uzyskania rozkładu Crouta danej macierzy A jest uzyskanie rozkładu Doolittle'a transpozycji A . , jeśli rozkładem LU uzyskanym za pomocą algorytmu przedstawionego w tej i mamy to jest rozkładem Crouta.

Poprzez rekurencję

Cormen i in. opisz rekurencyjny algorytm dekompozycji LUP.

Mając macierz A , niech P 1 będzie macierzą permutacji taką, że

,

gdzie , jeśli w pierwszej kolumnie A znajduje się wpis niezerowy ; lub w przeciwnym razie weź P 1 jako macierz tożsamości. Niech teraz , jeśli ; lub w przeciwnym razie. Mamy

możemy . Niech . Dlatego

który jest rozkładem LUP A .

Algorytm losowy

Możliwe jest znalezienie przybliżenia niskiego rzędu do rozkładu LU przy użyciu losowego algorytmu. Biorąc pod uwagę macierz wejściową pożądaną niską rangę losowa jednostka logiczna zwraca macierze permutacji i dolne/górne macierze trapezowe o rozmiarze i odpowiednio, takie, że z dużym prawdopodobieństwem , gdzie stałą zależną od parametrów algorytmu i to -ta pojedyncza wartość macierzy wejściowej .

Złożoność teoretyczna

Jeśli dwie macierze rzędu n można pomnożyć w czasie M ( n ), gdzie M ( n ) ≥ n a dla pewnego a > 2, to rozkład LU można obliczyć w czasie O ( M ( n )). Oznacza to na przykład, że istnieje algorytm O( n 2,376 ) oparty na algorytmie Coppersmitha-Winograda .

Dekompozycja macierzy rzadkiej

Opracowano specjalne algorytmy do rozkładu na czynniki dużych macierzy rzadkich . Algorytmy te próbują znaleźć rzadkie czynniki L i U . W idealnym przypadku koszt obliczeń jest określany przez liczbę niezerowych wpisów, a nie przez rozmiar macierzy.

Algorytmy te wykorzystują swobodę wymiany wierszy i kolumn, aby zminimalizować wypełnianie (wpisy, które zmieniają się od początkowego zera do wartości niezerowej podczas wykonywania algorytmu).

Ogólne traktowanie porządków, które minimalizują wypełnienie, można rozwiązać za pomocą teorii grafów .

Aplikacje

Rozwiązywanie równań liniowych

Dany układ równań liniowych w postaci macierzowej

chcemy rozwiązać równanie dla x , biorąc pod uwagę A i b . Załóżmy uzyskaliśmy już rozkład LUP A taki, że , więc .

W tym przypadku rozwiązanie odbywa się w dwóch logicznych krokach:

  1. Najpierw rozwiązujemy równanie dla y .
  2. Po drugie, rozwiązujemy równanie dla x }

W obu przypadkach mamy do czynienia z macierzami trójkątnymi ( L i U ), które można rozwiązać bezpośrednio przez podstawienie w przód iw tył bez stosowania procesu eliminacji Gaussa (jednak potrzebujemy tego procesu lub jego odpowiednika do obliczenia samego rozkładu LU ).

Powyższą procedurę można wielokrotnie zastosować do rozwiązania równania wiele razy dla różnych b . W takim przypadku szybsze (i wygodniejsze) jest wykonanie dekompozycji LU macierzy A raz, a następnie rozwiązanie trójkątnych macierzy dla różnych b , zamiast stosowania eliminacji Gaussa za każdym razem. Można by pomyśleć, że macierze L i U „zakodowały” proces eliminacji Gaussa.

Koszt rozwiązania układu równań liniowych macierz ma . To sprawia dwa razy szybszy niż algorytmy oparte na dekompozycji QR co kosztuje około operacji gdy Householder odzwierciedla są używane. Z tego powodu zwykle preferowana jest dekompozycja LU.

Odwracanie macierzy

Przy rozwiązywaniu układów równań b jest zwykle traktowane jako wektor o długości równej wysokości macierzy A . Jednak w odwróceniu macierzy zamiast wektora b mamy macierz B , gdzie B jest macierzą n -na- p , więc próbujemy znaleźć macierz X (również macierz n -na- p ):

Możemy użyć tego samego algorytmu przedstawionego wcześniej do rozwiązania dla każdej kolumny macierzy X . Załóżmy teraz, że B jest macierzą tożsamości o rozmiarze n . Wynikałoby z tego, że wynik X musi być odwrotnością A .

Obliczanie wyznacznika

Biorąc rozkład LUP wyznacznik A można bezpośrednio

Drugie równanie wynika z faktu, że wyznacznik macierzy trójkątnej jest po prostu iloczynem jej przekątnych wpisów, a wyznacznik macierzy permutacji jest równy (−1) S , gdzie S jest liczbą wymian wierszy w rozkładzie .

W przypadku rozkładu LU z pełnym obrotem, równa się również prawej stronie powyższego równania, jeśli pozwolimy być wymian wierszy i

Ta sama metoda może być łatwo zastosowana do rozkładu jednostek logicznych przez ustawienie P równego macierzy tożsamości.

Przykłady kodu

Przykład kodu C








 /* WEJŚCIE: A - tablica wskaźników do wierszy macierzy kwadratowej o wymiarze N  * Tol - mała tolerancja do wykrycia awarii, gdy macierz jest bliska degeneracji  * WYJŚCIE: Macierz A jest zmieniona, zawiera kopię obu macierzy LE i U jako A=(LE)+U takie, że P*A=L*U.  * Macierz permutacji nie jest przechowywana jako macierz, ale w wektorze całkowitym P o rozmiarze N+1  * zawierającym indeksy kolumn, gdzie macierz permutacji ma „1”. Ostatni element P[N]=S+N,   * gdzie S to liczba wymian wierszy potrzebnych do obliczenia wyznacznika, det(P)=(-1)^S  */  int          

         
       

       0    
         LUPDecompose  (  podwójne  **  A  ,  int  N  ,  podwójne  Tol  ,  int  *  P  )  {  int  i  ,  j  ,  k  ,  imax  ;  podwójne  maxA  ,  *  ptr  ,  absA  ;  dla  (  ja  =  ;  ja  <=  N  ;  ja  ++  )  P  [  ja    

       0     
          
          

               
                ]  =  ja  ;  // Macierz permutacji jednostek, P[N] zainicjowana N  for  (  i  =  ;  i  <  N  ;  i  ++  )  {  maxA  =  0.0  ;  imax  =  ja  ;  for  (  k  =  i  ;  k  <  N  ;  k  ++  )  if  ((  absA  =  fabs  (  A  [     
                  
                  
            

             0 

            
            
              
               k  ][  ja  ]))  >  maxA  )  {  maxA  =  absA  ;  imaks  =  k  ;  }  jeśli  (  maxA  <  Tol  )  powrót  ;  //niepowodzenie, macierz jest zdegenerowana  if  (  imax  !=  i  )  {  //obrót P  j  =  P  [  i  ];  P.  [  ja  ]  =  P.  [ 
              

            
              
              
              

            
            
        

             imax  ];  P.  [  imax  ]  =  j  ;  //przestawne wiersze A  ptr  =  A  [  i  ];  ZA  [  ja  ]  =  ZA  [  imaks  ];  ZA  [  imax  ]  =  ptr  ;  //liczenie osi zaczynając od N (dla wyznacznika)  P  [  N  ]  ++  ;  }  dla  (  j  =  i  +       
              

                     
                    1  ;  j  <  N  ;  j  ++  )  {  ZA  [  j  ][  ja  ]  /=  ZA  [  ja  ][  ja  ];  dla  (  k  =  ja  +  1  ;  k  <  N  ;  k  ++  )  ZA  [  jot  ][  k  ]  -=  ZA  [  jot  ][  ja  ]  *  
        
    

       





           

      ZA  [  ja  ][  k  ];  }  }  powrót  1  ;  //dekompozycja zakończona  }  /* INPUT: A,P wypełnione w LUPDecompose; b - wektor prawy;  N - wymiar   * WYJŚCIE: x - wektor rozwiązania A*x=b  */  void  LUPSolve  (  double  **  A  ,  int  *  P  ,  double  *  b  ,  int  N  ,  double  *  x  )  {  for  (    0     
          

            0    
                 int  ja  =  ;  ja  <  N  ;  ja  ++  )  {  x  [  ja  ]  =  b  [  P  [  ja  ]];  dla  (  int  k  =  ;  k  <  ja  ;  k  ++  )  x  [  ja  ]  -=  ZA  [  ja  ][  k  ]  *  x  [  k  ]; 
    

             0  
                  
                

         }  for  (  int  ja  =  N  -  1  ;  ja  >=  ;  ja  --  )  {  for  (  int  k  =  ja  +  1  ;  k  <  N  ;  k  ++  )  x  [  ja  ]  -=  ZA  [  ja  ][  k  ]  *  x  [  k  ];  x  [  ja   
    





         
  
        0     ]  /=  A  [  ja  ][  ja  ];  }  }  /* INPUT: A,P wypełnione w LUPDecompose; N - wymiar   * WYJŚCIE: IA jest odwrotnością początkowej macierzy  */  void  LUPInvert  (  double  **  A  ,  int  *  P  ,  int  N  ,  double  **  IA  )  {  for  (  int  j  =  ;  j  <  N  ;  j  
            0     
                    

                0    
                 ++  )  {  dla  (  int  ja  =  ;  ja  <  N  ;  ja  ++  )  {  JA  [  ja  ][  jot  ]  =  P.  [  ja  ]  ==  jot  ?  1,0  :  0,0  ;  dla  (  int  k  =  ;  k  <  ja  ;  k  ++  )  IA  [  ja     
        

                 0  
                      
                 ][  jot  ]  -=  ZA  [  ja  ][  k  ]  *  IA  [  k  ][  jot  ];  }  for  (  int  ja  =  N  -  1  ;  ja  >=  ;  ja  --  )  {  for  (  int  k  =  ja  +  1  ;  k  <  N  ;  k  ++  )  IA  [     

              
        
    





   ja  ][  j  ]  -=  ZA  [  ja  ][  k  ]  *  IA  [  k  ][  j  ];  IA  [  ja  ][  j  ]  /=  A  [  ja  ][  ja  ];  }  }  }  /* INPUT: A,P wypełnione w LUPDecompose; N - wymiar.   * WYJŚCIE: Funkcja zwraca wyznacznik macierzy początkowej  */  double  LUPDeterminant  (  double  **      

       00

            
          

           ZA  ,  int  *  P  ,  int  N  )  {  podwójne  det  =  ZA  [  ][  ];  for  (  int  i  =  1  ;  ja  <  N  ;  ja  ++  )  det  *=  ZA  [  ja  ][  ja  ];  powrót  (  P  [  N  ]  -  N  )  %  2  ==  0    
 ?  det  :  -  det  ;  } 

Przykład kodu C#

  

           
    
        
             
           0
            0 public  class  SystemOfLinearEquations  {  public  double  []  SolveUsingLU  (  double  [,]  matrix  ,  double  []  rightPart  ,  int  n  )  {  // dekompozycja macierzy  double  [,]  lu  =  new  double  [  n  ,  n  ];  podwójna  suma  =  ;  dla  (  int  i  =  ;     
        
                    
            
                  0
                    0    
                           ja  <  n  ;  ja  ++)  {  dla  (  int  j  =  ja  ;  j  <  n  ;  j  ++)  {  suma  =  ;  for  (  int  k  =  ;  k  <  ja  ;  k  ++)  suma  +=  lu  [  ja  ,  k  ]  *  lu  [  k  ,  j  ]; 
                      
            
                      
            
                  0
                    0    
                       lu  [  ja  ,  j  ]  =  macierz  [  ja  ,  j  ]  -  suma  ;  }  for  (  int  j  =  i  +  1  ;  j  <  n  ;  j  ++)  {  suma  =  ;  for  (  int  k  =  ;  k  <  i  ;  k  ++)  suma  +=  lu     
                           
            
        

        
        
             [  j  ,  k  ]  *  lu  [  k  ,  ja  ];  lu  [  j  ,  ja  ]  =  (  1  /  lu  [  ja  ,  ja  ])  *  (  macierz  [  j  ,  ja  ]  -  suma  );  }  }  // lu = L+UI  // znajdź rozwiązanie Ly = b  double  []  y  =  new  double 
            0    
        
              0
                0    
                     
               [  n  ];  for  (  int  ja  =  ;  ja  <  n  ;  ja  ++)  {  suma  =  ;  for  (  int  k  =  ;  k  <  ja  ;  k  ++)  suma  +=  lu  [  ja  ,  k  ]  *  y  [  k  ];  y  [  i  ]  =  prawa część  [   
        
        
            
                 0 
        
              0
                       ja  ]  -  suma  ;  }  // znajdź rozwiązanie Ux = y  double  []  x  =  new  double  [  n  ];  for  (  int  ja  =  n  -  1  ;  ja  >=  ;  ja  --)  {  suma  =  ;  dla  (  int  k  =  i  +  1  ;  k  <  n  ;  k  ++) 
                     
                     
        
         
    
 suma  +=  lu  [  ja  ,  k  ]  *  x  [  k  ];  x  [  ja  ]  =  (  1  /  lu  [  ja  ,  ja  ])  *  (  y  [  ja  ]  -  suma  );  }  zwróćx  ;  _  }  } 

Przykład kodu MATLAB

   
      
      
    
       
             
               funkcja  LU  =  LUDecompDoolittle  (  A  )  n  =  długość  (  A  );  LU  =  A  ;  % rozkładu macierzy, Metoda Doolittle'a  dla  i  =  1  :  1  :  n  dla  j  =  1  :(  i  -  1  )  LU  (  i  ,  j  )  =  (  LU  (  i  ,         
        
          
            j  )  -  LU  (  ja  ,  1  :(  j  -  1  ))  *  LU  (  1  :(  j  -  1  ),  j  ))  /  LU  (  j  ,  j  );  koniec  j  =  ja  :  n  ;  LU  (  ja  ,  j  )  =  LU  (  ja  ,  j  )  -      
    
    


   
      
      
     LU  (  ja  ,  1  :(  ja  -  1  ))  *  LU  (  1  :(  ja  -  1  ),  j  );  koniec %LU =   funkcja  końcowa  L+UI  x  =  SolveLinearSystem  (  LU, B  )  n  =  długość  (  LU  );  y  =  zera  (  rozmiar  (  B  ));  % znajdź rozwiązanie Ly = B 
       
            
    
    
      
        dla  i  =  1  :  n  y  (  ja  ,:)  =  B  (  ja  ,:)  -  LU  (  ja  ,  1  :  ja  )  *  y  (  1  :  ja  ,:);  end  % znajdź rozwiązanie Ux = y  x  =  zera  (  size  (  B  ));  dla  i  =  n  :(  -  1  ):  1 
                 
        


           x  (  ja  ,:)  =  (  y  (  ja  ,:)  -  LU  (  ja  , (  ja  +  1  ):  n  )  *  x  ((  ja  +  1  ):  n  ,:))  /  LU  (  ja  ,  ja  );  koniec  koniec  A  =  [  4  3  3  ;  6  3  3  ;  3  4   
  
               
   
   3  ]  LU  =  LUDecomp Doolittle  (  A  )  B  =  [  1  2  3  ;  4  5  6  ;  7  8  9  ;  10  11  12  ]  '  x  =  Rozwiąż układ liniowy  (  LU  ,  B  )  A  *  x 

Zobacz też

Notatki

Linki zewnętrzne

Bibliografia

Kod komputerowy

Zasoby online