我的目标是通过最大化来计算和保存具有两个参数和一个外生参数的函数最大化的结果,而不能导出(以封闭形式)最大值。例如,让
f[x_,y_,a_]=Max[0,Min[a-y,1-x-y]
是a
为正的客观函数。最大化应在[0,1]^2
之上进行,因此我设置
m[a_]=Maximize[{f[x, y, a], 0 <= x <= 1 && 0 <= y <= 1 && 0 <= a}, {x,y}]
显然m
可以在任何时候a
进行评估,因此可以通过使用
x
Plot[x /. m[a][[2]], {a, 0.01, 1}]
由于我需要做几个包含最佳解x
和y
(当然是a
的函数)的图和其他推导,我想保留/保存优化的结果可供进一步使用。有没有一种优雅的方法来做到这一点,或者我是否必须编写某种循环来自己提取值?
答案 0 :(得分:0)
既然我已经看到了您对原始评论的评论全文,我怀疑您确实理解Set
和SetDelayed
之间的差异。我认为你可能正在寻找的是记忆,有时实现有点像这样;
f[x_,y_] := f[x,y] = Max[0,Min[a-y,1-x-y]]
首次评估{例如f[3,4]
时,它将评估:=
右侧的整个表达式。 rhs是赋值f[3,4] = Max[0,Min[a-y,1-x-y]]
。下次评估f[3,4]
Mathematica已经有了它的值,所以不需要重新计算它,它只是回忆它。在这个例子中,存储的值当然是Max[0,Min[a-4,-6]]
。
我仍然不确定你想要做什么,所以这个答案对你来说可能没用。
答案 1 :(得分:0)
简单方法
results = Table[{x, y, a} /. m[a][[2]], {a, 0.01, 1, .01}]
ListPlot[{#[[3]], #[[1]]} & /@ results, Joined -> True]
(只要'a'没有预先定义,Set =就可以了)
如果你想利用Plot []的自动评估看一下Reap [] / Sow []
{p, data} = Reap[Plot[x /. Sow[m[a]][[2]], {a, 0.01, 1}]];
Show[p]
(这需要几分钟,因为函数输出很乱......)。
嗯再试一次:假设你想要x,y,a和最小值:
{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你的功能似乎在某些范围内与x无关,这就是情节混乱的原因。