Գաուս-Զեյդելի մեթոդը (Զեյդելի մեթոդ, Լիբմանի պրոցես, հաջորդական փոխարինումների մեթոդ) հանդիսանում է դասական իտերացիոն մեթոդով հավասարումների համակարգի լուծում[1]։ Այն անվանվում է ի պատիվ Զեյդելի և Գաուսի։
Խնդրի դրվածքը
Դիտարկենք հավասարումների համակարգը՝
, где
կամ
և ցույց տանք, թե ինչպես կարելի է լուծել այն Գաուս-Զեյդելի մեթոդով։
Մեթոդը
Մեթոդի էությունը պարզաբանելու համար առաջադրանքը գրենք հետևյալ տեսքով՝
Այստեղ -րդ հավասարումում մենք աջ մաս տեղափոխեցինք բոլոր այն անդամները, որտեղ բավարարում էր պայմանը։ Այս գրառումը կարող է ներկայացվել հետևյալ ձևով՝
որտեղ ընդունված նշանակումներով -ն մատրից է, որում գլխավոր անկյունագծի վրա գրված են մատրիցի համապատասխան անդամները, իսկ մնացած անդամները զրոներ են, այնինչ և մատրիցները պարունակում են մատրիցի վերևի և ներքևի եռանկյունային մասերը, որոնց գլխավոր անկյունագծի վրա զրոներ են։
Գաուս-Զեյդելի մեթոդում իտերացիոն պրոցեսը ստեղծվում է հետևյալ բանաձևով՝
համապատասխան սկզբնական մոտարկման ընտրությամբ։
Գաուս-Զեյդելի մեթոդը կարելի է դիտարկել որպես Յակոբիի մեթոդի մոդիֆիկացիա։ Մոդիֆիկացիայի հիմնական գաղափարը կայանում է նրանում, որ այստեղ նոր արժեքները օգտագործվում են անմիջապես ստանալուց հետո, այնինչ Յակոբիի մեթոդում այն չի օգտագործվում մինչև հաջորդ իտերացիան՝
որտեղ
Այսպիսով, -րդ կոմպոնենտի -րդ մոտարկման հաշվարկը կատարվում է
բանաձևով։
Օրինակ, -ի դեպքում`
- , այսինքն
- , այսինքն
- , այսինքն
Զուգամիտության պայման
Բերենք զուգամիտության մեթոդի բավարար պայման։
|
Թեորեմ. Դիցուկ , որտեղ մատրիցն հակադարձ է մատրիցին։ Այդ դեպքում ցանկացած սկզբնական մոտարկման ընտրության դեպքում՝
- Գաուս-Զեյդելի մեթոդը զուգամիտում է,
- մեթոդի զուգամիտության արագությունը հավասար է երկրաչափական պրոգրեսիայի զուգամիտության արագությանը հայտարարով,
- ճիշտ է գնահատման սխալը։
|
|
Դադարեցման պայմանը
Զեյդելի պրոցեսի իտերացիայի ավարտի պայմանը անհրաժեշտ ճշգրտության դեպքում կրճատ ձևով ունի այսպիսի տեսք՝
Իտերացիոն պրոցեսի առավել ճշգրիտ պայմանը ունի այսպիսի տեսք՝
և պահանջում է ավելի շատ հաշվարկներ։ Այն բավականին հարմար է կտրտված մատրիցների համար։
Իրականացման օրինակ 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
Տես նաև
Ծանոթագրություններ
- ↑ Ա․Գ․ Կուրոշ, Բարձրագույն հանրահաշվի դասընթաց, «Լույս» հրատարակչություն, Երևան, 1965
Արտաքին հղումներ