Skip to main content

mathematical optimization - How to define and plot a maximum function?


Define a function $g$ as follows:


f = 2/((x1 + Sqrt[3] x2)^2 + (y1 + Sqrt[3] y2)^2)
X = vx1^2*D[D[f, x1], x1] + vx2^2*D[D[f, x2], x2] + 2 vx1*vx2*D[D[f, x1], x2]
Y= vx1*D[f, x1] + vx2*D[f, x2]
g=X+Y^2


The function $g$ is clearly a function in 6 variables ($vx1,vx2,x1,x2,y1,y2$).


Now I want to define a function in two variables $max$ as the maximum of $g$ for $x1,x2,y1,y2$ which vary in the following hypersurface


H = ImplicitRegion[{3 (-x1^2 - y1^2 + x2^2 + y2^2) + 
2 Sqrt[3] (x1*x2 + y1*y2) == 0}, {x1, y1, x2, y2}]

So I want to (but I don't know how to) define the function $max:\mathbb{R}^2\rightarrow \mathbb{R}$ as follows:


$$max(vx1,vx2)=\max\limits_{(x1,x2,y1,y2)\in H}g(vx1,vx2,x1,x2,y1,y2)$$


All I could think of is the command


FindMaximum[{g, {x1, y1, x2, y2} ∈ H}, {x1, y1, x2, y2}]


but this doesn't define a function, it just gives the maximum of $g$ for specific values of $vx1,vx2$.


How can I define the function $max$? It's important to me to define it as a function because I need to




  • derive it in its smooth points




  • plot it





  • define other functions which involve $max$ in their definition




How can I do it?


EDIT: I followed the suggestions of user Corey979 and defined the function max[vx1,vx2], but with FindMaximum substitued by MaxValue, since I'm interested in the maximum value (as I thought was clear in my definition). But then I'm not able to do any operation with the function max:


Any of these operations


D[max[vx1, vx2], vx1]

Plot3D[max[vx1, vx2], {vx1, -10, 10}, {vx2, -10, 10}]


FindMaximum[{max[vx1, vx2]}, {vx1, vx2}]

Will require an extremely long computational time and will give no output. Which is strange, since with my old code


f = 2/((x1 + Sqrt[3] x2)^2 + (y1 + Sqrt[3] y2)^2)
X = vx1^2*D[D[f, x1], x1] + vx2^2*D[D[f, x2], x2] + 2 vx1*vx2*D[D[f, x1], x2]
Y= vx1*D[f, x1] + vx2*D[f, x2]
g=X+Y^2
H = ImplicitRegion[{3 (-x1^2 - y1^2 + x2^2 + y2^2) +
2 Sqrt[3] (x1*x2 + y1*y2) == 0}, {x1, y1, x2, y2}]

FindMaximum[{g, {x1, y1, x2, y2} ∈ H}, {vx1,vx2,x1, y1, x2, y2}]

I was able to get the answer


{2.39111, {vx1 -> 1.55608, vx2 -> 1.96316, x1 -> 0.810245, y1 -> -0.236216, x2 -> 1.34919, y2 -> -0.463331}}

Is there a better way to define max in such a way that it will be possible to perform operations with it?



Answer



Define your functions as functions:


f[x1_, x2_, y1_, y2_] := 
2/((x1 + Sqrt[3] x2)^2 + (y1 + Sqrt[3] y2)^2)


X[vx1_, vx2_, x1_, x2_, y1_, y2_] :=
vx1^2*D[D[f[x1, x2, y1, y2], x1], x1] +
vx2^2*D[D[f[x1, x2, y1, y2], x2], x2] +
2 vx1*vx2*D[D[f[x1, x2, y1, y2], x1], x2]

Y[vx1_, vx2_, x1_, x2_, y1_, y2_] :=
vx1*D[f[x1, x2, y1, y2], x1] + vx2*D[f[x1, x2, y1, y2], x2]

g[vx1_, vx2_, x1_, x2_, y1_, y2_] :=

X[vx1, vx2, x1, x2, y1, y2] + Y[vx1, vx2, x1, x2, y1, y2]^2

H = ImplicitRegion[{3 (-x1^2 - y1^2 + x2^2 + y2^2) + 2 Sqrt[3] (x1*x2 + y1*y2) == 0}, {x1, y1, x2, y2}]

Define the max as a function:


max[vx1_, vx2_] := 
FindMaximum[{g[vx1, vx2, x1, x2, y1,
y2], {x1, y1, x2, y2} ∈ H}, {x1, y1, x2, y2}]

Then



m = max[1000., 1000.]

enter image description here


(The value of the maximum is a numerical zero; you might want to incorporate Chop in max.) Verify that the solution is in H:


m[[2, All, 2]] ∈ H


True



Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...