Question

I aim to calculate and preserve the results from the maximization of a function with two arguments and one exogenous parameter, when the maximum can not be derived (in closed form) by maximize. For instance, let

f[x_,y_,a_]=Max[0,Min[a-y,1-x-y]

be the objective function where a is positive. The maximization shall take place over [0,1]^2, therefore I set

m[a_]=Maximize[{f[x, y, a], 0 <= x <= 1 && 0 <= y <= 1 && 0 <= a}, {x,y}]

Obviously m can be evaluated at any point a and it is therefore possible to plot the maximizing x by employing

Plot[x /. m[a][[2]], {a, 0.01, 1}]

As I need to do several plots and further derivations containing the optimal solutions x and y (which of course are functions of a), i would like to preserve/save the results from the optimization for further use. Is there an elegant way to do this, or do I have to write some kind of loop to extract the values myself?

Était-ce utile?

La solution

Now that I've seen the full text of your comment on my original comment, I suspect that you do understand the differences between Set and SetDelayed well enough. I think what you may be looking for is memoisation, sometimes implemented a bit like this;

f[x_,y_] := f[x,y] = Max[0,Min[a-y,1-x-y]]

When you evaluate, for example f[3,4] for the first time it will evaluate to the entire expression to the right of the :=. The rhs is the assignment f[3,4] = Max[0,Min[a-y,1-x-y]]. Next time you evaluate f[3,4] Mathematica already has a value for it so doesn't need to recompute it, it just recalls it. In this example the stored value would be Max[0,Min[a-4,-6]] of course.

I remain a little uncertain of what you are trying to do so this answer may not be any use to you at all.

Autres conseils

Simple approach

results = Table[{x, y, a} /. m[a][[2]], {a, 0.01, 1, .01}]
ListPlot[{#[[3]], #[[1]]} & /@ results, Joined -> True]

(The Set = is ok here so long as 'a' is not previosly defined )

If you want to utilise Plot[]s automatic evaluation take a look at Reap[]/Sow[]

{p, data} = Reap[Plot[x /. Sow[m[a]][[2]], {a, 0.01, 1}]];
Show[p]

(this takes a few minutes as the function output is a mess..).

hmm try this again: assuming you want x,y,a and the minimum value:

{p, data} = Reap[Plot[x /. Sow[{a, m[a]}][[2, 2]], {a, 0.01, .1}]];
Show[p]
results = {#[[1]], x /. #[[2, 2]], y /. #[[2, 2]], #[[2, 1]]} & /@  data[[1]]

BTW Your function appears to be independent of x over some ranges which is why the plot is a mess..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top