Ejemplo n.º 1
0
def SeidelMethod(size, a, b, precision):
    x = Seidel(size, a, b, precision)
    print("Ответ с точностью", precision, "полученный методом Зейделя")
    additional.PrintVector(x)
    x = numpy.linalg.solve(a, b)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(x)
Ejemplo n.º 2
0
def RotationMethod(size, a, precision):
    ac = copy.deepcopy(a)
    print("Лабораторная работа 1.4")
    print("Метод вращений")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    x, lambd = Rotation(size, a, precision)
    print("Ответ")
    print()
    print("Собственные значения")
    additional.PrintVector(x)
    print("Собственные векторы")
    additional.PrintMatrix(lambd)
    print("Проверка")
    a = numpy.array(a)
    lambd = numpy.array(lambd)
    additional.PrintMatrix(numpy.dot(a, lambd))
    print('=\n')
    additional.PrintMatrix(lambd * x)
    '''
    for i in range(size):
        for j in range(size):
            an = numpy.matrix(a)
            xn = numpy.array(x[j])
            ln = lambd[i]
            print((an - [[ln if i == j else 0 for j in range(size)] for i in range(size)]) @ xn)
    '''
    print("Ответ, почлученный через numpy.linalg")
    x, lambd = numpy.linalg.eig(ac)
    print()
    print("Собственные значения")
    additional.PrintVector(x)
    print("Собственные векторы")
    additional.PrintMatrix(lambd)
Ejemplo n.º 3
0
def SeidelMethod(size, a, b, precision):
    print("Метод Зейделя")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    additional.PrintVector(b)
    x = algo.zeidel_method(size, a, b, precision)
    print("Ответ")
    additional.PrintVector(x)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 4
0
def RunThroughMethod(size, a, b):
    print("Лабораторная работа 1.2")
    print("Метод прогонки")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    additional.PrintVector(b)
    x = RunThrough(size, a, b)
    print("Ответ")
    additional.PrintVector(x)
    print("Ответ, почлученный при помощи numpy")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 5
0
def QRMethod(size, a, precision):
    print("Лабораторная работа 1.5")
    print("Алгоритм QR – разложения матриц")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    x = QRMain(size, a, precision)
    print("Ответ")
    additional.PrintVector(x)

    x, u = numpy.linalg.eig(a)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(x)
Ejemplo n.º 6
0
def SimpleIterationMethod(size, a, b, precision):
    print("Метод простых итераций")
    print()
    print("Матрица")
    print("A")
    additional.PrintMatrix(a)
    print("B")
    additional.PrintVector(b)
    x = algo.SimpleIteration(size, a, b, precision)
    print("Ответ с точностю", precision)
    additional.PrintVector(x)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 7
0
def RotationMethod(size, a, b, precision):
    print("Лабораторная работа 1.4")
    print("Метод вращений")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    x, u = algo.rotate_jacobi(size, a, precision)
    print("Ответ")
    additional.PrintVector(x)
    additional.PrintMatrix(u)
    print("Ответ, почлученный через numpy.linalg")
    x, u = numpy.linalg.eig(a)
    additional.PrintVector(x)
    additional.PrintMatrix(u)
Ejemplo n.º 8
0
def RunThroughMethod(size, a, b):
    print("Лабораторная работа 1.2")
    print("Метод прогонки")
    print()
    print("Матрица")
    print("A")
    additional.PrintMatrix(a)
    print("B")
    additional.PrintVector(b)
    x = algo.tridiagonal(size, a, b)
    print("Ответ")
    additional.PrintVector(x)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 9
0
def Seidel(size, a, b, precision):
    print("Метод Зейделя")
    Seidel1(size, a, b)
    alpha, beta = TransformToEqual(size, a, b)

    alpha = numpy.array(alpha)
    beta = numpy.array(beta)
    # нижняя треугольная матрица с нулевой диагональю
    b = copy.deepcopy(alpha)
    for i in range(size):
        for j in range(i, size):
            b[i][j] = 0
    # верхняя треугольная матрица
    c = copy.deepcopy(alpha)
    for i in range(size):
        for j in range(i):
            c[i][j] = 0

    reverseB = task1.InverseMatrix(
        numpy.eye(size, size) - b)  # обратную матрицу из своей лабораторной 1
    t1 = reverseB @ c
    t2 = reverseB @ beta
    x = t2
    cNorm = additional.NPNorm(a, alpha, t1, c)
    i = 0
    while True:
        print("Ответ на %i-ой итерации" % i)
        i += 1
        curX = t2 + t1 @ x
        additional.PrintVector(curX)
        if cNorm * norm(curX - x, numpy.inf) <= precision:
            break
        x = curX
    x = curX
    return x
Ejemplo n.º 10
0
def LUPMethod(size, a, b):
    print("Лабораторная работа 1.1")
    print("алгоритм LUP - разложения матриц ")
    print()
    print("Матрица")
    additional.PrintMatrix(a)
    additional.PrintVector(b)
    l, u, p = LUPSeparate(size, a)
    x = LUPSolve(size, l, u, b, p)
    print("L")
    additional.PrintMatrix(l)
    print("U")
    additional.PrintMatrix(u)
    print("L * U")
    additional.PrintMatrix(numpy.array(l) @ numpy.array(u))  # исправить
    print("Ответ")
    additional.PrintVector(x)
    print("Ответ, почлученный при помощи numpy")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 11
