Метод Гаусса — Зейделя

Матеріал з testwiki
Версія від 12:30, 12 травня 2024, створена imported>Binc (Binc перейменував сторінку з Метод Гауса — Зейделя на Метод Гаусса — Зейделя: Правопис)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Шаблон:Інші значенняМетод Гаусса — Зайделя[1][2] є класичним ітераційним методом розв'язку системи лінійних рівнянь.

Постановка задачі

Візьмемо систему: Ax=b, де A=(a11a1nan1ann),b=(b1bn)

Або {a11x1++a1nxn=b1an1x1++annxn=bn

І покажемо, як її можна розв'язати за допомогою методу Гаусса — Зайделя.

Метод

Щоб пояснити зміст методу, перепишемо задачу у вигляді:

{a11x1=a12x2a13x3a1nxn+b1a21x1+a22x2=a23x3a2nxn+b2a(n1)1x1+a(n1)2x2++a(n1)(n1)xn1=a(n1)nxn+bn1an1x1+an2x2++an(n1)xn1+annxn=bn

Тут в j-му рівнянні ми перенесли в праву частину всі члени, що містять xi, для i>j. Отримана система може бути представлена:

(L+D)x=Ux+b,

де в прийнятих позначеннях D означає матрицю, у якої на головній діагоналі стоять відповідні елементи матриці A, а всі інші — нулі; тоді як матриці U та L містять верхню і нижню трикутні частини A, на головній діагоналі яких нулі.

Ітеративний процес в методі Гаусса — Зайделя будується за формулою

(L+D)x(k+1)=Ux(k)+b,k=0,1,2,

після вибору відповідного початкового наближення x(0).

Метод Гаусса — Зайделя можна розглядати як модифікацію методу Якобі. Основна ідея модифікації полягає в тому, що нові значення x(i) використовуються тут одразу ж у міру отримання, в той час як у методі Якобі вони не використовуються до наступної ітерації:

{x1(k+1)=c12x2(k)+c13x3(k)++c1nxn(k)+d1x2(k+1)=c21x1(k+1)+c23x3(k)++c2nxn(k)+d2xn(k+1)=cn1x1(k+1)+cn2x2(k+1)++cn(n1)xn1(k+1)+dn,

де cij=aijaii,di=biaii,i=1,,n

Таким чином i-й компонент (k+1)-го наближення обчислюється за формулою:

xi(k+1)=j=1i1cijxj(k+1)+j=i+1ncijxj(k)+di,i=1,,n

Умова збіжності

Наведемо достатню умову збіжності методу.

Шаблон:Mbox

Умова завершення

Умова завершення ітераційного процесу Гаусса — Зайделя при досягненні точності ε у спрощеній формі має вигляд:

x(k+1)x(k)ε

Точніша умова завершення ітераційного процесу має вигляд

Ax(k)bε

і потребує більше обчислень. Добре підходить для розріджених матриць.

Приклад алгоритму на С++

 // Умова завершення
bool converge(double *xk, double* xkp)
{
    bool b = true;
    for (int i = 0; i < n; i++)
    {
        if (fabs(xk[i]-xkp[i]) > eps) 
        {
            b = false;
            break;
        }
    }
    return b;
}

while(!converge(x,p))
{
    for(int i = 0; i < n; i++)
    {
        var = 0;
        for(int j = 0; j < n; j++)
        {
            if(j != i)
                var += (a[i][j]*x[j]);
        }
        p[i] = x[i];
        x[i]=(b[i] - var)/a[i][i];
    }
}

Примітки

Шаблон:Примітки

Див. також