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


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

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

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

# Сетка
xx = np.linspace(-2, 2, 50)
X, Y = np.meshgrid(xx, xx)
Z = f([X, Y])  # функция от двух массивов

# 3D поверхность
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
ax1.scatter(x_nm[0], x_nm[1], f(x_nm), color='red', s=50, label='Минимум')
ax1.set_title('Поверхность')
ax1.legend()

# Контур + стрелки градиентов
ax2 = fig.add_subplot(122)
ax2.contour(X, Y, Z, levels=20, cmap='viridis')
ax2.plot(x_nm[0], x_nm[1], 'ro', markersize=8, label='Минимум')
# Стрелки градиентов (аналитические)
def grad(x):
    return np.array([2*x[0] + 1.1*x[1] + 1, 2*x[1] + 1.1*x[0] - 1])
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]
ax2.quiver(Xq, Yq, U, V, alpha=0.6)
ax2.set_title('Линии уровня и градиенты')
ax2.legend()
plt.tight_layout()
plt.show()