From db3648bebb0099ae55d5aeb873ce2f2f1105f35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joe=20K=C3=BCng?= Date: Wed, 26 Nov 2025 16:24:38 +0100 Subject: [PATCH] Serie 09 --- Kuengjoe_S09/Kuengjoe_S09_Aufg2.py | 49 ++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Kuengjoe_S09/Kuengjoe_S09_Aufg2.py diff --git a/Kuengjoe_S09/Kuengjoe_S09_Aufg2.py b/Kuengjoe_S09/Kuengjoe_S09_Aufg2.py new file mode 100644 index 0000000..2ba85bb --- /dev/null +++ b/Kuengjoe_S09/Kuengjoe_S09_Aufg2.py @@ -0,0 +1,49 @@ +import numpy as np + + +def Kuengjoe_S09_Aufg2(A: np.ndarray, A_tilde: np.ndarray, + b: np.ndarray, b_tilde: np.ndarray): + try: + x = np.linalg.solve(A, b) + except np.linalg.LinAlgError as e: + raise ValueError(f"Ungestörte Matrix A ist singulär oder schlecht konditioniert: {e}") + + try: + x_tilde = np.linalg.solve(A_tilde, b_tilde) + except np.linalg.LinAlgError as e: + raise ValueError(f"Gestörte Matrix A_tilde ist singulär oder schlecht konditioniert: {e}") + + norm_A_inf = np.linalg.norm(A, np.inf) + norm_AtAtilde = np.linalg.norm(A - A_tilde, np.inf) + norm_b_inf = np.linalg.norm(b, np.inf) + norm_bbtilde = np.linalg.norm(b - b_tilde, np.inf) + + cond_A_inf = np.linalg.cond(A, np.inf) + + ratio_A = norm_AtAtilde / norm_A_inf + ratio_b = norm_bbtilde / norm_b_inf + + if cond_A_inf * ratio_A < 1.0: + dx_max = (cond_A_inf / (1 - cond_A_inf * ratio_A)) \ + * (ratio_A + ratio_b) + else: + dx_max = np.nan + + # 4. Beobachteter Fehler + dx_obs = np.linalg.norm(x - x_tilde, np.inf) / np.linalg.norm(x, np.inf) + + return x, x_tilde, dx_max, dx_obs + + +if __name__ == "__main__": + A = np.array([[1, 0, 2], + [0, 1, 0], + [1e-4, 0, 1e-4]]) + At = A.copy() + At[0, 2] += 1e-6 + b = np.array([1, 1, 0]) + bt = b.copy(); + bt[2] += 1e-7 + + x, xt, dx_max, dx_obs = Kuengjoe_S09_Aufg2(A, At, b, bt) + print("dx_obs =", dx_obs, " dx_max =", dx_max)