50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
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)
|