This commit is contained in:
wangobango 2021-05-26 21:00:08 +02:00
parent 22b06e69f2
commit b37d1af801

33
main.py
View File

@ -1,6 +1,13 @@
from typing import Tuple from typing import Tuple
import numpy as np import numpy as np
from copy import deepcopy
"""
Class that performs qr decomposition. Use methods:
perform_householder_QR,
perform_givens_QR
both accept np.nadarry that fulfils m >= n condtion is 2d, and contains real numbers.
"""
class QR: class QR:
def __init__(self) -> None: def __init__(self) -> None:
pass pass
@ -65,21 +72,6 @@ class QR:
return Q[:n].T, np.triu(R[:n]) return Q[:n].T, np.triu(R[:n])
def __givens_rotation(self, a: np.ndarray, b: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
if b == 0:
c = 1
s = 0
else:
if np.abs(b) > np.abs(a):
r = a / b
s = 1 / np.sqrt(1 + r**2)
c = s * r
else:
r = b / a
c = 1 / np.sqrt(1 + r**2)
s = c * r
return c,s
def __givens_qr(self, matrix: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: def __givens_qr(self, matrix: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
m, n = matrix.shape m, n = matrix.shape
R = matrix R = matrix
@ -92,7 +84,7 @@ class QR:
R[i-1:i+1, j] = G @ R[i-1:i+1, j] R[i-1:i+1, j] = G @ R[i-1:i+1, j]
Q[i-1:i+1, :] = G @ Q[i-1:i+1, :] Q[i-1:i+1, :] = G @ Q[i-1:i+1, :]
return Q, R return Q.T, R
""" """
Method that performs Givens Rotation QR, acceptcs 2D, real numbers matrix, that Method that performs Givens Rotation QR, acceptcs 2D, real numbers matrix, that
@ -115,17 +107,20 @@ if __name__ == "__main__":
matrix = np.matrix('1 2 4; 5 6 7; 8 9 10') matrix = np.matrix('1 2 4; 5 6 7; 8 9 10')
matrix = np.asarray(matrix) matrix = np.asarray(matrix)
print(matrix) print(matrix)
Q, R = qr.perform_householder_QR(matrix) a = deepcopy(matrix)
b = deepcopy(matrix)
c = deepcopy(matrix)
Q, R = qr.perform_householder_QR(a)
print("Householder:") print("Householder:")
print(Q) print(Q)
print(R) print(R)
print("Givens") print("Givens")
Q, R = qr.perform_givens_QR(matrix) Q, R = qr.perform_givens_QR(b)
print(Q) print(Q)
print(R) print(R)
# dla porównania # dla porównania
print("Numpy") print("Numpy")
Q, R = np.linalg.qr(matrix) Q, R = np.linalg.qr(c)
print(Q) print(Q)
print(R) print(R)