You are on page 1of 19

Національний технічний університет України «КПІ ім.

Ігоря Сікорського»
Факультет Інформатики та Обчислювальної Техніки
Кафедра Автоматизованих Систем Обробки Інформації та Управління

Лабораторна робота № 3
з дисципліни «Чисельні методи»

на тему

«Розв’язання систем лінійних алгебраїчних рівнянь


(СЛАР) ітераційними методами. Метод простої ітерації.
Метод Зейделя»

Виконав:
студент гр. ІС-23
Красовський Микола
Викладач:
доц. Рибачук Л.В.

Київ – 2023
Зміст
1 Постановка задачі 3
2 Розв’язок 4
3 Розв’язок у Wolfram Mathematica 15
4 Лістинг програми 16
1 Постановка задачі
Якщо матриця не є матрицею із діагональною перевагою, звести систему до
еквівалентної, у якій є діагональна перевага (виконати письмово, включити в звіт).
Можна, наприклад, провести одну ітерацію метода Гауса, зкомбінувавши рядки з
метою отримати нульовий недіагональний елемент у стовпчику.
Розробити програму, що реалізує розв’язання системи методом простої ітерації
та методом Зейделя. Обчислення проводити з з кількістю значущих цифр m = 6. Для
кожної ітерації розраховувати нев’язку r = b – Ax, де x – отриманий розв’язок.
Розв’язати задану систему рівнянь за допомогою програмного забезпечення
Wolfram Mathematica. Навести результат перевірки: вектор нев’язки r = b – Axm, де
xm – отриманий у Wolfram Mathematica розв’язок.
Порівняти корені рівнянь, отримані у Wolfram Mathematica, із власними
результатами за допомогою методу середньоквадратичної похибки.
2 Розв’язок
==================================================
Вхідна матриця
----------------------------------------------------------------------------------------
[[ 8.3 2.62 4.1 1.9 -10.65]
[ 3.92 8.45 8.78 2.46 12.21]
[ 3.77 7.21 8.04 2.28 15.45]
[ 2.21 3.65 1.69 6.99 -8.35]]
==================================================
Зведена матриця
----------------------------------------------------------------------------------------
[[ 1. -0.413774 0.172466 0.160586 1.666909]
[ 0. 0.243145 0.10717 0.022776 -0.983347]
[ 0. 0.348359 -0.781291 -0.193647 -13.248054]
[ 0. -0.260883 -1.36792 2.558121 -7.876424]]
==================================================
Метод Зейделя
----------------------------------------------------------------------------------------
Ітерація №1
Наближення
[[ 1.666909]
[-4.044277]
[15.153379]
[ 4.611628]]
Вектор нев'язки
[[-5.027423]
[-1.729023]
[ 0.893028]
[ 0. ]]
Ітерація №2
Наближення
[[ -3.360514]
[-11.155343]
[ 10.839707]
[ 1.579748]]
Вектор нев'язки
[[-1.711531]
[ 0.531351]
[-0.587114]
[ 0. ]]
Ітерація №3
Наближення
[[-5.072045]
[-8.970019]
[12.565558]
[ 2.725488]]
Вектор нев'язки
[[ 0.422588]
[-0.211055]
[ 0.221869]
[ 0. ]]
Ітерація №4
Наближення
[[-4.649456]
[-9.83804 ]
[11.89455 ]
[ 2.278153]]
Вектор нев'язки
[[-0.171602]
[ 0.082101]
[-0.086625]
[-0. ]]
Ітерація №5
Наближення
[[-4.821059]
[-9.50038 ]
[12.155979]
[ 2.452384]]
Вектор нев'язки
[[ 0.066648]
[-0.031986]
[ 0.033739]
[ 0. ]]
Ітерація №6
Наближення
[[-4.75441 ]
[-9.63193 ]
[12.054141]
[ 2.384511]]
Вектор нев'язки
[[-0.025969]
[ 0.01246 ]
[-0.013143]
[ 0. ]]
Ітерація №7
Наближення
[[-4.780379]
[-9.580685]
[12.093812]
[ 2.410951]]
Вектор нев'язки
[[ 0.010116]
[-0.004854]
[ 0.00512 ]
[-0. ]]
Ітерація №8
Наближення
[[-4.770263]
[-9.600647]
[12.078358]
[ 2.400652]]
Вектор нев'язки
[[-0.003941]
[ 0.001891]
[-0.001995]
[ 0. ]]
Ітерація №9
Наближення
[[-4.774204]
[-9.592871]
[12.084378]
[ 2.404664]]
Вектор нев'язки
[[ 0.001535]
[-0.000737]
[ 0.000777]
[ 0. ]]
Ітерація №10
Наближення
[[-4.772669]
[-9.5959 ]
[12.082033]
[ 2.403101]]
Вектор нев'язки
[[-0.000598]
[ 0.000287]
[-0.000303]
[ 0. ]]
Ітерація №11
Наближення
[[-4.773267]
[-9.59472 ]
[12.082947]
[ 2.40371 ]]
Вектор нев'язки
[[ 0.000233]
[-0.000112]
[ 0.000118]
[ 0. ]]
Ітерація №12
Наближення
[[-4.773034]
[-9.59518 ]
[12.082591]
[ 2.403473]]
Вектор нев'язки
[[-0.000091]
[ 0.000044]
[-0.000046]
[ 0. ]]
Ітерація №13
Наближення
[[-4.773124]
[-9.595001]
[12.082729]
[ 2.403565]]
Вектор нев'язки
[[ 0.000035]
[-0.000017]
[ 0.000018]
[ 0. ]]
Ітерація №14
Наближення
[[-4.773089]
[-9.59507 ]
[12.082675]
[ 2.403529]]
Вектор нев'язки
[[-0.000014]
[ 0.000007]
[-0.000007]
[ 0. ]]
Ітерація №15
Наближення
[[-4.773103]
[-9.595043]
[12.082696]
[ 2.403543]]
Вектор нев'язки
[[ 0.000005]
[-0.000003]
[ 0.000003]
[ 0. ]]
Ітерація №16
Наближення
[[-4.773097]
[-9.595054]
[12.082688]
[ 2.403537]]
Вектор нев'язки
[[-0.000002]
[ 0.000001]
[-0.000001]
[ 0. ]]
Ітерація №17
Наближення
[[-4.7731 ]
[-9.59505 ]
[12.082691]
[ 2.40354 ]]
Вектор нев'язки
[[ 0.000001]
[-0. ]
[ 0. ]
[ 0. ]]
Ітерація №18
Наближення
[[-4.773099]
[-9.595051]
[12.08269 ]
[ 2.403539]]
Вектор нев'язки
[[-0.]
[ 0.]
[-0.]
[ 0.]]
Ітерація №19
Наближення
[[-4.773099]
[-9.595051]
[12.082691]
[ 2.403539]]
Вектор нев'язки
[[ 0.]
[-0.]
[ 0.]
[ 0.]]
Відповідь:
[[-4.773099]
[-9.595051]
[12.082691]
[ 2.403539]]
==================================================
Метод простих ітерацій
----------------------------------------------------------------------------------------
Ітерація №1
Наближення
[[ 1.666909]
[-4.044277]
[16.956626]
[-3.078987]]
Вектор нев'язки
[[-4.103416]
[-1.747112]
[ 0.812624]
[22.140226]]
Ітерація №2
Наближення
[[ -2.436506]
[-11.229738]
[ 15.916522]
[ 5.57589 ]]
Вектор нев'язки
[[-4.183625]
[-0.08566 ]
[ 4.179111]
[-3.297345]]
Ітерація №3
Наближення
[[ -6.620131]
[-11.582037]
[ 10.567538]
[ 4.286918]]
Вектор нев'язки
[[ 0.983738]
[ 0.602608]
[-0.126879]
[-7.408891]]
Ітерація №4
Наближення
[[-5.636393]
[-9.10365 ]
[10.729935]
[ 1.390695]]
Вектор нев'язки
[[ 1.462577]
[ 0.048562]
[-1.424213]
[ 0.868715]]
Ітерація №5
Наближення
[[-4.173817]
[-8.903927]
[12.552833]
[ 1.730286]]
Вектор нев'язки
[[-0.286282]
[-0.203095]
[-0.003815]
[ 2.545683]]
Ітерація №6
Наближення
[[-4.460099]
[-9.739207]
[12.557716]
[ 2.725424]]
Вектор нев'язки
[[-0.506264]
[-0.023189]
[ 0.483683]
[-0.211232]]
Ітерація №7
Наближення
[[-4.966363]
[-9.834578]
[11.938634]
[ 2.642851]]
Вектор нев'язки
[[ 0.080569]
[ 0.068228]
[ 0.017233]
[-0.871735]]
Ітерація №8
Наближення
[[-4.885794]
[-9.553973]
[11.916576]
[ 2.302079]]
Вектор нев'язки
[[ 0.174634]
[ 0.010125]
[-0.16374 ]
[ 0.043032]]
Ітерація №9
Наближення
[[-4.71116 ]
[-9.51233 ]
[12.126153]
[ 2.318901]]
Вектор нев'язки
[[-0.021615]
[-0.022843]
[-0.011249]
[ 0.297549]]
Ітерація №10
Наближення
[[-4.732775]
[-9.606279]
[12.140552]
[ 2.435216]]
Вектор нев'язки
[[-0.060036]
[-0.004192]
[ 0.055252]
[-0.004814]]
Ітерація №11
Наближення
[[-4.792811]
[-9.623522]
[12.069833]
[ 2.433335]]
Вектор нев'язки
[[ 0.005365]
[ 0.007622]
[ 0.005642]
[-0.101237]]
Ітерація №12
Наближення
[[-4.787447]
[-9.592175]
[12.062611]
[ 2.39376 ]]
Вектор нев'язки
[[ 0.020571]
[ 0.001675]
[-0.018583]
[-0.0017 ]]
Ітерація №13
Наближення
[[-4.766875]
[-9.585285]
[12.086397]
[ 2.393095]]
Вектор нев'язки
[[-0.001145]
[-0.002534]
[-0.002529]
[ 0.034334]]
Ітерація №14
Наближення
[[-4.76802 ]
[-9.595706]
[12.089634]
[ 2.406517]]
Вектор нев'язки
[[-0.007026]
[-0.000653]
[ 0.00623 ]
[ 0.001709]]
Ітерація №15
Наближення
[[-4.775046]
[-9.59839 ]
[12.08166 ]
[ 2.407185]]
Вектор нев'язки
[[ 0.000157]
[ 0.000839]
[ 0.001064]
[-0.011607]]
Ітерація №16
Наближення
[[-4.774888]
[-9.594938]
[12.080298]
[ 2.402648]]
Вектор нев'язки
[[ 0.002392]
[ 0.000249]
[-0.002081]
[-0.000963]]
Ітерація №17
Наближення
[[-4.772497]
[-9.593913]
[12.082962]
[ 2.402271]]
Вектор нев'язки
[[ 0.000025]
[-0.000277]
[-0.00043 ]
[ 0.003911]]
Ітерація №18
Наближення
[[-4.772471]
[-9.595052]
[12.083512]
[ 2.4038 ]]
Вектор нев'язки
[[-0.000812]
[-0.000094]
[ 0.000693]
[ 0.000456]]
Ітерація №19
Наближення
[[-4.773283]
[-9.595438]
[12.082625]
[ 2.403978]]
Вектор нев'язки
[[-0.000035]
[ 0.000091]
[ 0.000169]
[-0.001314]]
Ітерація №20
Наближення
[[-4.773318]
[-9.595063]
[12.082409]
[ 2.403465]]
Вектор нев'язки
[[ 0.000275]
[ 0.000035]
[-0.00023 ]
[-0.000198]]
Ітерація №21
Наближення
[[-4.773044]
[-9.59492 ]
[12.082703]
[ 2.403387]]
Вектор нев'язки
[[ 0.000021]
[-0.00003 ]
[-0.000065]
[ 0.00044 ]]
Ітерація №22
Наближення
[[-4.773023]
[-9.595042]
[12.082786]
[ 2.403559]]
Вектор нев'язки
[[-0.000093]
[-0.000013]
[ 0.000076]
[ 0.000082]]
Ітерація №23
Наближення
[[-4.773115]
[-9.595095]
[12.082689]
[ 2.403591]]
Вектор нев'язки
[[-0.00001 ]
[ 0.00001 ]
[ 0.000025]
[-0.000147]]
Ітерація №24
Наближення
[[-4.773125]
[-9.595055]
[12.082658]
[ 2.403534]]
Вектор нев'язки
[[ 0.000031]
[ 0.000005]
[-0.000025]
[-0.000033]]
Ітерація №25
Наближення
[[-4.773094]
[-9.595036]
[12.08269 ]
[ 2.403521]]
Вектор нев'язки
[[ 0.000004]
[-0.000003]
[-0.000009]
[ 0.000049]]
Ітерація №26
Наближення
[[-4.77309 ]
[-9.595049]
[12.082702]
[ 2.40354 ]]
Вектор нев'язки
[[-0.00001 ]
[-0.000002]
[ 0.000008]
[ 0.000013]]
Ітерація №27
Наближення
[[-4.7731 ]
[-9.595056]
[12.082691]
[ 2.403545]]
Вектор нев'язки
[[-0.000002]
[ 0.000001]
[ 0.000003]
[-0.000016]]
Ітерація №28
Наближення
[[-4.773102]
[-9.595052]
[12.082687]
[ 2.403539]]
Вектор нев'язки
[[ 0.000003]
[ 0.000001]
[-0.000003]
[-0.000005]]
Ітерація №29
Наближення
[[-4.773099]
[-9.595049]
[12.08269 ]
[ 2.403537]]
Вектор нев'язки
[[ 0.000001]
[-0. ]
[-0.000001]
[ 0.000005]]
Ітерація №30
Наближення
[[-4.773098]
[-9.595051]
[12.082692]
[ 2.403539]]
Вектор нев'язки
[[-0.000001]
[-0. ]
[ 0.000001]
[ 0.000002]]
Ітерація №31
Наближення
[[-4.773099]
[-9.595051]
[12.082691]
[ 2.40354 ]]
Вектор нев'язки
[[-0. ]
[ 0. ]
[ 0. ]
[-0.000002]]
Ітерація №32
Наближення
[[-4.773099]
[-9.595051]
[12.08269 ]
[ 2.403539]]
Вектор нев'язки
[[ 0. ]
[ 0. ]
[-0. ]
[-0.000001]]
Відповідь:
[[-4.773099]
[-9.595051]
[12.08269 ]
[ 2.403539]]
==================================================
3 Розв’язок у Wolfram Mathematica
4 Лістинг програми
import numpy as np

