SlideShare a Scribd company logo
1 of 12
Download to read offline
Лабораторная работа 1.
Системы линейных алгебраических уравнений
Преподаватель: Перл Ольга Вячеславовна
ФИО студента: Динь Чыонг Лам
Группа: P32202
Вариант: Метод Гаусса-Зейделя
1. Описание метода
Для решения задачи системы уравнений существует множество методов,
таких как:
• Прямые методы:
º Метод Гаусса
º Метод Гаусса с выбором главного элемента
• Итерационные методы:
º Метод простых итераций
º Метод Гаусса-Зейделя
В этом отчете я представлю только метод Гаусса-Зейделя:
1. 1.1. Метод Гаусса-Зейделя
Во-первых, давайте выясним, каков основной метод итерации.
Предположим, у нас есть система линейных алгебраических уравнений с
переменными
(1)
Эту систему уравнений можно записать в виде матрицы , где
Далее возвращаем к виду: (2)
Для выполнения итерации мы выбираем начальный вектор (любые
значений) затем вычисляем по следующей
итерационной формуле:
Вектор X
(k)
называется k-м итерационным вектором
X
(1)
= CX
(0)
+ d
X
(2)
= CX
(1)
+ d
. . . (3)
X
(k)
= CX
(k-1)
+ d
Если итерация (3) сходится то существует такой что , то
является решением системы уравнений
Это правильно, потому что если последовательность X сходится, т. е:
=
Но: =
Значит: =
Значит:
Отсюда очевидно, что является решением уравнения (2).
Для сходимости итерационного метода матрица должна удовлетворять
условию:
(4)
Если матрица удовлетворяет условию (4), переходим к следующему шагу
. . .
Отсюда у нас есть:
. . .
Тогда матрицы и будут:
(5)
Если: (6)
Из (3) и (5) и (6) имеем:
+
Это значит:
(7)
…
= +
1.2 Метод Гаусса-Зейделя
Это метод простых итераций, но для метода Гаусса-Зейделя нам нужно
немного изменить его.
Вместо (7), сделаем так:
(8)
= + )
(8) было улучшено с (7):
При вычислении сразу использовать вычисленное
При вычислении сразу используйте только что вычисленные и
…..
При вычислении сразу используйте только что вычисленные
Погрешность :
Установите:
, ,
То:
‖𝑋𝑘
− 𝑋∗‖ ≤
𝑢𝑘
1 − 𝑢
* ‖𝑋1
− 𝑋0‖
2. Блок-схема численного метода
3. КОД
4. import timeit
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])
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
С этим примером:
Поэтому эту систему уравнений можно решить с методом Гаусса-Зейделя
Запустите код выше, у нас есть:
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
𝑎𝑏𝑠(𝑎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
Так что мы не можем решить это
Запустите код выше, у нас есть:
‖𝑋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
lab1 math computational
lab1 math computational

More Related Content

Similar to lab1 math computational

Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
Презентация на тему: ЕГЭ информатика
Презентация на тему: ЕГЭ информатикаПрезентация на тему: ЕГЭ информатика
Презентация на тему: ЕГЭ информатика2berkas
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхDmitry Protopopov
 
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИАПрезентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА2berkas
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поискFedor Tsarev
 
алгоритмизация
алгоритмизацияалгоритмизация
алгоритмизацияisva69
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
презентация
презентацияпрезентация
презентацияMarijVANGLIS
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
Производящие функции
Производящие функцииПроизводящие функции
Производящие функцииAlex Dainiak
 

Similar to lab1 math computational (20)

Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
Презентация на тему: ЕГЭ информатика
Презентация на тему: ЕГЭ информатикаПрезентация на тему: ЕГЭ информатика
Презентация на тему: ЕГЭ информатика
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменных
 
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИАПрезентация на тему: Обзор возможных Исполнителей в заданиях ГИА
Презентация на тему: Обзор возможных Исполнителей в заданиях ГИА
 
8
88
8
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
алгоритмизация
алгоритмизацияалгоритмизация
алгоритмизация
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
презентация
презентацияпрезентация
презентация
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Производящие функции
Производящие функцииПроизводящие функции
Производящие функции
 
лекция 11
лекция 11лекция 11
лекция 11
 
вычислительная практика
вычислительная практикавычислительная практика
вычислительная практика
 

lab1 math computational

  • 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