Գաուս-Զեյդելի մեթոդ

Գաուս-Զեյդելի մեթոդը (Զեյդելի մեթոդ, Լիբմանի պրոցես, հաջորդական փոխարինումների մեթոդ) հանդիսանում է դասական իտերացիոն մեթոդով հավասարումների համակարգի լուծում ։ Այն անվանվում է ի պատիվ Զեյդելի և Գաուսի։

Խնդրի դրվածքը 
Դիտարկենք հավասարումների համակարգը՝

, где 

կամ

և ցույց տանք, թե ինչպես կարելի է լուծել այն Գաուս-Զեյդելի մեթոդով։

Մեթոդը 
Մեթոդի էությունը պարզաբանելու համար առաջադրանքը գրենք հետևյալ տեսքով՝

Այստեղ -րդ հավասարումում մենք աջ մաս տեղափոխեցինք բոլոր այն  անդամները, որտեղ բավարարում էր  պայմանը։ Այս գրառումը կարող է ներկայացվել հետևյալ ձևով՝

որտեղ ընդունված նշանակումներով -ն մատրից է, որում գլխավոր անկյունագծի վրա գրված են   մատրիցի համապատասխան անդամները, իսկ մնացած անդամները զրոներ են, այնինչ  և  մատրիցները պարունակում են  մատրիցի վերևի և ներքևի եռանկյունային մասերը, որոնց գլխավոր անկյունագծի վրա զրոներ են։
Գաուս-Զեյդելի մեթոդում իտերացիոն պրոցեսը ստեղծվում է հետևյալ բանաձևով՝

համապատասխան  սկզբնական մոտարկման ընտրությամբ։

Գաուս-Զեյդելի մեթոդը կարելի է դիտարկել որպես Յակոբիի մեթոդի մոդիֆիկացիա։ Մոդիֆիկացիայի հիմնական գաղափարը կայանում է նրանում, որ այստեղ  նոր արժեքները օգտագործվում են անմիջապես ստանալուց հետո, այնինչ Յակոբիի մեթոդում այն չի օգտագործվում մինչև հաջորդ իտերացիան՝

որտեղ

Այսպիսով, -րդ կոմպոնենտի -րդ մոտարկման հաշվարկը կատարվում է 

բանաձևով։

