Serie 11 and 12

This commit is contained in:
2026-01-03 15:28:37 +01:00
parent 147aa8544a
commit d20cff68a7
4 changed files with 193 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
import numpy as np
def Kuengjoe_S12_Aufg5(input_matrix: np.ndarray,
initial_vector: np.ndarray,
tolerance: float = 1e-4,
max_iterations: int = 1000):
current_normalized_vector = initial_vector.astype(float)
current_normalized_vector = current_normalized_vector / np.linalg.norm(current_normalized_vector, ord=2)
number_of_performed_iterations = 0
last_difference_norm = None
for iteration_index in range(max_iterations):
multiplied_vector = input_matrix @ current_normalized_vector
next_normalized_vector = multiplied_vector / np.linalg.norm(multiplied_vector, ord=2)
difference_norm = np.linalg.norm(next_normalized_vector - current_normalized_vector, ord=2)
number_of_performed_iterations = iteration_index + 1
last_difference_norm = difference_norm
if difference_norm < tolerance:
current_normalized_vector = next_normalized_vector
break
current_normalized_vector = next_normalized_vector
rayleigh_quotient_eigenvalue_estimate = float(
current_normalized_vector.T @ (input_matrix @ current_normalized_vector)
)
return rayleigh_quotient_eigenvalue_estimate, current_normalized_vector, number_of_performed_iterations, last_difference_norm
if __name__ == "__main__":
matrix_a = np.array([
[1, 1, 0],
[3, -1, 2],
[2, -1, 3]
], dtype=float)
initial_vector_x0 = np.array([1, 0, 0], dtype=float)
dominant_eigenvalue_estimate, dominant_eigenvector_estimate, iteration_count, final_difference_norm = (
Kuengjoe_S12_Aufg5(matrix_a, initial_vector_x0, tolerance=1e-4)
)
print("von-Mises result")
print("iterations =", iteration_count)
print("final ||x_{k+1}-x_k||2 =", final_difference_norm)
print("dominant eigenvalue (Rayleigh) =", dominant_eigenvalue_estimate)
print("dominant eigenvector =", dominant_eigenvector_estimate)
eigenvalues_numpy, eigenvectors_numpy = np.linalg.eig(matrix_a)
index_of_dominant_eigenvalue = int(np.argmax(np.abs(eigenvalues_numpy)))
dominant_eigenvalue_numpy = float(eigenvalues_numpy[index_of_dominant_eigenvalue])
dominant_eigenvector_numpy = eigenvectors_numpy[:, index_of_dominant_eigenvalue].astype(float)
dominant_eigenvector_numpy = dominant_eigenvector_numpy / np.linalg.norm(dominant_eigenvector_numpy, ord=2)
print("\nnp.linalg.eig check")
print("dominant eigenvalue (eig) =", dominant_eigenvalue_numpy)
print("dominant eigenvector (eig) =", dominant_eigenvector_numpy)
# confronto robusto (segno +/-)
difference_same_sign = np.linalg.norm(dominant_eigenvector_estimate - dominant_eigenvector_numpy, ord=2)
difference_opposite_sign = np.linalg.norm(dominant_eigenvector_estimate + dominant_eigenvector_numpy, ord=2)
print("\nvector agreement (min with +/- sign) =", min(difference_same_sign, difference_opposite_sign))