'Find maximum and minimum of multivariable function in sympy

I have the following function:

f = x**2 + y**2

I would like to use sympy to find the maximum of and minimum value in the unit square [0,1] in x and [0,1] in y.

The expected outcome would be 0 for point [0,0] and 2 for point [1,1]

Can this be achieved?



Solution 1:[1]

I did something clunky, but appears to work [although not fast]:

def findMaxMin(f):
    
    # find stationary points:
    stationary_points = sym.solve([f.diff(x), f.diff(y)], [x, y], dict=True)   

    # Append boundary points
    stationary_points.append({x:0, y:0})
    stationary_points.append({x:1, y:0})
    stationary_points.append({x:1, y:1})
    stationary_points.append({x:0, y:1})
    
    # store results after evaluation
    results = []
    
    # iteration counter
    j = -1
    
    for i in range(len(stationary_points)):
        j = j+1
        x1 = stationary_points[j].get(x)
        y1 = stationary_points[j].get(y)
        
        # If point is in the domain evalute and append it
        if (0 <= x1 <=  1) and ( 0 <= y1 <=  1):
            tmp = f.subs({x:x1, y:y1})
            results.append(tmp)
        else:
            # else remove the point
            stationary_points.pop(j)
            j = j-1
            
    # Variables to store info
    returnMax = []
    returnMin = []
    
    # Get the maximum value
    maximum = max(results)
    
    # Get the position of all the maximum values
    maxpos = [i for i,j in enumerate(results) if j==maximum]
    
    # Append only unique points
    append = False
    for item in maxpos:
        for i in returnMax:
            if (stationary_points[item] in i.values()):
                append = True
               
        if (not(append)):
            returnMax.append({maximum: stationary_points[item]})
    
    # Get the minimum value
    minimum  = min(results)
    
    # Get the position of all the minimum  values
    minpos = [i for i,j in enumerate(results) if j==minimum ]
    
    # Append only unique points
    append = False
    for item in minpos:
        for i in returnMin:
            if (stationary_points[item] in i.values()):
                append = True
               
        if (not(append)):
            returnMin.append({minimum: stationary_points[item]})
    

    
    return [returnMax, returnMin]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1