From 283081ec9c1225dc4e2817496bfd4a02c80f3612 Mon Sep 17 00:00:00 2001 From: zimmersandro Date: Thu, 9 Apr 2026 14:24:50 +0200 Subject: [PATCH] feat: allgemeiner newton verfahren --- .../allgemeiner_newton_verfahren.py | 54 +++++++++++++++++++ src/optimierung/newton_verfahren.py | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/optimierung/allgemeiner_newton_verfahren.py diff --git a/src/optimierung/allgemeiner_newton_verfahren.py b/src/optimierung/allgemeiner_newton_verfahren.py new file mode 100644 index 0000000..4b26a95 --- /dev/null +++ b/src/optimierung/allgemeiner_newton_verfahren.py @@ -0,0 +1,54 @@ +# %% +import numpy as np +import sympy as sp +import matplotlib.pyplot as plt + +# Parameter +N = 200 +x = sp.Symbol("x") + +# Funktion +f_sym = x**4 - 10 * x**2 + x + +# Ableitungen +f = sp.lambdify(x, f_sym, "numpy") +f_prime = sp.lambdify(x, sp.diff(f_sym, x), "numpy") +f_second = sp.lambdify(x, sp.diff(f_sym, x, 2), "numpy") + +# Daten +x_data = np.linspace(-4, 4, N) +f_data = f(x_data) + +# Plot +plt.figure(1) +plt.plot(x_data, f_data) +plt.xlabel("x") +plt.ylabel("y") +plt.grid("on") +plt.show() + +# Newton Verfahren +# Startwert +startwerte = [0.1] + +# Iterationsformel +x_n = lambda x: x - f_prime(x) / np.abs(f_second(x)) + +# Iteration +for x_0 in startwerte: + n = 0 + x_i = x_0 + f_x_prime = f_prime(x_0) + f_x_second = f_second(x_0) + print(f"x_{n}: {x_0}\nf'(x_{n}): {f_x_prime}\nf''(x_{n}): {f_x_second}\n") + + limit = 1000 + + while np.abs(f_x_prime) > 1e-10 and limit > 0: + n += 1 + x_i = x_n(x_i) + f_x_prime = f_prime(x_i) + f_x_second = f_second(x_i) + print(f"x_{n}: {x_i}\nf'(x_{n}): {f_x_prime}\nf''(x_{n}): {f_x_second}\n") + limit -= 1 +# %% diff --git a/src/optimierung/newton_verfahren.py b/src/optimierung/newton_verfahren.py index 8c3ceff..45a336b 100644 --- a/src/optimierung/newton_verfahren.py +++ b/src/optimierung/newton_verfahren.py @@ -92,7 +92,7 @@ for x_0 in startwerte: f_x_prime = f_prime(x_0) print(f"x_{n}: {x_0}\nf'(x_{n}): {f_x_prime}\n") - limit = 4 + limit = 1000 while np.abs(f_x_prime) > 1e-16 and limit > 0: n += 1