Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 лаба численые методы

.pdf
Скачиваний:
3
Добавлен:
01.12.2023
Размер:
654.27 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-

вычислительных систем (КИБЭВС)

Решение системы линейных уравнений Отчет по лабораторной работе №1

по дисциплине «Численные методы»

Студент гр. 711-2

_______ Е. П. Толстолес

_______

Принял:

Ст. преподаватель кафедры КИБЕВС

_______ А. Ю. Якимук

_______

Томск 2022

1 Задание

Необходимо разработать программы, реализующие метод простых итераций и метод Зейделя, и найти решение индивидуальной системы уравнений с помощью полученных программ. Для проверки точности решения также нужно найти решение индивидуальной системы уравнений одним любым точным методом (метод обратной матрицы, метод Крамера, метод Гаусса).

Вотчете для обоих методов:

1)указать и объяснить используемую формулу;

2)привести код программы (C++, C#, Python, Sage);

3)скрины работы программы; 1

x1 = f(x1, x2, x3);

4) описать преобразование системы к виду {x2 = f(x1, x2, x3); x3 = f(x1, x2, x3).

5) выписать в таблицу результаты применения каждого метода –полученное решение с точностью до 4 знаков, число выполненных итераций, начальную точку.

Замечание. Так как данные системы уравнений не удовлетворяют условию сходимости, необходимо предварительно выполнить преобразование,

предложенное в лекции:

=

Рекомендуется задавать начальную точку для метода Зейделя

0 x[0] = (0)

0

для метода простых итераций

2

1 x[0] = ( 2 )

3

где b1, 2, 3– свободные числа в правых частях преобразованной системы.

Условие останова: || [ ] − [ − 1]|| < ,где = 0, 01.

−10,11x1 − 0,62x2 − 3,51x3 = 6,18 Индивидуальное задание: { 8,46x1 − 15,05x2 + 4,37x3 = 8,22 3,05 1 − 4,98 2 − 9,64 3 = −9,42

2 Ход выполнения работы

2.1 Метод простых итераций

Пусть

дана

 

 

квадратная

 

 

система

линейных

a11 x1 + a12 x2 + + a1

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

+

 

+ +

 

=

 

уравнений:{ 12

 

 

1 22

 

2

 

2

 

 

2

 

… … … … … … … … … … … … … … … … … . .

 

 

1

+

2

+ +

=

 

 

 

1

 

2

 

2

 

 

 

 

Определитель системы ∆ ≠ 0.

 

 

 

 

 

 

 

Тогда преобразуем систему к виду:

 

 

 

 

 

 

 

 

=

+ +

 

+

 

 

 

 

 

1

12

 

2

1

 

 

1

 

 

 

=

+ +

 

+

2

 

 

 

 

2

22

 

1

2

 

 

 

 

 

 

… … … … … … … … … … … … … … … …

 

 

 

 

=

 

+ +

( − 1) ( − 1) +

 

 

 

 

 

1

 

1

 

 

 

 

 

 

Основной вариант такого преобразования - выражение каждой переменной из уравнения по очереди (т.е деление на диагональный элемент матрицы системы всего соответствующего уравнения).

3

 

x0

 

1

Задаётся начальный вектор x0 =

x20

(xn0)

Далее этот вектор подставляется в правую часть преобразованной системы. В

x11

результате получается вектор вида: x1 = (x12)

x1n

То есть верхний индекс - это номер итерации или шага:

1

=

0

+ +

0

+

 

 

1

12

2

1

 

1

 

1

=

0

+ +

0

+

2

 

2

22

1

2

 

 

 

… … … … … … … … … … … … … … … …

 

1

=

0

+ + ( − 1) 0( − 1) +

 

 

1

1

 

 

 

 

Дальше эти действия повторяются до тех пор, пока не выполнится условие останова: | − −1 | < Для данной работы заданная точность = 0, 01.

2.2 Метод Зейделя

Этот метод является модификацией метода простых итераций: система уравнений преобразовывается таким же образом, используется те же условие останова. Но различие при 4 выборе начальной точки и при самих вычислениях. В качестве начальной точки рекомендуется выбирать нулевой

0

вектор x0 = (0) .

0

Сама итерация выглядит следующим образом:

4

 

( +1)

=

+

 

+ +

 

+

 

 

 

1

12

2

13

3

 

1

 

 

1

 

 

 

( +1)

=

( +1)

 

+

+ +

 

 

+

2

 

2

21

1

 

 

23

3

 

2

 

 

 

 

( +1)

=

( +1)

 

+

( +1)

+ +

+

3

3

31

1

 

 

32

2

 

 

 

3

 

То есть в течение одной и той же итерации при вычислении последующих уравнений используются значения переменных, полученные из предыдущих уравнений.

Эта модификация позволяет увеличить сходимость метода для многих систем.

2.3Результаты работы программы

Втаблице 2.1 представлены данные полученные опытным путём в результате работы программы.

Таблица 2.1 - Результаты работы

 

Решение

Начальная точка

Число итераций

 

 

 

 

 

= -0.937

 

 

Метод Гаусса

= -0.761

-

-

 

= 1.074

 

 

 

 

 

 

Метод простых

= -0.937

 

 

= -0.761

 

13

итераций

 

= 1.074

 

 

 

 

 

 

 

 

 

 

= -0.937

= 0

 

Метод Зейделя

= -0.761

= 0

5

 

= 1.073

= 0

 

 

 

 

 

5

На рисунке 2.1 представлен результат работы программы.

Рисунок – 2.1 – Результат работы программы

6

3Заключение:

Входе выполнения лабораторной работы были получены знания и навыки по решению системы линейных алгебраических уравнений.

Разработана программа, реализующая метод простых итераций, метод Зейделя. Для проверки точности решения также был реализован метод Гаусса.

Отчет был составлен согласно ОС ТУСУР 2021.

7

Приложение А

(обязательное)

Листинг программы

A= [[-10.11, -0.62, -3.51], [8.46, -15.05, 4.37], [3.05, -4.98, -9.64]]

B= [6.18, 8.22, -9.42]

eps = .001 #Погрешность x = []

n = len(A)

for j in range(n): k = A[j][j]

for i in range(n): A[j][i] /= -k

A[j][j] = 0

B[j] /= k

r = 0 # r - счетчик итераций x = B.copy()

tmp = sum(x) + 2 * eps

while abs(sum(x) - tmp) > eps: tmp = sum(x)

t = [0] * n

for i in range(n):

t[i] = sum(x[j] * A[i][j] for j in range(n)) + B[i] r += 1

x = t.copy() print(x)

print("Количество итераций :",r)

print("Решение системы уравнений :",*(round(elem, 3) for elem in x))

import numpy as np

A = [[-10.11, -0.62, -3.51], [8.46, -15.05, 4.37], [3.05, -4.98, -9.64]]

b = [6.18, 8.22, -9.42]

m = len(A)

x = [0. for i in range(m)] Iteration = 0

converge = False pogr = 0.

while not converge: x_new = np.copy(x) for i in range(m):

s1 = sum(A[i][j] * x_new[j] for j in range(i))

s2 = sum(A[i][j] * x[j] for j in range(i + 1, m)) x_new[i] = (b[i] - s1 - s2) / A[i][i]

pogr = sum(abs(x_new[i] - x[i]) for i in range(m)) converge = pogr < 0.01

Iteration += 1 x = x_new

print('Количество итераций :', Iteration) print('Решение системы уравнений :', x) print('Погрешность :', pogr)

8