Максимизировать функцию в Mathematica, которая считает элементы - PullRequest
2 голосов
/ 02 февраля 2011

Я уменьшил проблему отладки в 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}}

Итак, в то время как максимальная функция f получается, когда x равен 4 (как подтверждено в первой строке вывода), почему Maximize возвращает x-> 0 (строка вывода 2)?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Причину такого поведения легко найти с помощью 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 голос
/ 09 августа 2011

Попробуйте это:

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

Вывод:

{4, 4}
...