http://www.math.hut.fi/teaching/v/3/L/G-J.html
[Up]

Gauss ja Gauss-Jordan

Gauss-Jordan, KRE s. 366, Example 1 (käänteismatriisin yhteydessä)
(GREE esim. kts. s. 13 )

Maplessa matriisioperaatioita varten ladataan paketti linalg Tarvittavat Maple-komennot:

   matrix, vector, augment, addrow, mulrow,
   gaussjord (relevantti myös gausselim)
> with(linalg):

Matriisi voidaan muodostaa matrix-komennolla vaakarivien (listojen) listana
( tai muodossa matrix(4,6,[1,-1,....,-2,1]); )

> A:=matrix([[1,-1,1,0,0,2],[1,1,2,4,1,2],[0,2,1,4,3,1],[1,-3,0,-4,-2,1]]);

                               [ 1  -1  1   0   0  2 ]
                               [                     ]
                               [ 1   1  2   4   1  2 ]
                          A := [                     ]
                               [ 0   2  1   4   3  1 ]
                               [                     ]
                               [ 1  -3  0  -4  -2  1 ]

> b:=vector([0,3,2,0]);

                               b := [ 0, 3, 2, 0 ]
Komennolla augment liitetään sarakevektori matriisin perään. Näin saadaan "augmented matrix", vrt. KRE s. 345.
 
> Ab:=augment(A,b);

                              [ 1  -1  1   0   0  2  0 ]
                              [                        ]
                              [ 1   1  2   4   1  2  3 ]
                        Ab := [                        ]
                              [ 0   2  1   4   3  1  2 ]
                              [                        ]
                              [ 1  -3  0  -4  -2  1  0 ]

Komento addrow(M,r1,r2,c) palauttaa matriisin, jossa M:n rivi r2 on korvattu vektorilla c*row(M,r1) + row(M,r2)

1. sarake:

> Ab:=addrow(Ab,1,2,-1);  # muutettava_rivi_no=2, kerroin = -1
                          # kerrottava ja yhteenlaskettava rivi_no=1 

                              [ 1  -1  1   0   0  2  0 ]
                              [                        ]
                              [ 0   2  1   4   1  0  3 ]
                        Ab := [                        ]
                              [ 0   2  1   4   3  1  2 ]
                              [                        ]
                              [ 1  -3  0  -4  -2  1  0 ]

> Ab:=addrow(Ab,1,4,-1); # muutettava_rivi_no=4, kerroin = -1
                         # kerrottava ja yhteenlaskettava rivi_no=1

                             [ 1  -1   1   0   0   2  0 ]
                             [                          ]
                             [ 0   2   1   4   1   0  3 ]
                       Ab := [                          ]
                             [ 0   2   1   4   3   1  2 ]
                             [                          ]
                             [ 0  -2  -1  -4  -2  -1  0 ]

2. sarake:


> Ab:=addrow(Ab,2,3,-1);  # muutettava_rivi_no=3, kerroin = -1
                          # kerrottava ja yhteenlaskettava rivi_no=2

                             [ 1  -1   1   0   0   2   0 ]
                             [                           ]
                             [ 0   2   1   4   1   0   3 ]
                       Ab := [                           ]
                             [ 0   0   0   0   2   1  -1 ]
                             [                           ]
                             [ 0  -2  -1  -4  -2  -1   0 ]

> Ab:=addrow(Ab,2,4,1);

                              [ 1  -1  1  0   0   2   0 ]
                              [                         ]
                              [ 0   2  1  4   1   0   3 ]
                        Ab := [                         ]
                              [ 0   0  0  0   2   1  -1 ]
                              [                         ]
                              [ 0   0  0  0  -1  -1   3 ]

5. sarake:

> Ab:=addrow(Ab,3,4,1/2);

                             [ 1  -1  1  0  0    2    0  ]
                             [                           ]
                             [ 0   2  1  4  1    0    3  ]
                       Ab := [                           ]
                             [ 0   0  0  0  2    1    -1 ]
                             [                           ]
                             [ 0   0  0  0  0  -1/2  5/2 ]
