1. Лабораторная работа 1.
Системы линейных алгебраических уравнений
Преподаватель: Перл Ольга Вячеславовна
ФИО студента: Динь Чыонг Лам
Группа: P32202
Вариант: Метод Гаусса-Зейделя
1. Описание метода
Для решения задачи системы уравнений существует множество методов,
таких как:
• Прямые методы:
º Метод Гаусса
º Метод Гаусса с выбором главного элемента
• Итерационные методы:
º Метод простых итераций
º Метод Гаусса-Зейделя
В этом отчете я представлю только метод Гаусса-Зейделя:
1. 1.1. Метод Гаусса-Зейделя
Во-первых, давайте выясним, каков основной метод итерации.
Предположим, у нас есть система линейных алгебраических уравнений с
переменными
2. (1)
Эту систему уравнений можно записать в виде матрицы , где
Далее возвращаем к виду: (2)
Для выполнения итерации мы выбираем начальный вектор (любые
значений) затем вычисляем по следующей
итерационной формуле:
Вектор X
(k)
называется k-м итерационным вектором
X
(1)
= CX
(0)
+ d
X
(2)
= CX
(1)
+ d
. . . (3)
X
(k)
= CX
(k-1)
+ d
Если итерация (3) сходится то существует такой что , то
является решением системы уравнений
Это правильно, потому что если последовательность X сходится, т. е:
=
Но: =
Значит: =
Значит:
3. Отсюда очевидно, что является решением уравнения (2).
Для сходимости итерационного метода матрица должна удовлетворять
условию:
(4)
Если матрица удовлетворяет условию (4), переходим к следующему шагу
. . .
Отсюда у нас есть:
. . .
Тогда матрицы и будут:
(5)
Если: (6)
4. Из (3) и (5) и (6) имеем:
+
Это значит:
(7)
…
= +
1.2 Метод Гаусса-Зейделя
Это метод простых итераций, но для метода Гаусса-Зейделя нам нужно
немного изменить его.
Вместо (7), сделаем так:
(8)
= + )
(8) было улучшено с (7):
При вычислении сразу использовать вычисленное
При вычислении сразу используйте только что вычисленные и
5. …..
При вычислении сразу используйте только что вычисленные
Погрешность :
Установите:
, ,
То:
‖𝑋𝑘
− 𝑋∗‖ ≤
𝑢𝑘
1 − 𝑢
* ‖𝑋1
− 𝑋0‖
2. Блок-схема численного метода
3. КОД
4. import timeit
6. 5. import random
6.
7. b = []
8. a = []
9. c = []
10. d = []
11. x = []
12. n = 0
13.
14. #input handling
15. def program_input():
16. global n
17. _input = input('Do you want to import values by your own from file?: y/n')
18. if _input == 'y':
19. with open('A.in', 'r') as f:
20. for line in f:
21. row = [float(x) for x in line.split()[:-1]]
22. a.append(row)
23. b.append(float(line.split()[-1]))
24. n = len(a)
25.
26. else:
27. n = random.randint(2, 20)
28. for i in range(n):
29. row = [random.uniform(-100, 100) for i in range(n)]
30. a.append(row)
31. sum = 0
32. for j in range(n):
33. if j != i:
34. sum += abs(a[i][j])
35. a[i][i] = (abs(sum) + random.uniform(0.1, 100.0))*[-1.0, 1.0][random.randint(0, 1)]
36. for i in range(n):
37. x = random.uniform(-100, 100)
38. b.append(x)
39.
40. with open('A.in', 'w') as f:
41. for i in range(n):
42. for j in range(n):
43. f.write(str(a[i][j]) + ' ')
44. f.write(str(b[i]) + 'n')
45. f.close()
46.
47. def can_solve():
48. for i in range(n):
49. sum = 0
50. for j in range(n):
51. if j != i:
52. sum += abs(a[i][j])
7. 53. if abs(a[i][i]) <= sum:
54. return False
55. return True
56.
57. def make_matrix_c_d():
58. for i in range(n):
59. row = [0]*n
60. for j in range(n):
61. if i == j:
62. row[j]= 0.0
63. else:
64. row[j] = -a[i][j]/a[i][i]
65. c.append(row)
66. d.append(b[i]/a[i][i])
67.
68. def solve():
69. for i in range(n):
70. x.append(0.0)
71. for k in range(100):
72. for i in range(n):
73. temp = d[i]
74. for j in range(n):
75. temp = temp + c[i][j]*x[j]
76. x[i] = temp
77.
78. def output():
79. for i in range(n):
80. print(f'x{i} = {x[i]}n')
81.
82.
83. start_time = timeit.default_timer()
84. program_input()
85. if can_solve() == False:
86. print("Can not solve by method Gauss-Seidel")
87. else:
88. make_matrix_c_d()
89. solve()
90. output()
91. end_time = timeit.default_timer()
92. print("Run Time: ", end_time - start_time, "seconds")
4. Примеры
4.1
8. С этим примером:
Поэтому эту систему уравнений можно решить с методом Гаусса-Зейделя
Запустите код выше, у нас есть:
Runtime: 2.051055334 seconds
Погрешность:
‖𝑋100
− 𝑋∗‖ ≤
𝑢100
1 − 𝑢
* ‖𝑋1
− 𝑋0‖ ≈ 0.0000000001
4.2
[
8
9
20
]
С этим примером:
𝑎𝑏𝑠(𝑎11) = 4 > 𝑎𝑏𝑠(𝑎12) + 𝑎𝑏𝑠(𝑎13) = 0.24 + 0.08 = 0.32
9. 𝑎𝑏𝑠(𝑎22) = 3 > 𝑎𝑏𝑠(𝑎21) + 𝑎𝑏𝑠(𝑎23) = 0.09 − 0.15
𝑎𝑏𝑠(𝑎33) = 4 > 𝑎𝑏𝑠(𝑎31) + 𝑎𝑏𝑠(𝑎32) = 0.04 − 0.08
Поэтому эту систему уравнений можно решить с методом Гаусса-Зейделя
Запустите код выше, у нас есть:
Run Time: 1.094744166 seconds
‖𝑋100
− 𝑋∗‖ ≤
𝑢100
1 − 𝑢
* ‖𝑋1
− 𝑋0‖ ≈ 0.0000000001
4.3
𝐴 = [
3 2
4 3
] , 𝐵 = [
2
5
]
С этим примером:
𝑎𝑏𝑠(𝑎11) = 3 > 𝑎𝑏𝑠(𝑎12) = 2
𝑎𝑏𝑠(𝑎22) = 3 < 𝑎𝑏𝑠(𝑎21) = 4
Так что мы не можем решить это
Запустите код выше, у нас есть:
10. ‖𝑋100
− 𝑋∗‖ ≤
𝑢100
1 − 𝑢
* ‖𝑋1
− 𝑋0‖ ≈ 0.0000000001
5. Вывод
Преимущества метода Гаусса-Зейделя:
Метод Гаусса-Зейделя имеет следующие преимущества:
использование меньшего объема машинной памяти, времени и более
быстрая сходимость к решению, б ыстрее, чем метод простых
итераций. Однако у метода Гаусса-Зейделя есть свои ограничения: не
все системы уравнений можно решить этим методом, если уравнения
не обладают диагональным преобладанием.
Cложность алгоритма = Размер квадратной матрицы (размер системы
уравнений) в квадрате * количество итераций (здесь я выбрал 100)
Значит: Cложность алгоритма = O(𝒏𝟐
) ∗ 𝟏𝟎𝟎
Память:
мы используем массивы 𝐴 и 𝐶 размером 𝑛 ∗ 𝑛, массивы 𝐵 и 𝑑, 𝑋
размером n*1:
Значит: Память = n*n*2*8 byte + n*3*8 byte = 16𝒏𝟐
+ 𝟐𝟒𝒏
предполагая n = 20. То память = 20*20*2*8 + 20*3*8 = 6880 byte = 6.88
kB