Let's begin by assigning your object function to a function in order to make subsequent steps easier to see. f[k_, r_, d_, s_] = (1/(2 (-1 + r)) (d^2 + 2 d k (-1 + r) - 2 d s + k (k + k (-3 + r) r + 2 r s)))/s^2; Next, let's assume that there is a local minimum somewhere within the parameter space you have defined. If that is the case, then it must be true that the derivatives of this function with respect to k and r will be zero, and the second derivatives with respect to k and r will be negative. So: Reduce[{D[f[k, r, d, s], k] == 0, D[f[k, r, d, s], r] == 0, D[f[k, r, d, s], {k, 2}] < 0, D[f[k, r, d, s], {r, 2}] < 0, k r < d, d <= k <= 1, 0 <= d <= 1, 2 d < s, r >= 0}, {k, r}] (* False *) This tells us that there are no conditions where there is a local minimum in the region. Therefore the true minimum must be on the boundary somewhere. Let's see how to visualize this system. We are treating k and r as axes, and d and s as variable parameters. d takes on any values from 0 to 1, so we will have a Manipulate on the outside that lets us assign d within that range. s can take on any value greater than or equal to 2d, so we will have an inner Manipulate that allows you to set a value for s, bounded on the bottom by 2d, and we'll say 10 on the upper bound, but you can change that to whatever makes the most sense for you. Now we plot f[k,r,d,s] over the appropriate range of k and r. k can take on any value from d to 1, so that one is easy. r is a little harder because of the k r < d constraint, but in general r ranges from 0 to d/k. The maximum value of d/k comes at the minimum k (=d), so if we plot r from 0 to 1 we will have enough space. We can further restrict the domain to the correct region by using the RegionFunction option to Plot3D. Manipulate[ Manipulate[ Plot3D[f[k, r, d, s], {k, d, 1}, {r, 0, 1}, RegionFunction -> Function[{k, r, z}, (k r < d) && (1 > r >= 0)], AxesLabel -> {"k", "r", "f"}, ImageSize -> Large, PlotPoints -> 50, PlotRangePadding -> 0.1, WorkingPrecision -> 100], {s, 2 d, 10}], {{d, 0.5}, 0, 1}] [![enter image description here][1]][1] If you play with the resulting parameters, you can see why this is a difficult problem to solve analytically. Low values of d and s will give minima at k=1 and r=0. At higher values of s, the minimum shifts to k=1 and r=d. At higher values of d, the minimum visually looks to be anywhere along the k r = d boundary curve. And then there is the problem Mathematica has with handling the singularity near r=1 and k=d. Given that the position of the minimum changes based on the parameters d and s, you may be better off specifying those values and then asking Mathematica to find the minimum: Minimize[{f[k, r, 0.5, 2], k r < 0.5, r >= 0, 0.5 <= k <= 1}, {k, r}] (* {-1.14162*10^14, {k -> 0.534188, r -> 1.}} *) Here is a way to visualize the whole thing: Manipulate[ Manipulate[ Show[Plot3D[f[k, r, d, s], {k, d, 1}, {r, 0, 1}, RegionFunction -> Function[{k, r, z}, (k r < d) && (1 > r >= 0)], AxesLabel -> {"k", "r", "f"}, ImageSize -> Large, PlotPoints -> 50, PlotRangePadding -> 0.1, WorkingPrecision -> 100], ListPointPlot3D[{{k /. (#[[2]]), r /. (#[[2]]), #[[1]]}}, Filling -> 0, FillingStyle -> Thick, PlotLegends -> {ToString[{k /. (#[[2]]), r /. (#[[2]]), #[[1]]}, StandardForm]}] &@ Minimize[{f[k, r, d, s], k r < d, r >= 0, d <= k <= 1}, {k, r}]], {s, 2 d, 10}], {{d, 0.5}, 0, 1}] [![enter image description here][2]][2] All-in-all, this looks to be a problem that Minimize is not well-suited to. [1]: https://i.sstatic.net/mDkhv.png [2]: https://i.sstatic.net/stn4c.gif