impressive_i

Jacobi method of iteration in solving SLAE

Feb 12th, 2021
806
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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) ) # Вызываем процедуру решение
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×