我的目标是计算并保存具有两个自变量和一个外生参数的函数的最大化结果,当最大值不能通过最大化(以封闭形式)导出时。例如,让我们
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的函数)的绘图和进一步的派生,所以我想保存/保存优化的结果以备将来使用。有没有一种很好的方法来做到这一点,或者我必须自己编写某种循环来提取这些值?
发布于 2012-09-25 21:25:24
现在我已经看到了您对我最初的评论的全文,我想您已经足够理解Set和SetDelayed之间的区别了。我认为您可能正在寻找的是memoisation,有时实现的有点像这样;
f[x_,y_] := f[x,y] = Max[0,Min[a-y,1-x-y]]例如,当您第一次计算f[3,4]时,它将计算到:=右侧的整个表达式。rhs是assignment f[3,4] = Max[0,Min[a-y,1-x-y]]。下一次你评估f[3,4]的时候,它已经有了一个值,所以不需要重新计算它,它只需要回忆它。在本例中,存储的值当然是Max[0,Min[a-4,-6]]。
我仍然有点不确定你想要做什么,所以这个答案可能对你没有任何用处。
发布于 2012-09-25 21:26:59
简单方法
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]]顺便说一句,你的函数在某些范围内似乎与x无关,这就是为什么这个图很混乱。
https://stackoverflow.com/questions/12583276
复制相似问题