Причины этого можно легко найти, используя 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}}
НТН
В наиболее общем [список] вы получите самый повторный элемент –
@belisarius Спасибо за напоминание. Это было где-то на заднем плане, но, по-видимому, слишком далеко :) Кроме того, OP тоже интересовался частотой, в то время как «Commonest», кажется, только предоставляет элемент сам –
Я думаю, что этот пример находится на границе между математикой и программирование, поэтому вы можете сделать это в обоих направлениях. Но ваш конкретный пример явно больше на стороне программирования, поэтому манипуляции и подсчет списков кажутся более подходящими, чем функции, такие как 'Максимизация', в данном конкретном случае. –