Advertisement
impressive_i

Jacobi method of iteration in solving SLAE

Feb 12th, 2021
3,704
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.48 KB | None | 0 0
  1. import math
  2. import copy
  3.  
  4. # Пробные данные для уравнения A*X = B
  5. # x = [1.10202, 0.99091, 1.01111]
  6.  
  7. a = [[10, 1, -1],
  8.      [1, 10, -1],
  9.      [-1, 1, 10]]
  10.      
  11. b = [11, 10, 10]
  12.  
  13. # Проверка матрицы коэффициентов на корректность
  14. def isCorrectArray(a):
  15.     for row in range(0, len(a)):
  16.         if( len(a[row]) != len(b) ):
  17.             print('Не соответствует размерность')
  18.             return False
  19.    
  20.     for row in range(0, len(a)):
  21.         if( a[row][row] == 0 ):
  22.             print('Нулевые элементы на главной диагонали')
  23.             return False
  24.     return True
  25.  
  26.  
  27. # Условие завершения программы на основе вычисления
  28. # расстояния между соответствующими элементами соседних
  29. # итераций в методе решения
  30. def isNeedToComplete(x_old, x_new):
  31.     eps = 0.0001
  32.     sum_up = 0
  33.     sum_low = 0
  34.     for k in range(0, len(x_old)):
  35.         sum_up += ( x_new[k] - x_old[k] ) ** 2
  36.         sum_low += ( x_new[k] ) ** 2
  37.        
  38.     return math.sqrt( sum_up / sum_low ) < eps
  39.  
  40. # Процедура решения
  41. def solution(a, b):
  42.     if( not isCorrectArray(a) ):
  43.         print('Ошибка в исходных данных')
  44.     else:
  45.         count = len(b) # количество корней
  46.        
  47.         x = [1 for k in range(0, count) ] # начальное приближение корней
  48.        
  49.         numberOfIter = 0  # подсчет количества итераций
  50.         MAX_ITER = 100    # максимально допустимое число итераций
  51.         while( numberOfIter < MAX_ITER ):
  52.  
  53.             x_prev = copy.deepcopy(x)
  54.            
  55.             for k in range(0, count):
  56.                 S = 0
  57.                 for j in range(0, count):
  58.                     if( j != k ): S = S + a[k][j] * x[j]
  59.                 x[k] = b[k]/a[k][k] - S / a[k][k]
  60.            
  61.             if isNeedToComplete(x_prev, x) : # проверка на выход
  62.                 break
  63.              
  64.             numberOfIter += 1
  65.  
  66.         print('Количество итераций на решение: ', numberOfIter)
  67.        
  68.         return x    
  69.                
  70.    
  71. # MAIN - блок программмы
  72. print( 'Решение: ', solution(a, b) ) # Вызываем процедуру решение
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement