Յակոբիի մեթոդ
Յակոբիի մեթոդը գծային հանրահաշվում հավասարումների համակարգերի լուծման պարզ իտերացիայի տարատեսակներից է։ Այն անվանվել է ի պատիվ Կարլ Գուստավ Յակոբիի[1]։
Խնդրի դրվածքը[խմբագրել | խմբագրել կոդը]
Վերցնենք գծային հավասարումների համակարգը.
, где
կամ
Մեթոդի նկարագրությունը[խմբագրել | խմբագրել կոդը]
Որպեսզի կառուցենք Յակոբիի մեթոդի իտերատիվ ընթացակարգը, անհրաժեշտ է իրականացնել հավասարումների համակարգի նախնական ձևափոխում իտերացիոն տեսքին։ Այն կարող է կատարվել հետևյալ կանոններից որևէ մեկի համաձայն՝
որտեղ ըստ ընդունված նշանակումների -ն մատրից է, որի գլխավոր անկյունագծի վրա գտնվում են մատրիցի համապատասխան էլեմենտները, իսկ մնացած բոլոր էլեմենտները զրոներ են, այնինչ և մատրիցները պարունակում են մատրիցի վերևի և ներքևի եռանկյունային մասերը, որոնց գլխավոր անկյունագծի վրա զրոներ են, իսկ -ն միավոր մատրից է։
Այդ դեպքում լուծման գտնելու ընթացակարգը ունիայսպիսի տեսք՝
կամ ըստ էլեմենտային բանաձևի տեսքով՝
որտեղ -ն իտերացիայի հաշվիչն է։
Ի տարբերություն Զեյդելի մեթոդի մենք չենք կարող փոխարինել -ը -ի իտերացիայի գործընթացի ընթացքում, քանի որ այդ արժեքները անհրաժեշտ են մյուս հաշվարկների համար։
Սա ամենաէական տարբերությունն է գծային հանրահաշվական հավասարումների համակարգի լուծման Յակոբիի և Գաուս-Զեյդել մեթոդների միջև։ Այսպիսով, յուրաքանչյուր իտերացիայի ժամանակ անհրաժեշտություն է առաջանում մոտարկումների երկու վեկտորները՝ հին և նոր, պահպանել։
Զուգամիտության պայման[խմբագրել | խմբագրել կոդը]
Բերենք զուգամիտության մեթոդի բավարար պայման։
![]() |
Թեորեմ. Դիցուկ ։ Այդ դեպքում ցանկացած սկզբնական մոտարկման ընտրության դեպքում՝
|
Դադարեցման պայմանը[խմբագրել | խմբագրել կոդը]
Իտերացիոն գործընթացի ավարտի պայմանը անհրաժեշտ ճշգրտության դեպքում ունի այսպիսի տեսք՝
- ։
(երբ ) մատրիցի համար առավել լավ այն կատարվում է, երբ
- ։
Այս չափանիշը չի պահանջում մատրիցի նորմայի հաշվարկ և գործնականում հաճախ է օգտագործվում։ Այդ դեպքում կրկնվող գործընթացի ավարտի ճշգրիտ պայմանը ունի այսպիսի տեսք՝
և պահանջում է լրացուցիչ բազմապատկում մատրիցն վեկտորին յուրաքանչյուր իտերացիայում, որը մոտավորապես երկու անգամ մեծացնում է ալգորիթմի հաշվարկային բարդությունը։
Ալգորիթմ[խմբագրել | խմբագրել կոդը]
Ներքևում բերենք ալգորիթմի իրականացումը С++ -ում։
#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;
}
Տես նաև[խմբագրել | խմբագրել կոդը]
Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]
- ↑ Յուսիֆ Սաադ, Iterative Methods for Sparse Linear Systems, 1-ին հրատ․, PWS, 1996.։
|