def test(eigenvalue, v_matrix, matrix): print('Проверка') vectors = [] for vector in zip(*v_matrix.matrix): v = Vector(v_matrix.size) v.vector = vector vectors.append(v) for i in range(0, len(vectors) - 1): print('v_{0}: '.format(i + 1), end='') vectors[i].print_vector() print('v_{0}: '.format(len(vectors)), end='') v.print_vector() print('(v_{0}, v_{1}): '.format(i + 1, len(vectors)), end='') res = sum([vectors[i][j] * v[j] for j in range(0, v.size)]) print('{0:8.20f}'.format(res)) print() print('Проверка A * x = a_k * x') for i in range(0, len(vectors)): print('a_k = ', eigenvalue[i]) print('x = ', end='') vectors[i].print_vector() print('A * x = ', end='') (matrix * vectors[i]).print_vector() print('a_k * x = ', end='') (vectors[i] * eigenvalue[i]).print_vector() print('-------------------------------------------------------------')
def method_jacobi_rotations(a, eps): n_iter = 0 a_k = copy.copy(a) v = Matrix(a.size, single=True) while True: i_max, j_max = find_max(a_k) fi = 0.5 * math.atan(2 * a_k[i_max][j_max] / (a_k[i_max][i_max] - a_k[j_max][j_max])) u = Matrix(a.size, single=True) u[i_max][i_max] = math.cos(fi) u[i_max][j_max] = -math.sin(fi) u[j_max][i_max] = math.sin(fi) u[j_max][j_max] = math.cos(fi) u_t = copy.copy(u) u_t.transpose() a_k = u_t * a_k * u v = v * u n_iter += 1 if t(a_k) < eps: eigenvalue = Vector(a_k.size) eigenvalue.vector = [a_k[i][i] for i in range(0, a_k.size)] print('Итераций: ', n_iter) return eigenvalue, v
def quadratures_method(points, h, lambda_exp, k_exp, g_exp): x = sympy.Symbol('x') t = sympy.Symbol('t') k = sympy.lambdify([x, t], parse_expr(k_exp)) g = sympy.lambdify(x, parse_expr(g_exp)) lambda_ = float(parse_expr(lambda_exp)) A = get_matrix_system(points, h, lambda_, k) G = Vector(len(points)) G.vector = get_values(points, g) return lu_solve(A, G).vector
def get_poly_1_deg(points, values): sum_points = sum(points) sum_points_2 = sum([point**2 for point in points]) sum_values = sum(values) sum_v_p = sum([values[i] * points[i] for i in range(0, len(points))]) a = Matrix(2) a.matrix = [[len(points), sum_points], [sum_points, sum_points_2]] b = Vector(2) b.vector = [sum_values, sum_v_p] l, u, p = lup(a) coefficients = lup_solve(l, u, p, b).vector return parse_expr(f'{coefficients[0]} + {coefficients[1]} * x')
def get_c(x, f, h): a_diag = [0.0] + [h[i - 1] for i in range(3, len(x))] b_diag = [2 * (h[i - 1] + h[i]) for i in range(2, len(x))] c_diag = [h[i] for i in range(2, len(x) - 1)] + [0.0] d = [ 3 * ((f[i] - f[i - 1]) / h[i] - ((f[i - 1] - f[i - 2]) / h[i - 1])) for i in range(2, len(x)) ] matrix = TridiagonalMatrix(len(x) - 2) matrix.A = a_diag matrix.B = b_diag matrix.C = c_diag vec = Vector(len(x) - 2) vec.vector = d c = [0.0, 0.0] + rtm(matrix, vec) return c
def get_poly_2_deg(points, values): sum_points = sum(points) sum_points_2 = sum([point**2 for point in points]) sum_points_3 = sum([point**3 for point in points]) sum_points_4 = sum([point**4 for point in points]) sum_values = sum(values) sum_v_p = sum([values[i] * points[i] for i in range(0, len(points))]) sum_v_p2 = sum([values[i] * points[i]**2 for i in range(0, len(points))]) a = Matrix(3) a.matrix = [[len(points), sum_points, sum_points_2], [sum_points, sum_points_2, sum_points_3], [sum_points_2, sum_points_3, sum_points_4]] b = Vector(3) b.vector = [sum_values, sum_v_p, sum_v_p2] l, u, p = lup(a) coefficients = lup_solve(l, u, p, b).vector return parse_expr( f'{coefficients[0]} + {coefficients[1]} * x + {coefficients[2]} * x ** 2' )
def finite_difference(pt, coeffs, alpha, beta, delta, gamma, step, cond_0, cond_1): x = sympy.Symbol('x') p_exp = parse_expr(f'({coeffs[1]}) / ({coeffs[0]})') q_exp = parse_expr(f'({coeffs[2]}) / ({coeffs[0]})') p = sympy.lambdify(x, p_exp) q = sympy.lambdify(x, q_exp) sz = len(pt) - 1 a = [0.0] + [1 - p(pt[i]) * step / 2 for i in range(0, sz - 1)] + [- gamma] b = [alpha * step - beta] + [-2 + q(pt[i]) * step ** 2 for i in range(0, sz - 1)] + [delta * step + gamma] c = [beta] + [1 + p(pt[i]) * step / 2 for i in range(0, sz - 1)] + [0.0] d = [cond_0 * step] + [0 for _ in range(0, sz - 1)] + [cond_1 * step] matr = TridiagonalMatrix(sz + 1) matr.A = a matr.B = b matr.C = c vec = Vector(sz + 1) vec.vector = d return rtm(matr, vec)