This commit is contained in:
2026-03-11 12:47:37 +01:00
parent b391a0c8a4
commit 98e6829ed7
4 changed files with 185 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
import numpy as np
import sympy as sp
def function_vector(x_value, y_value):
first_function_value = (x_value ** 2) / (186 ** 2) - (y_value ** 2) / (300 ** 2 - 186 ** 2) - 1
second_function_value = ((y_value - 500) ** 2) / (279 ** 2) - ((x_value - 300) ** 2) / (500 ** 2 - 279 ** 2) - 1
return np.array([first_function_value, second_function_value], dtype=float)
def jacobian_matrix(x_value, y_value):
jacobian_11 = (2 * x_value) / (186 ** 2)
jacobian_12 = (-2 * y_value) / (300 ** 2 - 186 ** 2)
jacobian_21 = (-2 * (x_value - 300)) / (500 ** 2 - 279 ** 2)
jacobian_22 = (2 * (y_value - 500)) / (279 ** 2)
return np.array([
[jacobian_11, jacobian_12],
[jacobian_21, jacobian_22]
], dtype=float)
def newton_method_for_system(start_vector, tolerance=1e-5, maximum_number_of_iterations=100):
current_vector = np.array(start_vector, dtype=float)
for iteration_index in range(maximum_number_of_iterations):
current_function_value = function_vector(current_vector[0], current_vector[1])
current_function_norm = np.linalg.norm(current_function_value, 2)
if current_function_norm < tolerance:
return current_vector, iteration_index, current_function_norm
current_jacobian_matrix = jacobian_matrix(current_vector[0], current_vector[1])
newton_step = np.linalg.solve(current_jacobian_matrix, -current_function_value)
current_vector = current_vector + newton_step
final_function_value = function_vector(current_vector[0], current_vector[1])
final_function_norm = np.linalg.norm(final_function_value, 2)
return current_vector, maximum_number_of_iterations, final_function_norm
def plot_implicit_functions():
x_symbol, y_symbol = sp.symbols('x y')
first_function_expression = x_symbol ** 2 / 186 ** 2 - y_symbol ** 2 / (300 ** 2 - 186 ** 2) - 1
second_function_expression = (y_symbol - 500) ** 2 / 279 ** 2 - (x_symbol - 300) ** 2 / (500 ** 2 - 279 ** 2) - 1
first_plot = sp.plot_implicit(
sp.Eq(first_function_expression, 0),
(x_symbol, -2000, 2000),
(y_symbol, -2000, 2000),
show=False
)
second_plot = sp.plot_implicit(
sp.Eq(second_function_expression, 0),
(x_symbol, -2000, 2000),
(y_symbol, -2000, 2000),
show=False
)
first_plot.append(second_plot[0])
first_plot.show()
def main():
print("Plot of the two hyperbolas is opened...")
plot_implicit_functions()
# Hier die 4 Startvektoren aus dem Plot eintragen
start_vectors = [
np.array([-1300, 1600]),
np.array([750, 900]),
np.array([-200, 70]),
np.array([250, 220])
]
print("\nNewton-Verfahren für die 4 Startvektoren:\n")
for solution_index, current_start_vector in enumerate(start_vectors, start=1):
solution_vector, number_of_iterations, final_norm = newton_method_for_system(current_start_vector)
print(f"Lösung {solution_index}:")
print(f"startvektor = {current_start_vector}")
print(f" Näaherungslösung = ({solution_vector[0]:.10f}, {solution_vector[1]:.10f})")
print(f" Iterationen = {number_of_iterations}")
print(f" ||f(x^(k))||_2 = {final_norm:.10e}")
print()
if __name__ == "__main__":
main()