2011-02-02 3 views
2

я уменьшил проблемы отладки в системе Mathematica 8-то похожее на следующий код:функция Maximize в Mathematica, которая подсчитывает элементы

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}} 

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

ответ

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}} 

НТН

+1

В наиболее общем [список] вы получите самый повторный элемент –

+0

@belisarius Спасибо за напоминание. Это было где-то на заднем плане, но, по-видимому, слишком далеко :) Кроме того, OP тоже интересовался частотой, в то время как «Commonest», кажется, только предоставляет элемент сам –

+0

Я думаю, что этот пример находится на границе между математикой и программирование, поэтому вы можете сделать это в обоих направлениях. Но ваш конкретный пример явно больше на стороне программирования, поэтому манипуляции и подсчет списков кажутся более подходящими, чем функции, такие как 'Максимизация', в данном конкретном случае. –

1

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

list = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5}; 
[email protected][Tally[list], #1[[2]] > #2[[2]] &] 

Выход:

{4, 4}