Advertisement
fevzi02

Untitled

Oct 19th, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. import math
  2.  
  3. # Пробные данные для уравнения A*X = B
  4. a = [[ 10.8000, 0.0475, 0, 0 ],
  5. [ 0.0321, 9.9000, 0.0523, 0 ],
  6. [ 0, 0.0369, 9.0000, 0.0570],
  7. [ 0, 0, 0.0416, 8.1000]]
  8.  
  9. b = [12.1430, 13.0897, 13.6744, 13.8972]
  10.  
  11. # Вывод матрицы на экран
  12. def print_arr( string, namevec, a ):
  13. if (type(a) == int) or (type(a) == float):
  14. print(a)
  15. else:
  16. print( string )
  17. for k in range(len(a)):
  18. print("{}[{}] = {:8.4f}".format(namevec, k, a[k]))
  19.  
  20.  
  21. # Проверка 3х-диаг. матрицы коэффициентов на корректность
  22. def isCorrectArray(a):
  23. n = len(a)
  24.  
  25. for row in range(0, n):
  26. if( len(a[row]) != n ):
  27. print('Не соответствует размерность')
  28. return False
  29.  
  30. for row in range(1, n - 1):
  31. if(abs(a[row][row]) < abs(a[row][row - 1]) + abs(a[row][row + 1])):
  32. print('Не выполнены условия достаточности')
  33. return False
  34.  
  35. if (abs(a[0][0]) < abs(a[0][1]))or(abs(a[n - 1][n - 1]) < abs(a[n - 1][n - 2])):
  36. print('Не выполнены условия достаточности')
  37. return False
  38.  
  39.  
  40. for row in range(0, len(a)):
  41. if( a[row][row] == 0 ):
  42. print('Нулевые элементы на главной диагонали')
  43. return False
  44. return True
  45.  
  46.  
  47.  
  48. # Процедура нахождения решения 3-х диагональной матрицы
  49. def solution(a, b):
  50. if( not isCorrectArray(a) ):
  51. print('Ошибка в исходных данных')
  52. return -1
  53.  
  54. n = len(a)
  55. x = [0 for k in range(0, n)] # обнуление вектора решений
  56. print('Размерность матрицы: ',n,'x',n)
  57.  
  58. # Прямой ход
  59. v = [0 for k in range(0, n)]
  60. u = [0 for k in range(0, n)]
  61. # для первой 0-й строки
  62. v[0] = a[0][1] / (-a[0][0])
  63. u[0] = ( - b[0]) / (-a[0][0])
  64. for i in range(1, n - 1): # заполняем за исключением 1-й и (n-1)-й строк матрицы
  65. v[i] = a[i][i+1] / ( -a[i][i] - a[i][i-1]*v[i-1] )
  66. u[i] = ( a[i][i-1]*u[i-1] - b[i] ) / ( -a[i][i] - a[i][i-1]*v[i-1] )
  67. # для последней (n-1)-й строки
  68. v[n-1] = 0
  69. u[n-1] = (a[n-1][n-2]*u[n-2] - b[n-1]) / (-a[n-1][n-1] - a[n-1][n-2]*v[n-2])
  70.  
  71. print_arr('Прогоночные коэффициенты v: ','v', v)
  72. print_arr('Прогоночные коэффициенты u: ','u', u)
  73.  
  74. # Обратный ход
  75. x[n-1] = u[n-1]
  76. for i in range(n-1, 0, -1):
  77. x[i-1] = v[i-1] * x[i] + u[i-1]
  78.  
  79. return x
  80.  
  81.  
  82. # MAIN - блок программмы
  83. x = solution(a, b) # Вызываем процедуру решение
  84. print_arr('Решение: ','x', x)
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement