Jacobi-metoden er en variation af den simple iterationsmetode til løsning af et system af lineære algebraiske ligninger . Opkaldt efter Carl Gustav Jacobi .
Lad os tage et system af lineære ligninger:
, hvor
Eller
For at konstruere en iterativ procedure af Jacobi-metoden er det nødvendigt at udføre en foreløbig transformation af ligningssystemet til den iterative form . Det kan gøres i henhold til en af følgende regler:
hvor, i den accepterede notation, betyder en matrix, hvis hoveddiagonal indeholder de tilsvarende elementer i matrixen og alle andre nuller; mens matricer og indeholder øvre og nedre trekantede dele , på hoveddiagonalen af hvilke nuller, er identitetsmatrixen .
Så er proceduren for at finde en løsning:
Eller som en element-for-element-formel:
hvor er iterationstælleren.
I modsætning til Gauss-Seidel-metoden kan vi ikke erstatte med under den iterative procedure, da disse værdier vil være nødvendige for resten af beregningerne. Dette er den mest signifikante forskel mellem Jacobi-metoden og Gauss-Seidel-metoden til at løse SLAE . Ved hver iteration skal begge tilnærmelsesvektorer således lagres: den gamle og den nye.
Lad os præsentere en tilstrækkelig betingelse for metodens konvergens.
Sætning . Lad. Så for ethvert valg af indledende tilnærmelse:
|
Betingelsen for afslutningen af den iterative proces, når nøjagtigheden er opnået, har formen:
For en tilstrækkeligt velkonditioneret matrix (for ), holder det for
Dette kriterium kræver ikke beregning af matrixnormen og bruges ofte i praksis. I dette tilfælde har den nøjagtige betingelse for afslutningen af den iterative proces formen
og kræver yderligere matrix-vektor multiplikation ved hver iteration, hvilket omtrent fordobler beregningskompleksiteten af algoritmen.
Nedenfor er implementeringsalgoritmen i C++
#include <math.h> const dobbelt eps = 0,001 ; ///< ønsket præcision ................................ /// N - matrixdimension; A[N][N] - matrix af koefficienter, F[N] - kolonne med frie led, /// X[N] - indledende tilnærmelse, svaret skrives også i X[N]; void Jacobi ( int N , double ** A , double * F , double * X ) { double * TempX = ny dobbelt [ N ]; dobbelt norm ; // norm, defineret som den største forskel mellem x-kolonne komponenterne i tilstødende iterationer. gør { for ( int i = 0 ; i < N ; i ++ ) { TempX [ i ] = F [ i ]; for ( int g = 0 ; g < N ; g ++ ) { hvis ( i != g ) TempX [ i ] -= A [ i ][ g ] * X [ g ]; } TempX [ i ] /= A [ i ][ i ]; } norm = fabs ( X [ 0 ] - TempX [ 0 ]); for ( int h = 0 ; h < N ; h ++ ) { if ( fabs ( X [ h ] - TempX [ h ] ) > norm ) norm = fabs ( X [ h ] - TempX [ h ]); X [ h ] = TempX [ h ]; } } while ( norm > eps ); slet [] TempX ; }Følgende er implementeringsalgoritmen i Python
fra collections.abc importer Sequence , MutableSequence def Jacobi ( A : Sequence [ Sequence [ float ]], b : Sequence [ float ], eps : float = 0,001 , x_init : MutableSequence [ float ] | Ingen = Ingen ) -> list [ float ]: """ Jacobi-metode for A*x = b(*) :param A: Matrix (*) til venstre :param b: kendt vektor (*) til højre :param x_init: indledende tilnærmelse :return: omtrentlig x værdi (*) """ def sum ( a : Sekvens [ float ], x : Sekvens [ float ], j : int ) -> float : S : float = 0 for i , ( m , y ) i enumerate ( zip ( a , x )): hvis i != j : S += m * y returnerer S def norm ( x : Sekvens [ float ], y : Sekvens [ float ]) -> float : return max (( abs ( x0 - y0 ) for x0 , y0 i zip ( x , y ))) hvis x_init er Ingen : y = [ a / A [ i ][ i ] for i , a i opregn ( b ) ] ellers : y = x . kopi () x : liste [ float ] = [ - ( sum ( a , y , i ) - b [ i ]) / A [ i ][ i ] for i , a i opregn ( A )] mens norm ( y , x ) > eps : for i , elem i enumerate ( x ): y [ i ] = elem for i , a i enumerate ( A ): x [ i ] = - ( sum ( a , y , i ) ) - b [ i ]) / A [ i ][ i ] returner xSLAE | Metoder til løsning af|
---|---|
Direkte metoder | |
Iterative metoder | |
Generel |