Յակոբիի մեթոդ

testwiki-ից
Jump to navigation Jump to search

Յակոբիի մեթոդը գծային հանրահաշվում հավասարումների համակարգերի լուծման պարզ իտերացիայի տարատեսակներից է։ Այն անվանվել է ի պատիվ Կարլ Գուստավ Յակոբիի[1]։

Խնդրի դրվածքը

Վերցնենք գծային հավասարումների համակարգը.

Ax=b, где A=(a11a1nan1ann),b=(b1bn)

կամ

{a11x1++a1nxn=b1an1x1++annxn=bn

Մեթոդի նկարագրությունը

Որպեսզի կառուցենք Յակոբիի մեթոդի իտերատիվ ընթացակարգը, անհրաժեշտ է իրականացնել Ax=b հավասարումների համակարգի նախնական ձևափոխում x=Bx+g իտերացիոն տեսքին։ Այն կարող է կատարվել հետևյալ կանոններից որևէ մեկի համաձայն՝

  • B=ED1A=D1(DA),g=D1b;
    B=D1(L+U)=D1(AD),g=D1b
    Dii1=1/Dii,Dii0,i=1,2,...,n,

որտեղ ըստ ընդունված նշանակումների D-ն մատրից է, որի գլխավոր անկյունագծի վրա գտնվում են A մատրիցի համապատասխան էլեմենտները, իսկ մնացած բոլոր էլեմենտները զրոներ են, այնինչ U և L մատրիցները պարունակում են A մատրիցի վերևի և ներքևի եռանկյունային մասերը, որոնց գլխավոր անկյունագծի վրա զրոներ են, իսկ Eմիավոր մատրից է։

Այդ դեպքում լուծման գտնելու ընթացակարգը ունիայսպիսի տեսք՝

x(k+1)=Bx(k)+g,

կամ ըստ էլեմենտային բանաձևի տեսքով՝

xi(k+1)=1aii(bijiaijxj(k)),i=1,2,,n,

որտեղ k-ն իտերացիայի հաշվիչն է։

Ի տարբերություն Զեյդելի մեթոդի մենք չենք կարող փոխարինել xi(k)xi(k+1)-ի իտերացիայի գործընթացի ընթացքում, քանի որ այդ արժեքները անհրաժեշտ են մյուս հաշվարկների համար։

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

Զուգամիտության պայման

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

Դադարեցման պայմանը

Իտերացիոն գործընթացի ավարտի պայմանը անհրաժեշտ ε ճշգրտության դեպքում ունի այսպիսի տեսք՝

x(k+1)x(k)1qqε։

B (երբ B=q<1/2) մատրիցի համար առավել լավ այն կատարվում է, երբ

x(k+1)x(k)ε։

Այս չափանիշը չի պահանջում մատրիցի նորմայի հաշվարկ և գործնականում հաճախ է օգտագործվում։ Այդ դեպքում կրկնվող գործընթացի ավարտի ճշգրիտ պայմանը ունի այսպիսի տեսք՝

Ax(k)bε

և պահանջում է լրացուցիչ բազմապատկում մատրիցն վեկտորին յուրաքանչյուր իտերացիայում, որը մոտավորապես երկու անգամ մեծացնում է ալգորիթմի հաշվարկային բարդությունը։

Ալգորիթմ

Ներքևում բերենք ալգորիթմի իրականացումը С++ -ում։

#include <math.h>
const double eps = 0.001; ///< ցանկալի ճշտությունը

..........................

/// N - մատրիցի չափը; A[N][N] - գործակիցների մատրիցն, F[N] - ազատ անդամների սյունը,
/// X[N] - սկզբնական մոտարկումը, պատասխանը նույնպես գրվում է X[N]-ում;
void Jacobi (int N, double** A, double* F, double* X)
{
	double* TempX = new double[N];
	double norm; // նորման, որոշված որպես ամենամեծ տարբերությունը հարևան իտերացիաների սյուների միջև

	do {
		for (int i = 0; i < N; i++) {
			TempX[i] = F[i];
			for (int g = 0; g < N; g++) {
				if (i != g)
					TempX[i] -= A[i][g] * X[g];
			}
			TempX[i] /= A[i][i];
		}
        norm = fabs(X[0] - TempX[0]);
		for (int h = 0; h < N; h++) {
			if (fabs(X[h] - TempX[h]) > norm)
				norm = fabs(X[h] - TempX[h]);
			X[h] = TempX[h];
		}
	} while (norm > eps);
	delete[] TempX;
}

Տես նաև

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

Կաղապար:Ծանցանկ Կաղապար:Մաթեմատիկա–ներքև