# How to find the maximum of every slice through a 3D function?

Say I have a function $f(x,y)$ that depends on two variables. How can I find the maximum of the function $f(x,y) \big|_{y = constant}$ for every value of $y$ and plot the value of $f(x_{max}(y), y)$ vs $y$? (I.e. $x_{max}(y)$ is the minimum of the function for a given value of $y$.)

So this would plot the trajectory of the maxima, which could be seen as a ridge of the function.

The solution does not have to be analytic, numerical is fine.

Example:

f = -(x^2 + 1)*(y^2 + 1)
DensityPlot[f, {x, -10, 10}, {y, -10, 10}, PlotRange -> Automatic, PlotLegends -> Automatic, MaxRecursion -> 10]
Plot[f /. x -> 0, {y, -10, 10}]


So here it is trivial to find the maximum of the function at constant $y$, it is simply $x_{max}(y)=0$. The desired plot is the last one, except that instead of f/.x->0 a function that finds the maximum at each $y$ is required.

• Have you tried Plot[NMaxValue[-(x^2 + 1)*(y^2 + 1), x], {y, -10, 10}]? – J. M.'s discontentment Aug 23 '17 at 13:24
• @J.M. that works! I was not aware of the NMaxValue command. – Wolpertinger Aug 23 '17 at 13:53

f = -(x^2 + 1)*(y^2 + 1);

max = MaxValue[f /. y :> #, {x}] & /@ Range[-10, 10, 1];


{-101, -82, -65, -50, -37, -26, -17, -10, -5, -2, -1, -2, -5, -10, -17, -26, -37, -50, -65, -82, -101}

ListLinePlot[max, DataRange -> {-10, 10}]


To visualize it in 3D you can use MeshFunctions:

fun[x_, y_] := -(x^2 + 1)*(y^2 + 1)

Plot3D[fun[x, y], {x, -10, 10}, {y, -10, 10},
MeshFunctions -> (ConditionalExpression[
Derivative[1, 0][fun][#1, #2],
Derivative[2, 0][fun][#1, #2] < 0] &),
MeshStyle -> Directive[Red, Thickness[0.02]],
Mesh -> {{0}},
PlotRange -> {Automatic, Automatic, {-100, 100}}]