Файл: Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 18.03.2024

Просмотров: 14

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ
ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Сибирский государственный университет науки и технологий
имени академика М.Ф. Решетнева»
Институт информатики и телекоммуникаций
Кафедра информатики и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №1
по дисциплине «Вычислительная математика»
Вариант 16
Выполнил студент группы БПИ20-01
Очной формы обучения Петухова А.
Руководитель: ст. преподаватель
Кириллов К.А.
Дата сдачи: «_____»________ 2022 г.
Дата защиты: «____»________2022 г.
Красноярск 2022 г.

ЦЕЛЬ РАБОТЫ
Получение практических навыков по разработке программ для решения систем линейных алгебраических уравнений методом Гаусса и методом простых итераций.

ЗАДАНИЕ
Задание к лабораторной работе представлено на рисунках 1-3.
Рисунок 1 – Задание

Рисунок 2 – Задание (продолжение)

Рисунок 3 – Вариант задания

ХОД РАБОТЫ
1. Написание функции решения СЛАУ (1) методом Гаусса с выбором главного элемента по столбцам (рисунок 1). Полный код программы представлен в приложении 1.
Алгоритм решения СЛАУ методом Гаусса:
1) Положить, что a
11
!= 0 и исключить u
1 из всех уравнений, начиная со второго, прибавив ко второму первое, умноженное на -a
21/
a
11, к третьему: на -a
31/
a
11 и так далее, в результате мы получим новую систему, эквивалентную изначальной.
2) Те же самые действия выполнить для a
22 и так далее до a nn
, где n – размер матрицы. Получим треугольную матрицу, эквивалентную изначальной.
3) Определить решение системы, начиная с последнего уравнения, поочередно находя u n
, u n-1
,… u
1
Рисунок 1 – Метод Гаусса
2. Написание функции приведения СЛАУ к виду, приемлемому для применения метода простой итерации и решения СЛАУ методом простой итерации со вспомогательными функциями (подсчет нормы матрицы, вывод матрицы) (рисунок 2).
В качестве начального приближения было выбрано u
0
= 0, где 0 =
(0,0,0,0)
T
. В качестве условия остановки итерационного процесса

использовалось неравенство ‖????
????+????
− ????
????
‖ < (???? − ????)????. Значение параметра τ вычисляется в ходе работы программы и равняется 0,06.
Вектор-столбец F равен (0.005, 0.014, 0.033, 0.023)
T
Векторы ????
????
… ????
????
приближенного решения системы уравнений представлены на рисунке 3, полная таблица векторов представлена в приложении 2. Количество итераций K, потребовавшихся для решения системы уравнений методом простой итерации, равняется
31. Матрица В, - преобразованная матрица А, в которой элементы главной диагонали заменены на разность единицы и соответствующих элементов главной диагонали, умноженных на τ, а оставшиеся элементы – на соответствующие элементы, умноженные на -τ, представлена на рисунке 4.
Алгоритм решения СЛАУ методом простых итераций:
1) Провести равносильные преобразования, умножив обе части системы на один и тот же скалярный множитель τ и прибавив к правой и левой части вектор u. Записать систему в виде, удобном для итераций.
2) Построить последовательность приближений к решению системы: выбрать произвольный вектор u
0
– начальное приближение к решению.
3) Вычислить невязки, возникающие при подстановке вектора u
0 в исходное уравнение, уточняя приближения к решению, тем самым в конце получив приближенное решению с некоторой точностью.
Рисунок 2 – Метод простых итераций

Рисунок 3 – Векторы приближенного решения системы
Рисунок 4 – Матрица В

ВЫВОД
В ходе работы были приобретены практические навыки по разработке программ для решения СЛАУ методом Гаусса и простых итераций. Таким образом, решения, полученные методом Гаусса: (-0.0027, 0.0391, 0.1775,
0.0667)
T
;
И методом простых итераций: (-0.0026, 0.0392, 0.1771, 0.0668)
T

ПРИЛОЖЕНИЕ 1
import numpy as np def Gauss(A, f):
# размер матрицы n = len(A)
# начальное значение u = [0,0,0,0]
# номер столбца для перемены мест k = 0
# прямой ход for i in range(n): maxEl = 0
# выбор главного элемента for j in range(i, n): if A[j][i] > maxEl: maxEl = A[j][i] k = j
# меняем местами
A[i], A[k] = A[k], A[i] for temp in range(i, n):
# вычисляем множители count = A[temp][i]
A[temp][i] = 1 f[temp] /= count for j in range(i+1, n):
A[temp][j] /= count
# от неглавной строки отнимаем главную строку for temp in range(i+1, n): for j in range(i, n):
A[temp][j] -= A[i][j] f[temp] -= f[i]
# вид последней строки матрицы - это a*u4=f4,
# из преобразований выше u4=f4 u[-1] = f[-1]
# обратный ход

