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})")