Пример #1
0
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('-------------------------------------------------------------')
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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')
Пример #5
0
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
Пример #6
0
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'
    )
Пример #7
0
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)