Gauss-Jordan menetelmä
Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 9.6.2021 tarkistetusta
versiosta . tarkastukset vaativat
2 muokkausta .
Gauss-Jordan -menetelmä (tuntemattomien täydellisen eliminoinnin menetelmä) on menetelmä, jota käytetään lineaaristen algebrallisten yhtälöiden neliöjärjestelmien ratkaisemiseen , matriisin käänteisarvon löytämiseen, vektorin koordinaattien löytämiseen tietyssä kannassa tai järjestyksen löytämiseen. matriisista . Menetelmä on muunnos Gaussin menetelmästä . Nimetty C. F. Gaussin ja saksalaisen maanmittarin ja matemaatikon Wilhelm Jordanin mukaan [1] .
Algoritmi
- Valitse matriisin ensimmäinen vasen sarake , jossa on vähintään yksi nollasta poikkeava arvo.
- Jos tämän sarakkeen ylin luku on nolla, muuta matriisin koko ensimmäinen rivi toisella matriisin rivillä, jossa tässä sarakkeessa ei ole nollaa.
- Kaikki ensimmäisen rivin elementit jaetaan valitun sarakkeen ylimmällä elementillä.
- Jäljelle jäävistä riveistä vähennetään ensimmäinen rivi, joka kerrotaan vastaavan rivin ensimmäisellä elementillä, jotta jokaisen rivin (lukuun ottamatta ensimmäistä) ensimmäinen elementti saadaan nollaksi.
- Seuraavaksi sama toimenpide suoritetaan alkuperäisestä matriisista saadulle matriisille ensimmäisen rivin ja ensimmäisen sarakkeen poistamisen jälkeen.
- Kun tämä toimenpide on toistettu kerran, saadaan ylempi kolmiomatriisi
- Vähennä toiseksi viimeisestä rivistä viimeinen rivi kerrottuna sopivalla kertoimella, niin että vain 1 päälävistäjästä jää toiseksi viimeiselle riville .
- Toista edellinen vaihe seuraaville riveille. Tuloksena saadaan identiteettimatriisi ja ratkaisu vapaan vektorin tilalle (on tarpeen suorittaa kaikki samat muunnokset sen kanssa).
Laajennettu algoritmi matriisin käänteisarvon löytämiseksi
Anna annettu :
Siirto eteenpäin (algoritmi nollien muodostamiseksi päädiagonaalin alle)
- Jaetaan matriisin A ensimmäinen rivi luvulla, saadaan: , j on matriisin A sarake.
- Toistamme vaiheet matriisille I kaavan mukaan: , s on matriisin I sarake
Saamme:
- Muodostamme 0 ensimmäiseen sarakkeeseen:
- Toistamme vaiheet matriisille I kaavojen mukaisesti:
Saamme:
- jatkamme vastaavien toimintojen suorittamista kaavoilla:
edellyttäen että
- Toistamme vaiheet matriisille I kaavojen mukaisesti:
edellyttäen että
Saamme:
Käänteinen liike (algoritmi nollien muodostukselle päädiagonaalin yli)
Käytämme kaavaa: , edellyttäen että
Toistamme vaiheet matriisille I kaavan mukaan: , edellyttäen, että
Lopulta saamme:
Esimerkki
Seuraavan yhtälöjärjestelmän ratkaisemiseksi :
Kirjoitamme sen 3 × 4 -matriisin muodossa, jossa viimeinen sarake on vapaa jäsen:
Toimitaan seuraavasti:
- Lisää riville 2: −4 × rivi 1.
- Lisää riville 3: −9 × rivi 1.
Saamme:
- Lisää riville 3: −3 × rivi 2.
- Rivi 2 jaetaan −2:lla
- Lisää riville 1: −1 × rivi 3.
- Riville 2 lisätään: −3/2 × rivi 3.
- Lisää riville 1: −1 × rivi 2.
Oikeassa sarakkeessa saamme ratkaisun:
.
Algoritmin toteutus C#-ohjelmointikielellä
nimiavaruus Gauss_Jordan_Method
{
luokan matematiikkaa
{
/// <yhteenveto>
/// Gauss-Jordan-menetelmä (käänteismatriisi)
/// </summary>
/// <param name="Matrix">Alkuperäinen matriisi</param>
/// <palauttaa></palauttaa>
julkinen staattinen tupla [,] GaussJordan ( double [,] Matrix )
{
int n = Matriisi . GetLength ( 0 ); //Alkuperäisen matriisin mitat
double [,] xirtaM = uusi tupla [ n , n ]; //Identiteettimatriisi (toivottu käänteimatriisi)
for ( int i = 0 ; i < n ; i ++)
xirtaM [ i , i ] = 1 ;
double [,] Matrix_Big = uusi tupla [ n , 2 * n ]; //Yhteinen matriisi, joka saadaan yhdistämällä alkumatriisi ja identiteetti
for ( int i = 0 ; i < n ; i ++)
for ( int j = 0 ; j < n ; j ++)
{
Matriisi_Big [ i , j ] = Matriisi [ i , j ];
Matriisi_Suuri [ i , j + n ] = xirtaM [ i , j ];
}
//Siirto eteenpäin (vasemman alakulman nollaus)
for ( int k = 0 ; k < n ; k ++) //k-rivin numero
{
for ( int i = 0 ; i < 2 * n ; i ++) //i-sarakkeen numero
Matriisi_iso [ k , i ] = Matriisi_Suuri [ k , i ] / Matriisi [ k , k ]; //K-merkkijonon jakaminen ensimmäisellä jäsenellä !=0 sen muuntamiseksi yhdeksi
for ( int i = k + 1 ; i < n ; i ++) //k:n jälkeen seuraavan rivin i-numero
{
kaksinkertainen K = Matriisi_Suuri [ i , k ] / Matriisi_Suuri [ k , k ]; //Kerroin
for ( int j = 0 ; j < 2 * n ; j ++) //j-sarakkeen numero k:n jälkeen seuraavan rivin
Matriisi_Suuri [ i , j ] = Matriisi_Suuri [ i , j ] - Matriisi_Iso [ k , j ] * K ; //Matriisielementtien nollaus ensimmäisen jäsenen alapuolella muutettuna yhdeksi
}
for ( int i = 0 ; i < n ; i ++) //Päivitä, tee muutoksia alkuperäiseen matriisiin
for ( int j = 0 ; j < n ; j ++)
Matriisi [ i , j ] = Matriisi_Suuri [ i , j ];
}
//Käänteinen siirto (oikean yläkulman nollaus)
for ( int k = n - 1 ; k > - 1 ; k --) //k-rivin numero
{
for ( int i = 2 * n - 1 ; i > - 1 ; i --) //i-sarakkeen numero
Matriisi_iso [ k , i ] = Matriisi_Suuri [ k , i ] / Matriisi [ k , k ];
for ( int i = k - 1 ; i > - 1 ; i --) //k:n jälkeen seuraavan rivin i-numero
{
kaksinkertainen K = Matriisi_Suuri [ i , k ] / Matriisi_Suuri [ k , k ];
for ( int j = 2 * n - 1 ; j > - 1 ; j --) //j - sarakkeen numero k:n jälkeen seuraavan rivin
Matriisi_Suuri [ i , j ] = Matriisi_Suuri [ i , j ] - Matriisi_Iso [ k , j ] * K ;
}
}
//Ero yhteisestä matriisista
for ( int i = 0 ; i < n ; i ++)
for ( int j = 0 ; j < n ; j ++)
xirtaM [ i , j ] = Matriisi_Suuri [ i , j + n ];
paluu xirtaM ;
}
}
}
Muistiinpanot
- ↑ Jordanian nimen transkriptio "Jordaniksi" on virheellinen, mutta se on yleisesti hyväksytty ja löytyy useimmista venäjänkielisistä lähteistä.
Kirjallisuus
- Atkinson, Kendall A. (1989), An Introduction to Numerical Analysis (2. painos), New York: John Wiley & Sons , ISBN 978-0471624899 .
- Bolch, Gunter; Greiner, Stefan; de Meer, Hermann & Trivedi, Kishor S. (2006), Queuing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications (2. painos), Wiley-Interscience , ISBN 978-0-471-79156-0 .
- Calinger, Ronald (1999), A Contextual History of Mathematics , Prentice Hall , ISBN 978-0-02-318285-3 .
- Farebrother, RW (1988), Linear Least Squares Computations , TILASTOTIEDOT: Oppikirjat ja monografiat, Marcel Dekker, ISBN 978-0-8247-7661-9
- Higham, Nicholas (2002), Accuracy and Stability of Numerical Algorithms (2. painos), SIAM , ISBN 978-0-89871-521-7 .
- Katz, Victor J. (2004), A History of Mathematics, lyhyt versio , Addison-Wesley , ISBN 978-0-321-16193-2 .
- Lipson, Marc & Lipschutz, Seymour (2001), Schaumin pääpiirteet lineaarisen algebran teoriasta ja ongelmista , New York: McGraw-Hill , s. 69–80, ISBN 978-0-07-136200-9 .
- Press, W.H.; Teukolsky, SA; Vetterling, WT & Flannery, BP (2007), osio 2.2 , numeeriset reseptit: The Art of Scientific Computing (3. painos), New York: Cambridge University Press, ISBN 978-0-521-88068-8
Linkit