import numpy as np
from scipy.optimize import minimize
def f(x):
"""Целевая функция (Розенброк-подобная)"""
x1, x2 = x
return 1.2 * (2 * x2 - x1**2)**2 + 10 * (1.1 - x1)**2
def grad(x):
"""Аналитический градиент"""
x1, x2 = x
df_dx1 = -4.8 * x1 * (2 * x2 - x1**2) - 20 * (1.1 - x1)
df_dx2 = 4.8 * (2 * x2 - x1**2)
return np.array([df_dx1, df_dx2])
def gradient_descent(f, grad, x0, h=2.0, eps=1e-6):
x = np.array(x0, dtype=float)
fx = f(x)
it = 0
while abs(h) >= eps and it < 1000:
G = grad(x)
norm_G = np.linalg.norm(G)
if norm_G == 0:
break
V = G / norm_G
z = x - h * V
fz = f(z)
if fz < fx:
x = z
fx = fz
else:
if h < eps:
break
h /= 3.0
it += 1
return x, fx, it
x0 = np.array([2.0, 1.0])
x_min, f_min, it = gradient_descent(f, grad, x0)
print("Градиентный метод (собственная реализация)")
print(f"Точка минимума: ({x_min[0]:.8f}, {x_min[1]:.8f})")
print(f"Значение функции: {f_min:.8f}")
print(f"Число итераций: {it}")
res = minimize(f, x0, jac=grad, method='BFGS')
print("\nПроверка (BFGS):")
print(f"x = ({res.x[0]:.8f}, {res.x[1]:.8f})")
print(f"f = {res.fun:.8f}")