from numpy import ndarray

np.set_printoptions(precision=10, suppress=True)

def diagonal_dominant(a: ndarray, b: ndarray):

matrix = np.column_stack([a, b])

matrix[0], matrix[2] = matrix[2].copy(), matrix[0].copy()

matrix /= matrix[:, 0].reshape((-1, 1))

for i in range(1, 4):

matrix[i] -= matrix[i][0] * matrix[0]

matrix[2] += 8 * matrix[1]

matrix[0] = matrix[0] - 11 * matrix[1] + matrix[2]

return matrix[:, :-1], matrix[:, -1:]

def jacobi(A, b, tolerance=1e-6, max_iterations=10000):

x = np.zeros_like(b, dtype=np.double)

T = A - np.diag(np.diagonal(A))

for k in range(max_iterations):

print(f"Ітерація №{k+1}")

x_old = x

x = (b - np.dot(T, x)) / np.diagonal(A).reshape((-1, 1))

print("Наближення")

print(x.reshape((-1, 1)))

print("Вектор нев'язки")

vector = b - np.dot(A, x.reshape((-1, 1)))

print(vector)

if np.allclose(x_old, x, atol=tolerance, rtol=0.):

break

return x

def seidel(A, b, tolerance=1e-6, max_iterations=10000):


n = len(A)

