Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- def multiplying_matrix(a, b, c, x):
- res = [0 for _ in range(len(x))]
- for i in range(len(x)):
- if i != 0:
- res[i] += a[i - 1] * x[i - 1]
- res[i] += b[i] * x[i]
- if i != len(x) - 1:
- res[i] += c[i] * x[i + 1]
- return res
- def find_x(a, b, c, d):
- alphas = [-c[0] / b[0]]
- betas = [d[0] / b[0]]
- for i in range(1, len(d) - 1):
- alpha = round(-c[i] / (b[i] + alphas[i - 1] * a[i - 1]), 5)
- alphas.append(alpha)
- beta = (d[i] - a[i - 1] * betas[i - 1]) / (
- b[i] + alphas[i - 1] * a[i - 1]
- )
- betas.append(beta)
- beta = (d[len(d) - 1] - a[len(d) - 2] * betas[len(d) - 2]) / (
- b[len(d) - 1] + alphas[len(d) - 2] * a[len(d) - 2]
- )
- betas.append(beta)
- local_x = [0 for _ in range(len(d))]
- local_x[len(d) - 1] = betas[len(d) - 1]
- for i in range(len(d) - 2, -1, -1):
- local_x[i] = local_x[i + 1] * alphas[i] + betas[i]
- return local_x
- def find_error(a, b, c, d, d2, x):
- d = np.array(d)
- d2 = np.array(d2)
- r = d2 - d
- m = np.zeros([len(x), len(x)])
- for i in range(len(x)):
- m[i][i] = b[i]
- if i > 0:
- m[i][i - 1] = a[i - 1]
- if i < len(x) - 1:
- m[i][i + 1] = c[i]
- m_reversed = np.matrix(m).I
- err = np.matmul(m_reversed, r).tolist()[0]
- return [x[i] - err[i] for i in range(len(x))], err
- def filling(matrix):
- a = [
- matrix[i][i + 1] for i in range(len(matrix) - 1)
- ]
- b = [
- matrix[i][i] for i in range(len(matrix))
- ]
- c = [
- matrix[i + 1][i] for i in range(len(matrix) - 1)
- ]
- return a, b, c
- if __name__ == "__main__":
- M = [
- [4, 1, 0, 0],
- [1, 4, 1, 0],
- [0, 1, 4, 1],
- [0, 0, 1, 4],
- ]
- a, b, c = filling(M)
- d = [5, 6, 6, 5]
- x = find_x(a, b, c, d)
- print("Полученный вектор X:", x)
- d2 = multiplying_matrix(a, b, c, x)
- print("M * x:", d2)
- x_real, error = find_error(a, b, c, d, d2, x)
- print("Ошибка:", error)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement