Пример #1
0
def matrix_rayleigh_quotient_iteration(matrix,
                                       tol,
                                       max_iter,
                                       getIterCount=False):
    error = tol * 10
    count = 0
    v_i = matrix[0]
    v_i = vector_scal_mult(1 / vector_2norm(v_i), v_i)
    eigenvaluenew = matrix_mult(matrix_transpose(convert_vec_mat(v_i)),
                                matrix_mult(matrix,
                                            convert_vec_mat(v_i)))[0][0]
    I = [[int(i == j) for i in range(len(matrix))] for j in range(len(matrix))]

    while error > tol and count < max_iter:
        eigenvalueold = eigenvaluenew
        v_i = matrix_solve_LU(
            matrix_add(matrix, matrix_scal_mult(-eigenvaluenew, I)), v_i)
        v_i = vector_scal_mult(1 / vector_2norm(v_i), v_i)
        eigenvaluenew = matrix_mult(matrix_transpose(convert_vec_mat(v_i)),
                                    matrix_mult(matrix,
                                                convert_vec_mat(v_i)))[0][0]
        error = abs(eigenvaluenew - eigenvalueold)
        count += 1
    if getIterCount == True:
        return eigenvaluenew, count
    else:
        return eigenvaluenew
def matrix_inverse_power_iteration(matrix,
                                   alpha,
                                   tol,
                                   max_iter,
                                   getIterCount=False):
    error = tol * 10
    count = 0
    eigenvaluenew = 0
    I = [[-int(i == j) * alpha for i in range(len(matrix))]
         for j in range(len(matrix))]
    v_i = matrix[0]
    while error > tol and count < max_iter:

        eigenvalueold = eigenvaluenew
        v_i = matrix_solve_LU(matrix_add(matrix, I), v_i)
        v_i = vector_scal_mult(1 / vector_2norm(v_i), v_i)
        eigenvaluenew = matrix_mult(matrix_transpose(convert_vec_mat(v_i)),
                                    matrix_mult(matrix,
                                                convert_vec_mat(v_i)))[0][0]
        count += 1
        error = abs(eigenvaluenew - eigenvalueold)
    if getIterCount == True:
        return eigenvaluenew, count
    else:
        return eigenvaluenew