Метод Якобі

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Метод Якобі — класичний ітераційний метод розв'язку системи лінійних рівнянь

Опис методу[ред.ред. код]

Для квадратної системи з n лінійних рівнянь:

де:

Матрицю A можна розкласти на два доданки: діагональну матрицю D, та все інше R:

Систему лінійних рівнянь можна переписати в вигляді:

Ітераційний метод Якобі виражається формулою:

чи


Збіжність[ред.ред. код]

Метод є збіжним, коли матриця A має домінантну головну діагональ:

другою умовою збіжності є, те щоб спектральний радіус матриці не перевищував одиницю:

Алгоритм[ред.ред. код]

#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);
}

Див. також[ред.ред. код]

Джерела[ред.ред. код]