import math
# Целевая функция
def f(x1, x2):
return 2 * (x1 - 4) ** 2 + (x2 - 6) ** 2
# Градиент
def grad(x1, x2):
df_dx1 = 4 * (x1 - 4)
df_dx2 = 2 * (x2 - 6)
return df_dx1, df_dx2
# Начальная точка
x1 = 7
x2 = 7
# Параметры Армихо
alpha_max = 1.0
rho = 0.5
c = 0.5
# Точность
eps = 0.01
# Максимум итераций
max_iter = 100
print("Метод градиентного спуска (Армихо)\n")
for k in range(max_iter):
g1, g2 = grad(x1, x2)
grad_norm = math.sqrt(g1**2 + g2**2)
print(f"Итерация {k}")
print(f"x = ({x1:.6f}, {x2:.6f})")
print(f"grad = ({g1:.6f}, {g2:.6f})")
print(f"|grad| = {grad_norm:.6f}")
print(f"f(x) = {f(x1, x2):.6f}")
# Проверка остановки
if grad_norm < eps:
break
# Подбор alpha по правилу Армихо
alpha = alpha_max
while True:
# Новая точка
new_x1 = x1 - alpha * g1
new_x2 = x2 - alpha * g2
left = f(new_x1, new_x2)
right = f(x1, x2) - c * alpha * (g1**2 + g2**2)
# Условие Армихо
if left <= right:
break
alpha = alpha * rho
print(f"Подобранный alpha = {alpha:.6f}\n")
# Переход к новой точке
x1 = new_x1
x2 = new_x2
print("Минимум найден:")
print(f"x* = ({x1:.6f}, {x2:.6f})")
print(f"f(x*) = {f(x1, x2):.6f}")