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)
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)
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))
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))
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)
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))
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)
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))
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
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))
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))
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
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
def SimpleIterationMethod(size, a, b, precision): print("Метод итераций") x = SimpleIteration(size, copy.deepcopy(a), copy.deepcopy(b), precision) print("Ответ с точностю", precision, "полученный методом простых итераций") additional.PrintVector(x)
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)