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


u2 = x * y * exp(-x^2 - 2*y^2)

eq2x = diff(u2, x) == 0
eq2y = diff(u2, y) == 0
# Упростим, сократив экспоненту
eq2x_simple = (diff(u2, x) / exp(-x^2-2*y^2)).full_simplify() == 0
eq2y_simple = (diff(u2, y) / exp(-x^2-2*y^2)).full_simplify() == 0
crit_points = solve([eq2x_simple, eq2y_simple], [x, y], solution_dict=True)
# Отфильтруем точки внутри квадрата
inside_pts = []
for sol in crit_points:
    xv, yv = sol[x], sol[y]
    if abs(xv) < 2 and abs(yv) < 2 and xv in RR and yv in RR:
        inside_pts.append((xv, yv))
values_inside = [u2.subs(x=x0, y=y0) for (x0, y0) in inside_pts]

# Границы: y = ±2, x = ±2
# Вспомогательная функция для поиска экстремумов на отрезке [a,b]
def find_extrema_on_segment(expr, var, a, b):
    # expr - функция одной переменной (var)
    der = diff(expr, var)
    crit = solve(der == 0, var, solution_dict=True)
    points = [a, b]
    for sol in crit:
        val = sol[var]
        if val in RR and a <= val <= b:
            points.append(val)
    return [expr.subs(var==p) for p in points]

# y = 2
u_y2 = u2.subs(y=2)
vals_y2 = find_extrema_on_segment(u_y2, x, -2, 2)
# y = -2
u_ym2 = u2.subs(y=-2)
vals_ym2 = find_extrema_on_segment(u_ym2, x, -2, 2)
# x = 2
u_x2 = u2.subs(x=2)
vals_x2 = find_extrema_on_segment(u_x2, y, -2, 2)
# x = -2
u_xm2 = u2.subs(x=-2)
vals_xm2 = find_extrema_on_segment(u_xm2, y, -2, 2)

# Углы уже включены (концы отрезков), но добавим для полноты
corners = [(-2,-2), (-2,2), (2,-2), (2,2)]
vals_corners = [u2.subs(x=cx, y=cy) for (cx,cy) in corners]

all_vals = values_inside + vals_y2 + vals_ym2 + vals_x2 + vals_xm2 + vals_corners
min_val = min(all_vals)
max_val = max(all_vals)
print(f"Минимум = {min_val.n()} (точное: {min_val})")
print(f"Максимум = {max_val.n()} (точное: {max_val})")