import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve, minimize

# Definicija sistema nelinearnih jednačina
def system_equations(xy):
    x, y = xy
    eq1 = x**2 + y**2 - 25
    eq2 = x*y - 9
    return [eq1, eq2]

# Početna tačka za numeričke metode
initial_guess = [0, 0]

# Rešavanje pomoću Newtonove metode
result_newton = fsolve(system_equations, initial_guess)
print("Newtonova metoda rešenje:", result_newton)

# Rešavanje pomoću metode konjugatnih gradijenata
result_cg = minimize(lambda xy: np.sum(np.abs(system_equations(xy))), initial_guess, method='CG').x
print("Metoda konjugatnih gradijenata rešenje:", result_cg)

# Rešavanje pomoću Nelder-Mead metode
result_nelder_mead = minimize(lambda xy: np.sum(np.abs(system_equations(xy))), initial_guess, method='Nelder-Mead').x
print("Nelder-Mead metoda rešenje:", result_nelder_mead)

# Grafički prikaz sistema
x_vals = np.linspace(-5, 5, 100)
y_vals = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x_vals, y_vals)
Z1, Z2 = system_equations([X, Y])

plt.contour(X, Y, Z1, levels=[0], colors='r', label='Equation 1')
plt.contour(X, Y, Z2, levels=[0], colors='b', label='Equation 2')
plt.scatter(*result_newton, color='green', marker='o', label='Newtons method')
plt.scatter(*result_cg, color='orange', marker='o', label='Method of conjugate gradients')
plt.scatter(*result_nelder_mead, color='purple', marker='o', label='Nelder-Mead method')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Solving systems of nonlinear equations using different numerical methods')
plt.show()
