我将Mathematica 8中的调试问题减少到类似于以下代码的内容:
f = Function[x,
list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
Count[list, x]
];
f[4]
Maximize{f[x], x, Integers]
输出:
4
{0, {x->0}}
因此,当x等于4时获得最大o函数f(在第一个输出行中确认),为什么最大化返回x-> 0(输出行2)?
答案 0 :(得分:2)
使用Trace
可以轻松找到此行为的原因。会发生什么情况是您的函数在Maximize中使用仍然符号x
进行评估,并且由于您的列表不包含符号x
,因此结果为零。实际上,您调用了Maximize[0,x,Integers]
,因此得到了结果。您可以做的一件事是通过使用具有限制性模式的模式定义函数来保护函数免受即时评估,例如:
Clear[ff];
ff[x_?IntegerQ] :=
With[{list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5}}, Count[list, x]]
Maximize
似乎无法轻易处理它,但NMaximize
可以:
In[73]:= NMaximize[{ff[x], Element[x, Integers]}, x]
Out[73]= {4., {x -> 4}}
但是,通常情况下,Maximize
家庭功能中的任何一个似乎都不适合这项工作。通过显式计算最大值可能会更好,例如:
In[78]:= list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
Extract[#, Position[#, Max[#], 1, 1] &[#[[All, 2]]]] &[Tally[list]]
Out[79]= {{4, 4}}
HTH
答案 1 :(得分:1)
试试这个:
list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
First@Sort[Tally[list], #1[[2]] > #2[[2]] &]
输出:
{4, 4}