Wolfram mathematica 如何在Mathematica中保存最大化的结果?

Wolfram mathematica 如何在Mathematica中保存最大化的结果?,wolfram-mathematica,maximize,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}] 由于我需要绘制多个图并进一步推导最优解

我的目的是计算并保持当最大值不能由最大值导出(以闭合形式)时,具有两个参数和一个外生参数的函数最大化的结果。例如,让

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

由于我需要绘制多个图并进一步推导最优解
x
y
(当然是
a
的函数),因此我希望保留/保存优化结果以供进一步使用。有没有一种优雅的方法可以做到这一点,或者我必须自己编写某种循环来提取值?

既然我已经看到了你对我原始评论的评论全文,我想你已经足够理解
Set
SetDelayed
之间的区别了。我想你可能在寻找的是回忆录,有时实现有点像这样

f[x_,y_] := f[x,y] = Max[0,Min[a-y,1-x-y]]
例如,当您第一次计算时,它将计算到
:=
右侧的整个表达式。rhs是赋值
f[3,4]=Max[0,Min[a-y,1-x-y]]
。下次你计算f[3,4]
Mathematica已经有了一个值,所以不需要重新计算,它只是调用它。在本例中,存储值当然是
Max[0,Min[a-4,-6]]

我仍然有点不确定你想做什么,所以这个答案可能对你没有任何用处。

简单方法

results = Table[{x, y, a} /. m[a][[2]], {a, 0.01, 1, .01}]
ListPlot[{#[[3]], #[[1]]} & /@ results, Joined -> True]
(只要未预先定义“a”,此处设置=正常)

如果要使用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无关,这就是为什么绘图混乱的原因。

你在函数定义中使用
=
是故意的吗?或者你在匆忙发帖时是否写错了
:=
?或者,也许你是Mathematica的新用户,你还没有理解
=
:=
之间的区别。如果是这种情况,请赶快看文档。@高性能标记如果我没有弄错,使用
:=
而不是
=
将延迟计算,因为(从文档中)lhs:=rhs将rhs指定为lhs的延迟值。rhs以未评估的形式维护。当lhs出现时,它将被rhs替换,每次重新评估。我的目标正好相反,也就是说,我希望最大化执行一次,并将其结果存储为参数a的函数。由于我是Mathematica的新用户,如果我误解了你的评论,请纠正我。你对我评论的评论并不意味着你已经正确理解了
Set
(通常写
=
)和
SetDelayed
(通常写
:=
)之间的语义差异。但这可能只是我的误解。好吧,我会再次阅读文档,并(只是为了确保)尝试不同的可能性。谢谢谢谢你,高性能马克这正是我要找的东西!我想补充另一个问题(如果我更愿意将此作为一个新问题提交,请让我知道):由于对上述函数的评估需要一些时间,因此从中获取情节需要(在我的具体情况下)几个小时。是否有一种方法可以保存/导出通过打印函数完成的结果,以便在重新打开文档时不必再次运行函数的计算?
{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]]