Download as pdf or txt
Download as pdf or txt
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