最大化Mathematica中用于计算元素的功能

时间:2011-02-02 17:16:26

标签: wolfram-mathematica mathematical-optimization

我将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)?

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}