Wolfram mathematica 最大化Mathematica中计算元素的函数

Wolfram mathematica 最大化Mathematica中计算元素的函数,wolfram-mathematica,mathematical-optimization,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}} {4, 4} 因此,虽然当x等于4时获得最大o函数f(如第一个输出行中所确认的),为什么最大化返回x->0(输出行2)?使用跟踪可以很容易地找到这种行为的原因。

我将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}}
{4, 4}

因此,虽然当x等于4时获得最大o函数f(如第一个输出行中所确认的),为什么最大化返回x->0(输出行2)?

使用
跟踪可以很容易地找到这种行为的原因。发生的情况是,函数在Maximize中使用符号
x
,并且由于列表中不包含符号
x
,因此结果为零。实际上,您可以调用
最大化[0,x,整数]
,从而得到结果。您可以做的一件事是通过使用带有限制模式的模式定义函数来保护函数不被立即计算,例如:

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}}
但是,一般来说,
最大化
家族功能中的任何一个似乎都不太适合这项工作。通过显式计算最大值可能会更好,例如:

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

试试这个:

list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
First@Sort[Tally[list], #1[[2]] > #2[[2]] &]
输出:

4
{0, {x->0}}
{4, 4}

Commonest[列表]将获得重复次数最多的元素too@belisarius谢谢提醒。这是我脑海中的某个地方,但显然太远了:)此外,OP也对频率感兴趣,而
common
似乎只提供了一个元素本身。我认为这个例子处于数学和编程之间的边缘,所以你可以用两种方法来做。但您的特定示例显然更多地是在编程方面,因此在这种特定情况下,列表操作和计数似乎比
Maximize
之类的函数更合适。进行计数的看似过于复杂的方法只是提取代码相关部分的人工制品,没有反映职能的总体目标。真正的目标是对进行蒙特卡罗模拟的函数使用最小化,该函数返回一个值,该值是请求的发生概率与模拟中获得的数量之间的差值。我仍在尝试根据这里提供的答案修改原始代码。@Leonid{[2,1]],Count[[1]],{[2,1]]}&@{[3],Commonest[#]&@list