Метод

Якоби

Можно проверить тут

Якоби

Код на Python

				
					import math
import copy
 
# Пробные данные для уравнения A*X = B
# x = [1.10202, 0.99091, 1.01111]
 
a = [[10, 1, -1],
     [1, 10, -1],
     [-1, 1, 10]]
     
b = [11, 10, 10]
 
# Проверка матрицы коэффициентов на корректность
def isCorrectArray(a):
    for row in range(0, len(a)):
        if( len(a[row]) != len(b) ):
            print('Не соответствует размерность')
            return False
    
    for row in range(0, len(a)):
        if( a[row][row] == 0 ):
            print('Нулевые элементы на главной диагонали')
            return False
    return True
 
 
# Условие завершения программы на основе вычисления
# расстояния между соответствующими элементами соседних
# итераций в методе решения 
def isNeedToComplete(x_old, x_new):
    eps = 0.0001
    sum_up = 0
    sum_low = 0
    for k in range(0, len(x_old)):
        sum_up += ( x_new[k] - x_old[k] ) ** 2
        sum_low += ( x_new[k] ) ** 2
        
    return math.sqrt( sum_up / sum_low ) < eps
 
# Процедура решения
def solution(a, b):
    if( not isCorrectArray(a) ):
        print('Ошибка в исходных данных')
    else:
        count = len(b) # количество корней
        
        x = [1 for k in range(0, count) ] # начальное приближение корней
        
        numberOfIter = 0  # подсчет количества итераций
        MAX_ITER = 100    # максимально допустимое число итераций
        while( numberOfIter < MAX_ITER ):
 
            x_prev = copy.deepcopy(x)
            
            for k in range(0, count):
                S = 0
                for j in range(0, count):
                    if( j != k ): S = S + a[k][j] * x[j] 
                x[k] = b[k]/a[k][k] - S / a[k][k]
            
            if isNeedToComplete(x_prev, x) : # проверка на выход
                break
              
            numberOfIter += 1
 
        print('Количество итераций на решение: ', numberOfIter)
        
        return x    
                
    
# MAIN - блок программмы
print( 'Решение: ', solution(a, b) ) # Вызываем процедуру решение
				
			

Код на С ++

				
					#include <cstdlib>
     #include <iostream>
     #include <conio.h>
     #include <math.h>

using namespace std; // DEV software code for using 'cin' instead 'scanf' 
int main()
{
    int n,i,j,l=0;
    cout<<"Enter number of Equations = ";
    cin>>n;
    double a[n-1][n-1],b[n-1][1],x[n-1][1],T[n-1][1],e,k;
    cout<<"[a].[x]=[b]"<<endl;
    cout<<"Enter Matrix a:"<<endl;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {
        cout<<"a["<<i<<","<<j<<"] = ";
        cin>>a[i][j];
    }
    cout<<"Enter Matrix b:"<<endl;
    for(j=0;j<n;j++)
    {
        cout<<"b[0,"<<j<<"] = ";
        cin>>b[0][j];
    }
    cout<<"Enter the Accuracy = ";
    cin>>e;
    for (i=0;i<n;i++)
        T[i][0]=0;
    while (l!=n)
    {
        l=0;
        for (i=0;i<n;i++)
        {
            x[i][0]=(1/a[i][i])*(b[i][0]);
            for (j=0;j<n;j++)
            {
                if (j!=i)
                x[i][0]=x[i][0]-(1/a[i][i])*(a[i][j]*T[j][0]);
            }
        }
        for(i=0;i<n;i++)
        {
            k=fabs(x[i][0]-T[i][0]);
            if (k<=e)
            {
                l=l+1;
            }
        }
    for (i=0;i<n;i++)
        T[i][0]=x[i][0];
    }
    for (i=0;i<n;i++)
        cout<<"x"<<i+1<<"="<<x[i][0]<<endl;
    getch();
    return 0;
}