0
def LUPMethod(size, a, b):
    print("Лабораторная работа 1.1")
    print("алгоритм LUP - разложения матриц ")
    print()
    l, u, p = algo.LUPSeparate(size, a)
    x = algo.LUPSolve(size, l, u, b, p)
    print("Матрица")
    additional.PrintMatrix(a)
    additional.PrintVector(b)
    print("L")
    additional.PrintMatrix(l)
    print("U")
    additional.PrintMatrix(u)
    print("Ответ")
    additional.PrintVector(x)

    nL = numpy.array(l)
    nU = numpy.array(u)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(numpy.linalg.solve(a, b))
Ejemplo n.º 12
0
def Rotation(size, aOriginal, precision):
    a = copy.deepcopy(aOriginal)
    # единичная матрица
    e = [[0 if i != j else 1 for i in range(size)] for j in range(size)]
    uMultiply = copy.deepcopy(e)
    n = 0
    while True:
        # находим индекс максимального по модулю элемента в матрице
        iMax = 0
        jMax = 1
        for i in range(size - 1):
            for j in range(i + 1, size):
                if abs(a[i][j]) > abs(a[iMax][jMax]):
                    iMax = i
                    jMax = j
        # вычисляем угол поворота
        if a[iMax][iMax] == a[jMax][jMax]:
            angle = math.pi / 4
        else:
            angle = 0.5 * math.atan(2 * a[iMax][jMax] /
                                    (a[iMax][iMax] - a[jMax][jMax]))
        # создаем матриуц вращения
        u = copy.deepcopy(e)
        u[iMax][iMax] = math.cos(angle)
        u[iMax][jMax] = -math.sin(angle)
        u[jMax][iMax] = math.sin(angle)
        u[jMax][jMax] = math.cos(angle)
        # получаем новую версию матрицы
        tmp = additional.MultiplyMatrix(a, u)
        u[iMax][jMax], u[jMax][iMax] = u[jMax][iMax], u[iMax][
            jMax]  # транспонируем матрицу вращения
        a = additional.MultiplyMatrix(u, tmp)
        uMultiply = additional.MultiplyMatrix(u, uMultiply)
        # проверяем условие останова
        accum = 0
        personalValues = [a[i][i] for i in range(size)]
        print("Собственные значения на %i-ой итерации" % n)
        n += 1
        additional.PrintVector(personalValues)
        for i in range(size - 1):
            for j in range(i + 1, size):
                accum += a[i][
                    j]**2  # получаем половинную сумму квадратов недиагональных элементов
        if math.sqrt(accum) < precision:
            break
    additional.Transpose(uMultiply)
    return personalValues, uMultiply
Ejemplo n.º 13
0
def SimpleIteration(size, a, b, precision):
    alpha, beta = TransformToEqual(size, a, b)
    alphaNorm = additional.MatrixNorm(alpha)
    x = beta.copy()
    i = 0
    while True:
        prev = x.copy()
        multAlfaX = additional.MultiplyMatrivOnVector(size, alpha, x)
        x = additional.SummVectors(size, beta, multAlfaX)
        norm = additional.VectorNorm(size,
                                     additional.SubtractVectors(size, x, prev))
        print("Ответ на %i-ой итерации" % i)
        i += 1
        additional.PrintVector(x)
        if alphaNorm >= 1:
            if norm * alphaNorm / (
                    1 - alphaNorm
            ) <= precision:  # если alphaNorm >= 1, norm <= precision
                break
        elif norm <= precision:
            break
    return x
Ejemplo n.º 14
0
def SimpleIterationMethod(size, a, b, precision):
    print("Метод итераций")
    x = SimpleIteration(size, copy.deepcopy(a), copy.deepcopy(b), precision)
    print("Ответ с точностю", precision, "полученный методом простых итераций")
    additional.PrintVector(x)
Ejemplo n.º 15
0
    i = 0
    while True:
        print("Ответ на %i-ой итерации" % i)
        i += 1
        curX = t2 + t1 @ x
        additional.PrintVector(curX)
        if cNorm * norm(curX - x, numpy.inf) <= precision:
            break
        x = curX
    x = curX
    return x


def SeidelMethod(size, a, b, precision):
    x = Seidel(size, a, b, precision)
    print("Ответ с точностью", precision, "полученный методом Зейделя")
    additional.PrintVector(x)
    x = numpy.linalg.solve(a, b)
    print("Ответ, почлученный через numpy.linalg")
    additional.PrintVector(x)


if __name__ == '__main__':
    size, a, b, precision = additional.GetStatement("3.txt")
    print("Лабораторная работа 1.3")
    print()
    additional.PrintMatrix(a)
    additional.PrintVector(b)
    SimpleIterationMethod(size, a, b, precision)
    SeidelMethod(size, a, b, precision)