如何在Mathematica中保留Maximize的结果?

时间:2012-09-25 12:47:35

标签: wolfram-mathematica maximize

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

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的函数)的图和其他推导,我想保留/保存优化的结果可供进一步使用。有没有一种优雅的方法来做到这一点,或者我是否必须编写某种循环来自己提取值?

2 个答案:

答案 0 :(得分: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]]

我仍然不确定你想要做什么,所以这个答案对你来说可能没用。

答案 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无关,这就是情节混乱的原因。