feat: Skript mit Newton Verfahren, einfach und modifiziert. build: sympy zu requirements hinzugefügt
This commit is contained in:
parent
4e31672189
commit
d39e3fcff0
@ -2,3 +2,4 @@ matplotlib == 3.10.8
|
||||
numpy == 2.4.3
|
||||
black == 26.3.1
|
||||
ipykernel == 7.2.0
|
||||
sympy == 1.14.0
|
||||
102
src/optimierung/newton_verfahren.py
Normal file
102
src/optimierung/newton_verfahren.py
Normal file
@ -0,0 +1,102 @@
|
||||
#%%
|
||||
import numpy as np
|
||||
import sympy as sp
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
#%%
|
||||
# "Einfacher" Newton Verfahren
|
||||
# Parameter
|
||||
N = 200
|
||||
x = sp.Symbol('x')
|
||||
|
||||
# Funktion
|
||||
f_sym = sp.sin(3*x)+0.02*x**2
|
||||
|
||||
# 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(0,10,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.axis("image")
|
||||
|
||||
# Newton Verfahren
|
||||
# Startwert
|
||||
startwerte = [6.6, 3.4, 8.38]
|
||||
|
||||
# Iterationsformel
|
||||
x_n = lambda x: x - f_prime(x)/f_second(x)
|
||||
|
||||
# Iteration
|
||||
for x_0 in startwerte:
|
||||
n = 0
|
||||
x_i = x_0
|
||||
f_x_prime = f_prime(x_0)
|
||||
print(f"n: {n}\nf(x): {x_0}\nf'(x): {f_x_prime}\n")
|
||||
|
||||
limit = 4
|
||||
|
||||
while np.abs(f_x_prime) > 1e-16 and limit > 0:
|
||||
n += 1
|
||||
x_i = x_n(x_i)
|
||||
f_x_prime = f_prime(x_i)
|
||||
print(f"n: {n}\nf(x): {x_i}\nf'(x): {f_x_prime}\n")
|
||||
limit -= 1
|
||||
|
||||
#%%
|
||||
# "Modifizierter" Newton Verfahren
|
||||
# Parameter
|
||||
N = 200
|
||||
x = sp.Symbol('x')
|
||||
|
||||
# Funktion
|
||||
f_sym = sp.sin(3*x)+0.02*x**2
|
||||
|
||||
# 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(0,10,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.axis("image")
|
||||
|
||||
# Newton Verfahren
|
||||
# Startwert
|
||||
startwerte = [6.6, 3.4, 8.38]
|
||||
|
||||
# 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)
|
||||
print(f"n: {n}\nf(x): {x_0}\nf'(x): {f_x_prime}\n")
|
||||
|
||||
limit = 4
|
||||
|
||||
while np.abs(f_x_prime) > 1e-16 and limit > 0:
|
||||
n += 1
|
||||
x_i = x_n(x_i)
|
||||
f_x_prime = f_prime(x_i)
|
||||
print(f"n: {n}\nf(x): {x_i}\nf'(x): {f_x_prime}\n")
|
||||
limit -= 1
|
||||
Loading…
x
Reference in New Issue
Block a user