for i in range(n-2, -1, -1): sumEl = f[i] for j in range(n-1, i, -1): sumEl -= A[i][j]*u[j] u[i] = sumEl return u def matrixOutput(B): print("B-matrix: ")
B = np.array(B) for i in range(len(B)): print(B[i]) def plainIter(A, f, e, U):
B, F = [], [] u, uk = [0, 0, 0, 0], [0, 0, 0, 0] t, q, u_prev = 0, 0, 0 maxVal = 0.9 n = len(A) range_ = np.arange(0.01, 10.0, 0.01)
# вычисляется значение t и q for t in range_: maxEl = 0 for i in range(0, n): summ = 0 for j in range(0,n): if i==j: summ += abs(1 - A[j][i]*t) else: summ += abs(A[j][i]*t) if summ > maxEl: maxEl = summ if maxEl < maxVal: q = maxEl break for i in range(n):
B.append([]) for j in range(n):
if i==j:
B[i].append(1-A[i][j]*t) else:
B[i].append(-A[i][j]*t) print("достаточное условие сходимости: ") print("norm of B-matrix <= q < 1: ", q, "<=", q, "<", 1) for i in range(n):
F.append(f[i]*t) tvec = [0,0,0,0] for i in range(n): for j in range(n): u[i] += B[i][j]*uk[j] u[i] += F[i]
# пока не выполняется достаточное условие сходимости,
# вычисляем значения вектора решений iternum = 0 print("e1...n-vectors:") while(abs(u_prev-u[0]) > (1-q)*e): u_prev = u[0] for i in range(n): uk[i] = u[i] u[i] = 0 for i in range(n): for j in range(n): u[i] += B[i][j]*uk[j] u[i] += F[i] iternum += 1 for a in range(len(u)): tvec[a] = u[a]-U[a] print(iternum, tvec) return u def main():
A = [[4.871, 0.217, 0.365, 0.328],
[0.503, 4.293, 0.271, 0.315],
[0.246, 0.147, 2.981, 0.175],

[0.328, 0.401, 0.371, 4.542]] f = np.array([0.082,0.236,0.546,0.384])
U = Gauss(A,f) print("Метод Гаусса: ", U) e = 0.0001
A = [[4.871, 0.217, 0.365, 0.328],
[0.503, 4.293, 0.271, 0.315],
[0.246, 0.147, 2.981, 0.175],
[0.328, 0.401, 0.371, 4.542]] f = np.array([0.082,0.236,0.546,0.384]) print("Метод простых итераций: ", plainIter(A, f, e, U)) if __name__ == '__main__': main()

ПРИЛОЖЕНИЕ 2
Векторы ????
????
… ????
????
приближенного решения системы уравнений:
1 [0.009757888908678902, -0.015628012473308285, -0.1183100656855721, -0.028145081959247656]
2 [0.010254410670102902, -0.009441378390620286, -0.0968597913467561, -0.017657427435167655]
3 [0.009849110956722562, -0.005410280672965097, -0.0794181282224915, -0.01066397359306627]
4 [0.008990175651256937, -0.0028210588800899744, -0.06519908428807517, -0.006053639125887952]
5 [0.007946432665945677, -0.0011911831449079521, -0.05358182611477838, -0.0030616217552101865]
6 [0.006873212167599277, -0.00019507638450103754, -0.044072816778270685, -0.001162263073564665]
7 [0.005855055098754796, 0.0003863286203056454, -0.03627747704491924, 4.966483080223738e-06]
8 [0.004933205703853051, 0.0006998904416270629, -0.02987876768042605, 0.0006866271051830519]
9 [0.004123146622066301, 0.0008435800237262467, -0.024620848027593484, 0.0010506840027674769]
10 [0.0034256514890221206, 0.0008823311774372386, -0.020296493351358136, 0.0012109716145344007]
11 [0.0028336439159309884, 0.0008588077691926432, -0.01673732252944979, 0.0012441118627096182]
12 [0.002336364709842934, 0.0008007118407448444, -0.013806147465114271, 0.0012012102701972477]
13 [0.0019218283029462596, 0.0007257380815387515, -0.01139093965889365, 0.0011159365055585097]
14 [0.0015782056014059303, 0.0006449271672116369, -0.009400040720442954, 0.0010101009666268757]
15 [0.00129454438537642, 0.0005649303362759844, -0.00775833806962567, 0.0008974971237599993]
16 [0.0010610903106571994, 0.0004895341120804003, -0.006404195602985996, 0.0007865429556277864]
17 [0.000869375040663878, 0.00042068276855827813, -0.005286979262323854, 0.0006820912154321818]
18 [0.0007121754923580109, 0.000359160321139515, -0.004365054506845517, 0.0005866649475701619]
19 [0.0005834079431119576, 0.00030504216803325934, -0.003604160344000268, 0.0005012961183644971]
20 [0.0004779950925544547, 0.00025799130522448366, -0.00297608540727759, 0.0004260907265619257]
21 [0.0003917280049311068, 0.000217450046921773, -0.0024575874148390076, 0.000360605928700089]
22 [0.0003211348183071753, 0.00018276183195969214, -0.002029509506838889, 0.0003040984415990794]
23 [0.0002633619981257055, 0.00015324655450197483, -0.0016760563793585814, 0.0002556852330155013]
24 [0.00021607029973607847, 0.00012824526771429423, -0.0013842004879962289, 0.00021444483209420717]
25 [0.00017734555694107548, 0.00010714494261864632, -0.0011431943803355549, 0.00017947878467468315]
26 [0.00014562333176353168, 8.939045098435572e-05, -0.0009441697995221654, 0.0001499466653014092]
27 [0.00011962596138690839, 7.448855543321087e-05, -0.0007798078533197972, 0.00012508381839103355]
28 [9.831037936199744e-05, 6.200707333745004e-05, -0.0006440674690171289, 0.00010420806545419214]
29 [8.082511863814149e-05, 5.157128874717226e-05, -0.0005319617097822027, 8.671958686659598e-05]
30 [6.647503126016446e-05, 4.2858951320452754e-05, -0.00043937343155051045, 7.20967891714025e-05]
31 [5.469242841793856e-05, 3.559470887756766e-05, -0.00036290330328175857, 5.9890009788760024e-05]