Գաուս-Զեյդելի մեթոդը (Զեյդելի մեթոդ, Լիբմանի պրոցես, հաջորդական փոխարինումների մեթոդ) հանդիսանում է դասական իտերացիոն մեթոդով հավասարումների համակարգի լուծում։ Այն անվանվում է ի պատիվ Զեյդելի և Գաուսի։
Դիտարկենք հավասարումների համակարգը՝
, где
կամ
և ցույց տանք, թե ինչպես կարելի է լուծել այն Գաուս-Զեյդելի մեթոդով։
Մեթոդի էությունը պարզաբանելու համար առաջադրանքը գրենք հետևյալ տեսքով՝
Այստեղ -րդ հավասարումում մենք աջ մաս տեղափոխեցինք բոլոր այն անդամները, որտեղ բավարարում էր պայմանը։ Այս գրառումը կարող է ներկայացվել հետևյալ ձևով՝
որտեղ ընդունված նշանակումներով -ն մատրից է, որում գլխավոր անկյունագծի վրա գրված են մատրիցի համապատասխան անդամները, իսկ մնացած անդամները զրոներ են, այնինչ և մատրիցները պարունակում են մատրիցի վերևի և ներքևի եռանկյունային մասերը, որոնց գլխավոր անկյունագծի վրա զրոներ են։ Գաուս-Զեյդելի մեթոդում իտերացիոն պրոցեսը ստեղծվում է հետևյալ բանաձևով՝
համապատասխան սկզբնական մոտարկման ընտրությամբ։
Գաուս-Զեյդելի մեթոդը կարելի է դիտարկել որպես Յակոբիի մեթոդի մոդիֆիկացիա։ Մոդիֆիկացիայի հիմնական գաղափարը կայանում է նրանում, որ այստեղ նոր արժեքները օգտագործվում են անմիջապես ստանալուց հետո, այնինչ Յակոբիի մեթոդում այն չի օգտագործվում մինչև հաջորդ իտերացիան՝
որտեղ
Այսպիսով, -րդ կոմպոնենտի -րդ մոտարկման հաշվարկը կատարվում է
բանաձևով։
Օրինակ, -ի դեպքում`
Բերենք զուգամիտության մեթոդի բավարար պայման։
Զեյդելի պրոցեսի իտերացիայի ավարտի պայմանը անհրաժեշտ ճշգրտության դեպքում կրճատ ձևով ունի այսպիսի տեսք՝
Իտերացիոն պրոցեսի առավել ճշգրիտ պայմանը ունի այսպիսի տեսք՝
և պահանջում է ավելի շատ հաշվարկներ։ Այն բավականին հարմար է կտրտված մատրիցների համար։
#include #include 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; }
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
This article uses material from the Wikipedia Հայերեն article Գաուս-Զեյդելի մեթոդ, which is released under the Creative Commons Attribution-ShareAlike 3.0 license ("CC BY-SA 3.0"); additional terms may apply (view authors). Բովանդակությունը թողարկված է CC BY-SA 4.0 թույլատրագրով, եթե այլ բան նշված չէ։ Images, videos and audio are available under their respective licenses.
®Wikipedia is a registered trademark of the Wiki Foundation, Inc. Wiki Հայերեն (DUHOCTRUNGQUOC.VN) is an independent company and has no affiliation with Wiki Foundation.