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

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Jump to navigation Jump to search

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

Խնդրի դրվածքը[խմբագրել | խմբագրել կոդը]

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

, где

կամ

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

Մեթոդը[խմբագրել | խմբագրել կոդը]

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

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

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

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

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

որտեղ

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

բանաձևով։

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

, այսինքն
, այսինքն
, այսինքն

Զուգամիտության պայման[խմբագրել | խմբագրել կոդը]

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

Logo arte.jpg Թեորեմ.
Դիցուկ , որտեղ մատրիցն հակադարձ է մատրիցին։ Այդ դեպքում ցանկացած սկզբնական մոտարկման ընտրության դեպքում՝
  1. Գաուս-Զեյդելի մեթոդը զուգամիտում է,
  2. մեթոդի զուգամիտության արագությունը հավասար է երկրաչափական պրոգրեսիայի զուգամիտության արագությանը հայտարարով,
  3. ճիշտ է գնահատման սխալը։

Դադարեցման պայմանը[խմբագրել | խմբագրել կոդը]

Զեյդելի պրոցեսի իտերացիայի ավարտի պայմանը անհրաժեշտ ճշգրտության դեպքում կրճատ ձևով ունի այսպիսի տեսք՝

Իտերացիոն պրոցեսի առավել ճշգրիտ պայմանը ունի այսպիսի տեսք՝

և պահանջում է ավելի շատ հաշվարկներ։ Այն բավականին հարմար է կտրտված մատրիցների համար։

Իրականացման օրինակ C++ - ում[խմբագրել | խմբագրել կոդը]

  1 #include <iostream>
  2 #include <cmath>
  3 
  4 using namespace std;
  5 
  6 // Ավարտի պայման
  7 bool converge(double xk[10], double xkp[10], int n, double eps)
  8 {
  9 	double norm = 0;
 10 	for (int i = 0; i < n; i++)
 11 		norm += (xk[i] - xkp[i]) * (xk[i] - xkp[i]);
 12 	return (sqrt(norm) < eps);
 13 }
 14 
 15 double okr(double x, double eps)
 16 {
 17 	int i = 0;
 18 	while (eps != 1)
 19 	{
 20 		i++;
 21 		eps *= 10;
 22 	}
 23 	int okr = pow(double(10), i);
 24 	x = int(x * okr + 0.5) / double(okr);
 25 
 26 	return x;
 27 }
 28 
 29 bool diagonal(double a[10][10], int n)
 30 {
 31 	int i, j, k = 1;
 32 	double sum;
 33 	for (i = 0; i < n; i++) {
 34 		sum = 0;
 35 		for (j = 0; j < n; j++) sum += a[i][j];
 36 		sum -= a[i][i];
 37 		if (sum > a[i][i]) 
 38 		{
 39 			k = 0; 
 40 			cout << a[i][i] << " < " << sum << endl;
 41 		}
 42 		else
 43 		{
 44 			cout << a[i][i] << " > " << sum << endl;
 45 		}
 46 		
 47 
 48 	}
 49 
 50 	return (k == 1);
 51 
 52 }
 53 
 54 int main()
 55 {
 56 	setlocale(LC_ALL, "");
 57 
 58 	double eps, a[10][10], b[10], x[10], p[10];
 59 	int n, i, j, m = 0;
 60 	int method;
 61 	cout << "Մուտքագրել քառակուսի մատրիցի չափը՝ ";
 62 	cin >> n;
 63 	cout << "Մուտքագրել հաշվարկի ճշտությունը՝ ";
 64 	cin >> eps;
 65 	cout << "Մուտքագրել А մատրիցն՝ " << endl << endl;
 66 	for (i = 0; i < n; i++)
 67 		for (j = 0; j < n; j++)
 68 		{
 69 			cout << "A[" << i << "][" << j << "] = ";
 70 			cin >> a[i][j];
 71 		}
 72 	cout << endl << endl;
 73 	cout << " Ձեր А մատրիցն՝ " << endl << endl;
 74 	for (i = 0; i < n; i++)
 75 	{
 76 		for (j = 0; j < n; j++)
 77 			cout << a[i][j] << " ";
 78 		cout << endl;
 79 	}
 80 
 81 	cout << endl;
 82 
 83 	cout << "Լրացրեք ազատ անդամների սյունը՝ " << endl << endl;
 84 	for (i = 0; i < n; i++)
 85 	{
 86 		cout << "В[" << i + 1 << "] = ";
 87 		cin >> b[i];
 88 	}
 89 
 90 	cout << endl << endl;
 91 
 92 	/*
 93 	Քայլ մեթոդ, որտեղ:
 94 	a[n][n] - մատրիցի գործակիցներն են
 95 	x[n], p[n] - Ընթացիկ և նախորդ լուծումները
 96 	b[n] - Աջ մասերի սյունը
 97 	Բոլոր թվարկված զանգվածները իրական են և
 98 	պետք է որոշված լինեն հիմնական ծրագրում,
 99 	ինչպես նաև x[n] մասիվում անհրաժեշտ է լրացնել սկզբնական
100 	սյան լուծումի մոտարկումը (օրիակ, բոլորը զրոներ)
101 	*/
102 
103 	for (int i = 0; i < n; i++)
104 		x[i] = 1;
105 
106 	cout << "Անկյունագծային գերակշռություն՝ " << endl;
107 	if (diagonal(a, n)) {
108 		do
109 		{
110 			for (int i = 0; i < n; i++)
111 				p[i] = x[i];
112 			for (int i = 0; i < n; i++)
113 			{
114 				double var = 0;
115 				for (int j = 0; j < i; j++)
116 					var += (a[i][j] * x[j]);
117 				for (int j = i + 1; j < n; j++)
118 					var += (a[i][j] * p[j]);
119 				x[i] = (b[i] - var) / a[i][i];
120 			}
121 			m++;
122 		} while (!converge(x, p, n, eps));
123 
124 		cout << "Համակարգի լուծում՝" << endl << endl;
125 		for (i = 0; i < n; i++) cout << "x" << i << " = " << okr(x[i], eps) << "" << endl;
126 		cout << "Իտերացիա՝ " << m << endl;
127 	}
128 	else {
129 		cout << "Չի կատարվում անկյունագծերի գերակշռություն։" << endl;
130 	}
131 
132 	system("pause");
133 	return 0;
134 }

Իրականացման օրինակ 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

Տես նաև[խմբագրել | խմբագրել կոդը]

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. Ա․Գ․ Կուրոշ, Բարձրագույն հանրահաշվի դասընթաց, «Լույս» հրատարակչություն, Երևան, 1965

Արտաքին հղումներ[խմբագրել | խմբագրել կոդը]