u4 = x*y + x^4 + 3*y^4 + x^2*y^2
# Стационарные точки внутри
eq4x = diff(u4, x) == 0
eq4y = diff(u4, y) == 0
crit4 = solve([eq4x, eq4y], [x, y], solution_dict=True)
inside_vals4 = []
for sol in crit4:
xv, yv = sol[x], sol[y]
if abs(xv) < 2 and abs(yv) < 2 and xv in RR and yv in RR:
inside_vals4.append(u4.subs(x=xv, y=yv))
# Границы
u4_y2 = u4.subs(y=2)
u4_ym2 = u4.subs(y=-2)
u4_x2 = u4.subs(x=2)
u4_xm2 = u4.subs(x=-2)
vals4_y2 = find_extrema_on_segment(u4_y2, x, -2, 2)
vals4_ym2 = find_extrema_on_segment(u4_ym2, x, -2, 2)
vals4_x2 = find_extrema_on_segment(u4_x2, y, -2, 2)
vals4_xm2 = find_extrema_on_segment(u4_xm2, y, -2, 2)
vals4_corners = [u4.subs(x=cx, y=cy) for (cx,cy) in corners]
all_vals4 = inside_vals4 + vals4_y2 + vals4_ym2 + vals4_x2 + vals4_xm2 + vals4_corners
min4 = min(all_vals4)
max4 = max(all_vals4)
print(f"Минимум = {min4.n()} (точное: {min4})")
print(f"Максимум = {max4.n()} (точное: {max4})")