import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# Определение функции
def f(x1, x2):
return (x1 - 1.1)**2 + (1.2 * x2 - 1.1)**2 - 1.2 * x1 * x2
# Создание сетки
x1 = np.linspace(-1, 4, 40)
x2 = np.linspace(-1, 4, 40)
X, Y = np.meshgrid(x1, x2)
Z = f(X, Y)
# Фигура с двумя подграфиками
fig = plt.figure(figsize=(10, 10))
# 1) 3D-поверхность (сверху)
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
surf = ax1.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
ax1.set_title('3D поверхность функции')
ax1.set_xlabel('x1')
ax1.set_ylabel('x2')
ax1.set_zlabel('f(x1, x2)')
fig.colorbar(surf, ax=ax1, shrink=0.5, aspect=10)
# 2) Контуры + градиент (снизу)
ax2 = fig.add_subplot(2, 1, 2)
contour = ax2.contour(X, Y, Z, levels=20, cmap='viridis')
ax2.set_title('Контуры и поле градиента')
ax2.set_xlabel('x1')
ax2.set_ylabel('x2')
fig.colorbar(contour, ax=ax2)
# Вычисление и отрисовка градиента
py, px = np.gradient(Z)
ax2.quiver(X, Y, px, py, alpha=0.6)
plt.tight_layout()
plt.show()