Загрузка данных


# Программа 3: Линии уровня, стрелки градиентов и точки минимумов (вариант 16)
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x[0]**2 + x[1]**2 + 1.1*x[0]*x[1] + x[0] - x[1] + 1.1

def grad(x):
    return np.array([2*x[0] + 1.1*x[1] + 1, 2*x[1] + 1.1*x[0] - 1])

# Точки минимумов из первых двух программ (одинаковые)
x_min1 = np.array([-0.47619048, 0.71428571])  # метод Нелдера-Мида
x_min2 = np.array([-0.47619048, 0.71428571])  # градиентный метод

# Сетка
xx = np.linspace(-2, 2, 50)
X, Y = np.meshgrid(xx, xx)
Z = X**2 + Y**2 + 1.1*X*Y + X - Y + 1.1

# График
plt.figure(figsize=(8, 6))
contour = plt.contour(X, Y, Z, levels=20, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=8)
plt.colorbar(contour, label='f(x1, x2)')

# Стрелки градиентов (редкая сетка)
Xq, Yq = np.meshgrid(np.linspace(-2, 2, 12), np.linspace(-2, 2, 12))
U, V = np.zeros_like(Xq), np.zeros_like(Yq)
for i in range(Xq.shape[0]):
    for j in range(Xq.shape[1]):
        g = grad([Xq[i,j], Yq[i,j]])
        U[i,j], V[i,j] = g[0], g[1]
plt.quiver(Xq, Yq, U, V, alpha=0.6)

# Точки минимумов (два, но они совпадают – наносим один раз)
plt.plot(x_min1[0], x_min1[1], 'ro', markersize=8, label='Минимум (Нелдер-Мид)')
plt.plot(x_min2[0], x_min2[1], 'b^', markersize=8, label='Минимум (градиентный)')

plt.title('Линии уровня и градиенты (вариант 16)')
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend()
plt.grid(alpha=0.3)
plt.axis('equal')
plt.tight_layout()
plt.show()