Метод Якобі — класичний ітераційний метод розв'язку системи лінійних рівнянь
Опис методу
Для квадратної системи з n лінійних рівнянь:
де:
Матрицю A можна розкласти на два доданки: діагональну матрицю D, та все інше R:
Систему лінійних рівнянь можна переписати в вигляді:
Ітераційний метод Якобі виражається формулою:
чи
Збіжність
Метод є збіжним, коли матриця A має домінантну головну діагональ:
другою умовою збіжності є, те щоб не перевищував одиницю:
Алгоритм
Реалізація на С++
#include <vector> #include <iostream> #include <cmath> using namespace std; void solve(const vector<float> a, //квадратна матриця const vector<float> b, //вектор вільних елементів vector<float>& x, //сюди буде записано розв'язок const float allowed_error) //допустима похибка { const unsigned n = x.size(); vector<float> tmp_x(n); float error; do { error = 0; tmp_x = b; for (unsigned i = 0; i < n; ++i) { for (unsigned j = 0; j < n; ++j) { if (i != j) { tmp_x[i] -= a[i * n + j] * x[j]; } } //оновити x[i] та порахувати похибку const float x_updated = tmp_x[i] / a[i * (n + 1)]; const float e = fabs(x[i] - x_updated); x[i] = x_updated; if (e > error) { error = e; } } } while (error > allowed_error); } //приклад використання. Користувач вводить вхідні дані. int main() { unsigned n; cout << "\nВведіть розмір системи:\nn = "; cin >> n; vector<float> x(n); vector<float> a(n * n); vector<float> b(n); cout << "\nВведіть вектор вільних елементів: \n"; for (auto& b_elem : b) { cin >> b_elem; } cout << "\nВведіть коефіцієнти системи: \n"; for (auto& a_elem : a) { cin >> a_elem; } float allowed_error; cout << "\nВведіть допустиму похибку: \n"; cin >> allowed_error; solve(a, b, x, allowed_error); cout << "\nРозв'язок системи:: \n"; for (unsigned i = 0; i < n; ++i) { cout << "\nx[" << i << "]= " << x[i]; } }
Реалізація на С
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<math.h> void main(){ int n, i, j, count = 0; float **a, *b, *x, *tmp_x, exp, e; printf("Введіть розміри системи:\n"); printf("n = "); scanf("%i", &n); a = (float**)malloc(n*sizeof(float*)); for(i = 0; i < n; i++){ a[i] = (float*)malloc(n*sizeof(float)); } b = (float*)malloc(n*sizeof(float)); x = (float*)malloc(n*sizeof(float)); tmp_x = (float*)malloc(n*sizeof(float)); printf("Введіть коефіцієнти системи:\n"); for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ scanf("%f", &a[i][j]); } } printf("Введіть вектор вільних елементів:\n"); for(i = 0; i < n; i++){ scanf("%f", &b[i]); x[i] = 0; } printf("Введіть точність обчислення: "); scanf("%f", &e); do{ count++; for(i = 0; i < n; i++){ tmp_x[i] = 0.0; for(j = 0; j < n; j++){ if(i != j){ tmp_x[i] = tmp_x[i] + (a[i][j] * x[j]); } } tmp_x[i] = (b[i] - tmp_x[i]) / a[i][i]; } exp = 0; for(i = 0; i < n; i++){ if(fabs(x[i] - tmp_x[i]) > exp){ exp = fabs(x[i] - tmp_x[i]); } x[i] = tmp_x[i]; } }while(exp > e); free(tmp_x); for(i = 0; i < n; i++){ free(a[i]); } free(a); free(b); printf("Розв'язок системи:\n"); for(i = 0; i < n; i++){ printf("x[%d] = %.6f\n", i+1, x[i]); } free(x); }
Див. також
Джерела
- Гантмахер Ф. Р. Теория матриц. — 5-е. — М: : Физматлит, 2010. — 559 с. — .(рос.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Metod Yakobi klasichnij iteracijnij metod rozv yazku sistemi linijnih rivnyanOpis metoduDlya kvadratnoyi sistemi z n linijnih rivnyan A x b displaystyle A mathbf x mathbf b de A a 11 a 12 a 1 n a 21 a 22 a 2 n a n 1 a n 2 a n n x x 1 x 2 x n b b 1 b 2 b n displaystyle A begin bmatrix a 11 amp a 12 amp cdots amp a 1n a 21 amp a 22 amp cdots amp a 2n vdots amp vdots amp ddots amp vdots a n1 amp a n2 amp cdots amp a nn end bmatrix qquad mathbf x begin bmatrix x 1 x 2 vdots x n end bmatrix qquad mathbf b begin bmatrix b 1 b 2 vdots b n end bmatrix Matricyu A mozhna rozklasti na dva dodanki diagonalnu matricyu D ta vse inshe R A D R D a 11 0 0 0 a 22 0 0 0 a n n R 0 a 12 a 1 n a 21 0 a 2 n a n 1 a n 2 0 displaystyle A D R qquad D begin bmatrix a 11 amp 0 amp cdots amp 0 0 amp a 22 amp cdots amp 0 vdots amp vdots amp ddots amp vdots 0 amp 0 amp cdots amp a nn end bmatrix qquad R begin bmatrix 0 amp a 12 amp cdots amp a 1n a 21 amp 0 amp cdots amp a 2n vdots amp vdots amp ddots amp vdots a n1 amp a n2 amp cdots amp 0 end bmatrix Sistemu linijnih rivnyan mozhna perepisati v viglyadi D x b R x displaystyle D mathbf x mathbf b R mathbf x Iteracijnij metod Yakobi virazhayetsya formuloyu x k 1 D 1 b R x k displaystyle mathbf x k 1 D 1 mathbf b R mathbf x k chi x i k 1 1 a i i b i j i a i j x j k i 1 2 n displaystyle x i k 1 frac 1 a ii left b i sum j neq i a ij x j k right quad i 1 2 ldots n ZbizhnistMetod ye zbizhnim koli matricya A maye dominantnu golovnu diagonal a i i gt i j a i j displaystyle left a ii right gt sum i neq j left a ij right drugoyu umovoyu zbizhnosti ye te shob ne perevishuvav odinicyu r D 1 R lt 1 displaystyle rho D 1 R lt 1 AlgoritmRealizaciya na S include lt vector gt include lt iostream gt include lt cmath gt using namespace std void solve const vector lt float gt a kvadratna matricya const vector lt float gt b vektor vilnih elementiv vector lt float gt amp x syudi bude zapisano rozv yazok const float allowed error dopustima pohibka const unsigned n x size vector lt float gt tmp x n float error do error 0 tmp x b for unsigned i 0 i lt n i for unsigned j 0 j lt n j if i j tmp x i a i n j x j onoviti x i ta porahuvati pohibku const float x updated tmp x i a i n 1 const float e fabs x i x updated x i x updated if e gt error error e while error gt allowed error priklad vikoristannya Koristuvach vvodit vhidni dani int main unsigned n cout lt lt n Vvedit rozmir sistemi n n cin gt gt n vector lt float gt x n vector lt float gt a n n vector lt float gt b n cout lt lt n Vvedit vektor vilnih elementiv n for auto amp b elem b cin gt gt b elem cout lt lt n Vvedit koeficiyenti sistemi n for auto amp a elem a cin gt gt a elem float allowed error cout lt lt n Vvedit dopustimu pohibku n cin gt gt allowed error solve a b x allowed error cout lt lt n Rozv yazok sistemi n for unsigned i 0 i lt n i cout lt lt n x lt lt i lt lt lt lt x i Realizaciya na S include lt stdio h gt include lt stdlib h gt include lt conio h gt include lt math h gt void main int n i j count 0 float a b x tmp x exp e printf Vvedit rozmiri sistemi n printf n scanf i amp n a float malloc n sizeof float for i 0 i lt n i a i float malloc n sizeof float b float malloc n sizeof float x float malloc n sizeof float tmp x float malloc n sizeof float printf Vvedit koeficiyenti sistemi n for i 0 i lt n i for j 0 j lt n j scanf f amp a i j printf Vvedit vektor vilnih elementiv n for i 0 i lt n i scanf f amp b i x i 0 printf Vvedit tochnist obchislennya scanf f amp e do count for i 0 i lt n i tmp x i 0 0 for j 0 j lt n j if i j tmp x i tmp x i a i j x j tmp x i b i tmp x i a i i exp 0 for i 0 i lt n i if fabs x i tmp x i gt exp exp fabs x i tmp x i x i tmp x i while exp gt e free tmp x for i 0 i lt n i free a i free a free b printf Rozv yazok sistemi n for i 0 i lt n i printf x d 6f n i 1 x i free x Div takozhIteracijni metodi rozv yazuvannya SLAR Metod Gausa ZejdelyaDzherelaGantmaher F R Teoriya matric 5 e M Fizmatlit 2010 559 s ISBN 5 9221 0524 8 ros