x = np.zeros_like(b, dtype=np.double) # zero vector

converge = False

for k in range(max_iterations):

if converge:

break

print(f"Ітерація №{k+1}")

x_new = np.copy(x)

for i in range(n):

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, n))

x_new[i] = (b[i] - s1 - s2) / A[i][i]

print("Наближення")

print(x_new.reshape((-1, 1)))

print("Вектор нев'язки")

vector = b - np.dot(A, x_new.reshape((-1, 1)))

converge = np.allclose(x, x_new, atol=tolerance, rtol=0.)

print(vector)

x = x_new

return x.reshape((-1, 1))

variant = 11

ka = variant - 11

kb = variant - 11

alpha = 0.2 * ka

beta = 0.2 * kb

A = np.array([

[8.30, 2.62+alpha, 4.10, 1.90],

[3.92, 8.45, 8.78-alpha, 2.46],

[3.77, 7.21+alpha, 8.04, 2.28],

[2.21, 3.65-alpha, 1.69, 6.99]

], dtype=np.double)

b = np.array([-10.65 + beta, 12.21, 15.45 - beta, -8.35], dtype=np.double).reshape((-1,


1))

Ab = np.column_stack([A, b])

A, b = diagonal_dominant(A, b)

tolerance = 1e-6
print("="*50)

print("Вхідна матриця")

print("----------------------------------------------------------------------------------
------")

print(Ab)

print("="*50)

print("Зведена матриця")

print("----------------------------------------------------------------------------------
------")

print(np.column_stack([A, b]))

print("="*50)

print("Метод Зейделя")

print("----------------------------------------------------------------------------------
------")

print("Відповідь:", seidel(A.copy(), b.copy(), tolerance=tolerance), sep="\n")

print("="*50)

print("Метод простих ітерацій")

print("----------------------------------------------------------------------------------
------")

print("Відповідь:", jacobi(A.copy(), b.copy(), tolerance=tolerance), sep="\n")

print("="*50)

You might also like