Оптимизация с Mathematica: используйте BinCounts в целевой функции - PullRequest
5 голосов
/ 06 октября 2009

Используя Mathematica, мне нужно оптимизировать функцию, которая определяется в терминах BinCounts; аргументы, которые я хочу максимизировать, определяют точки среза бина.

Я думаю, что проблема в том, что Mathematica расширяет целевую функцию с точки зрения аргументов, прежде чем они были даны числовые значения, поэтому BinCounts жалуется, что спецификация корзины не является список, содержащий реальные значения, Infinity и -Infinity ".

Я думаю, что следующее - минимальный пример того, что я пытаюсь сделать и что происходит. Буду очень признателен за советы по как решить эту проблему.

In[1]:= data = RandomReal[1, 30]; (* Make some test data. *)

In[2]:= f[a_, b_, c_] := BinCounts[data, {{0, a, b, c, 1}}] (* Shorthand to use below… *)

In[12]:= g[a_, b_, c_] := Max[f[a, b, c]] - Min[f[a, b, c]] (* Objective function. *)

In[13]:= NMaximize[{g[a, b, c], 0 < a < b < c < 1}, {a, b, c}] (* Try to oprimize. *)

During evaluation of In[13]:= BinCounts::cvals: The bin specification {{0,a,b,c,1}} is not a list containing real values, Infinity, and -Infinity. >>

During evaluation of In[13]:= BinCounts::cvals: The bin specification {{0,a,b,c,1}} is not a list containing real values, Infinity, and -Infinity. >>

During evaluation of In[13]:= BinCounts::cvals: The bin specification {{0,a,b,c,1}} is not a list containing real values, Infinity, and -Infinity. >>

During evaluation of In[13]:= General::stop: Further output of BinCounts::cvals will be suppressed during this calculation. >>

Out[13]= {0., {a -> 0., b -> 0., c -> 1.}}

1 Ответ

3 голосов
/ 06 октября 2009

Решение состоит в том, чтобы просто указать, что целевая функция определяется только в терминах числовых аргументов, например:

g[a_?NumericQ, b_?NumericQ, c_?NumericQ] := Max[f[a, b, c]] - Min[f[a, b, c]]
...