Nyt olemme saaneet Gaussin eliminaation suoritetuksi. Ratkaisu voidaan lukea suoraan: Alimmasta saadaan x6, toiseksi alimmasta x5.
Toisessa yhtälössä on kaksi "ylimääräistä vaakaporrasta", x4 ja x3 voidaan siksi valita vapaiksi parametreiksi ja ratkaista toisesta yhtälöstä x2. Ensimmäisestä saadaan x1

Olemme siis suorittaneet Gaussin eliminaation ja saattaneet systeemin yläkolmiomuotoon. Tälle muodolle käytetään nimeä "(rivi)porrasmuoto", "row-echelon form" ja lyhennettä ref

Käytännössä ratkaisut lasketaan tästä muodosta. Teoreettisesti kauniimpi on ns. redusoitu porrasmuoto, "reduced row-echelon form". Lyhenne: rref.

Takaisinsijoitus rivioperaatioilla, Gauss-Jordan, rref

Suoritamme yllä olevat vaiheet samanlaisilla rivioperaatioilla, jotka nyt etenevät alhaalta ylös.

Ensin normeeraus

> Ab:=mulrow(Ab,4,-2);  # Rivi_no 4 kerrotaan luvulla -2

                               [ 1  -1  1  0  0  2   0 ]
                               [                       ]
                               [ 0   2  1  4  1  0   3 ]
                         Ab := [                       ]
                               [ 0   0  0  0  2  1  -1 ]
                               [                       ]
                               [ 0   0  0  0  0  1  -5 ]

> Ab:=mulrow(Ab,3,1/2);

                             [ 1  -1  1  0  0   2     0  ]
                             [                           ]
                             [ 0   2  1  4  1   0     3  ]
                       Ab := [                           ]
                             [ 0   0  0  0  1  1/2  -1/2 ]
                             [                           ]
                             [ 0   0  0  0  0   1    -5  ]

> Ab:=mulrow(Ab,2,1/2);

                           [ 1  -1   1   0   0    2     0  ]
                           [                               ]
                           [ 0   1  1/2  2  1/2   0    3/2 ]
                     Ab := [                               ]
                           [ 0   0   0   0   1   1/2  -1/2 ]
                           [                               ]
                           [ 0   0   0   0   0    1    -5  ]

Aloitetaan rivioperaatiot

6. sarake:

> Ab:=addrow(Ab,4,3,-1/2);

                            [ 1  -1   1   0   0   2   0  ]
                            [                            ]
                            [ 0   1  1/2  2  1/2  0  3/2 ]
                      Ab := [                            ]
                            [ 0   0   0   0   1   0   2  ]
                            [                            ]
                            [ 0   0   0   0   0   1   -5 ]

> Ab:=addrow(Ab,4,1,-2);

                            [ 1  -1   1   0   0   0   10 ]
                            [                            ]
                            [ 0   1  1/2  2  1/2  0  3/2 ]
                      Ab := [                            ]
                            [ 0   0   0   0   1   0   2  ]
                            [                            ]
                            [ 0   0   0   0   0   1   -5 ]

5. sarake:

> Ab:=addrow(Ab,3,2,-1/2);

                             [ 1  -1   1   0  0  0   10 ]
                             [                          ]
                             [ 0   1  1/2  2  0  0  1/2 ]
                       Ab := [                          ]
                             [ 0   0   0   0  1  0   2  ]
                             [                          ]
                             [ 0   0   0   0  0  1   -5 ]

2. sarake:

> Ab:=addrow(Ab,2,1,1);

                             [ 1  0  3/2  2  0  0  21/2 ]
                             [                          ]
                             [ 0  1  1/2  2  0  0   1/2 ]
                       Ab := [                          ]
                             [ 0  0   0   0  1  0    2  ]
                             [                          ]
                             [ 0  0   0   0  0  1   -5  ]

Nyt on redusoitu porrasmuoto valmis. Tarkistetaan vielä
> gaussjord(augment(A,b));  

                          [ 1  0  3/2  2  0  0  21/2 ]
                          [                          ]
                          [ 0  1  1/2  2  0  0   1/2 ]
                          [                          ]
                          [ 0  0   0   0  1  0    2  ]
                          [                          ]
                          [ 0  0   0   0  0  1   -5  ]

Kylla vaan!!

Matlabilla:

>> rref([A b])

This page created by <Heikki.Apiola@hut.fi>
Tue Sep 12 15:26:56 EEST 2000