49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
import numpy as np
|
|
|
|
def Kuengjoe_S12_Aufg4(in_matrix: np.ndarray, iteration: int):
|
|
current_iteration = np.array(in_matrix, dtype=float)
|
|
dimension = current_iteration.shape[0]
|
|
acc_orthogonal_matrix = np.eye(dimension, dtype=float)
|
|
|
|
for iteration in range(iteration):
|
|
q_matrix, r_matrix = np.linalg.qr(current_iteration)
|
|
current_iteration = r_matrix @ q_matrix
|
|
acc_orthogonal_matrix = acc_orthogonal_matrix @ q_matrix
|
|
return current_iteration, acc_orthogonal_matrix
|
|
|
|
|
|
if __name__ == "__main__":
|
|
#4a)
|
|
test_matrix = np.array([
|
|
[1, -2, 0],
|
|
[2, 0, 1],
|
|
[0, -2, 1]
|
|
], dtype=float)
|
|
|
|
ak_1, pk_1 = Kuengjoe_S12_Aufg4(test_matrix, 1)
|
|
print("A1 =\n", np.round(ak_1, 6))
|
|
print("P1 =\n", np.round(pk_1, 6))
|
|
|
|
#4b)
|
|
symmetric_matrix = np.array([
|
|
[6, 1, 2, 1, 2],
|
|
[1, 5, 0, 2, -1],
|
|
[2, 0, 5, -1, 0],
|
|
[1, 2, -1, 6, 1],
|
|
[2, -1, 0, 1, 7]
|
|
], dtype=float)
|
|
|
|
ak_100, pk_100 = Kuengjoe_S12_Aufg4(symmetric_matrix, 100)
|
|
|
|
orthogonality_residual = np.linalg.norm(pk_100.T @ pk_100 - np.eye(5))
|
|
print("||P^T P - I|| =", orthogonality_residual)
|
|
|
|
approx_eigenvalues_from_qr = np.diag(ak_100)
|
|
print("Eigenvalues approx (diag(Ak)) =", approx_eigenvalues_from_qr)
|
|
|
|
#4c)
|
|
|
|
eigenvalues_numpy, eigenvectors_numpy = np.linalg.eig(symmetric_matrix)
|
|
print(eigenvalues_numpy)
|
|
|