0

我的目标是计算和保存具有两个参数和一个外生参数的函数的最大化结果,当最大值不能通过最大化(以封闭形式)得出时。例如,让

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}]

由于我需要做几个包含最佳解决方案xy(当然是 的函数a)的绘图和进一步推导,我想保留/保存优化的结果以供进一步使用。有没有一种优雅的方法可以做到这一点,还是我必须编写某种循环来自己提取值?

4

2 回答 2

0

既然我已经看到了您对我的原始评论的评论全文,我怀疑您确实理解SetSetDelayed足够好之间的区别。我认为您可能正在寻找的是记忆,有时会像这样实现;

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]]当然是。

我仍然不确定您要做什么,所以这个答案可能对您根本没有任何用处。

于 2012-09-25T13:25:23.593 回答
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]]

顺便说一句,您的函数似乎在某些范围内与 x 无关,这就是为什么情节一团糟的原因。

于 2012-09-25T13:26:59.137 回答