Օրինակ, -ի դեպքում`
 , այսինքն 
 , այսինքն 
 , այսինքն

Զուգամիտության պայման 
Բերենք զուգամիտության մեթոդի բավարար պայման։

Դադարեցման պայմանը 
Զեյդելի պրոցեսի իտերացիայի ավարտի պայմանը անհրաժեշտ   ճշգրտության դեպքում կրճատ ձևով ունի այսպիսի տեսք՝
 
Իտերացիոն պրոցեսի առավել ճշգրիտ պայմանը ունի այսպիսի տեսք՝
 
և պահանջում է ավելի շատ հաշվարկներ։ Այն բավականին հարմար է կտրտված մատրիցների համար։

Իրականացման օրինակ C++ - ում  
#include <iostream>
#include <cmath>

using namespace std;

// Ավարտի պայման
bool converge(double xk[10], double xkp[10], int n, double eps)
{
	double norm = 0;
	for (int i = 0; i < n; i++)
		norm += (xk[i] - xkp[i]) * (xk[i] - xkp[i]);
	return (sqrt(norm) < eps);
}

double okr(double x, double eps)
{
	int i = 0;
	while (eps != 1)
	{
		i++;
		eps *= 10;
	}
	int okr = pow(double(10), i);
	x = int(x * okr + 0.5) / double(okr);

	return x;
}

bool diagonal(double a[10][10], int n)
{
	int i, j, k = 1;
	double sum;
	for (i = 0; i < n; i++) {
		sum = 0;
		for (j = 0; j < n; j++) sum += a[i][j];
		sum -= a[i][i];
		if (sum > a[i][i]) 
		{
			k = 0; 
			cout << a[i][i] << " < " << sum << endl;
		}
		else
		{
			cout << a[i][i] << " > " << sum << endl;
		}
		

	}

	return (k == 1);

}

int main()
{
	setlocale(LC_ALL, "");

	double eps, a[10][10], b[10], x[10], p[10];
	int n, i, j, m = 0;
	int method;
	cout << "Մուտքագրել քառակուսի մատրիցի չափը՝ ";
	cin >> n;
	cout << "Մուտքագրել հաշվարկի ճշտությունը՝ ";
	cin >> eps;
	cout << "Մուտքագրել А մատրիցն՝ " << endl << endl;
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
		{
			cout << "A[" << i << "][" << j << "] = ";
			cin >> a[i][j];
		}
	cout << endl << endl;
	cout << " Ձեր А մատրիցն՝ " << endl << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
			cout << a[i][j] << " ";
		cout << endl;
	}

	cout << endl;

	cout << "Լրացրեք ազատ անդամների սյունը՝ " << endl << endl;
	for (i = 0; i < n; i++)
	{
		cout << "В[" << i + 1 << "] = ";
		cin >> b[i];
	}

	cout << endl << endl;

	/*
	Քայլ մեթոդ, որտեղ։
	a[n][n] - մատրիցի գործակիցներն են
	x[n], p[n] - Ընթացիկ և նախորդ լուծումները
	b[n] - Աջ մասերի սյունը
	Բոլոր թվարկված զանգվածները իրական են և
	պետք է որոշված լինեն հիմնական ծրագրում,
	ինչպես նաև x[n] մասիվում անհրաժեշտ է լրացնել սկզբնական
	սյան լուծումի մոտարկումը (օրիակ, բոլորը զրոներ)
	*/

	for (int i = 0; i < n; i++)
		x[i] = 1;

	cout << "Անկյունագծային գերակշռություն՝ " << endl;
	if (diagonal(a, n)) {
		do
		{
			for (int i = 0; i < n; i++)
				p[i] = x[i];
			for (int i = 0; i < n; i++)
			{
				double var = 0;
				for (int j = 0; j < i; j++)
					var += (a[i][j] * x[j]);
				for (int j = i + 1; j < n; j++)
					var += (a[i][j] * p[j]);
				x[i] = (b[i] - var) / a[i][i];
			}
			m++;
		} while (!converge(x, p, n, eps));

		cout << "Համակարգի լուծում՝" << endl << endl;
		for (i = 0; i < n; i++) cout << "x" << i << " = " << okr(x[i], eps) << "" << endl;
		cout << "Իտերացիա՝ " << m << endl;
	}
	else {
		cout << "Չի կատարվում անկյունագծերի գերակշռություն։" << endl;
	}

	system("pause");
	return 0;
}

Իրականացման օրինակ Python - ում  
from math import sqrt
import numpy as np

def seidel(A, b, eps):
    n = len(A)
    x = [.0 for i in range(n)]

    converge = False
    while not converge:
        x_new = np.copy(x)
        for i in range(n):
            s1 = sum(A[i][j] * x_new[j] for j in range(i))
            s2 = sum(A[i][j] * x[j] for j in range(i + 1, n))
            x_new[i] = (b[i] - s1 - s2) / A[i][i]

        converge = sqrt(sum((x_new[i] - x[i]) ** 2 for i in range(n))) <= eps
        x = x_new

    return x

Տես նաև 
 Երկրաչափական պրոգրեսիա
 Պարզ իտերացիայի մեթոդ
 Յակոբիի մեթոդ
 Բանախի թեորեմ
 Իտերացիայի մեթոդ

Ծանոթագրություններ

Արտաքին հղումներ 
https://www.maa.org/press/periodicals/loci/joma/iterative-methods-for-solving-iaxi-ibi-gauss-seidel-method
https://www3.nd.edu/~zxu2/acms40390F12/Lec-7.3.pdf
http://mathworld.wolfram.com/Gauss-SeidelMethod.html

Մաթեմատիկա
Թվային մեթոդներ
Գծային հանրահաշիվ
Գիտություն