import numpy as np from scipy.optimize import minimize def objective(values): x, y = values return (x - 2.0) ** 2 + (y + 1.0) ** 2 + 0.5 def gradient(values): x, y = values return np.array([2.0 * (x - 2.0), 2.0 * (y + 1.0)]) start = np.array([0.0, 0.0]) expected = np.array([2.0, -1.0]) result = minimize( objective, start, method="BFGS", jac=gradient, options={"gtol": 1e-10}, ) print(f"success: {result.success}") print(f"message: {result.message}") print(f"x: {result.x}") print(f"fun: {result.fun:.6f}") print(f"gradient_norm: {np.linalg.norm(result.jac):.2e}") print(f"distance_to_expected: {np.linalg.norm(result.x - expected):.2e}") print(f"iterations: {result.nit}") print(f"function_calls: {result.nfev}")