2009-10-05 6 views
5

En utilisant Mathematica, j'ai besoin d'optimiser une fonction définie en termes de BinCounts; les arguments que je veux maximiser sur définir les points de coupe bin.Optimisation avec Mathematica: utilisation de BinCounts dans la fonction objectif

Je pense que le problème est que Mathematica étend la fonction objectif en fonction des arguments avant qu'ils ont été donnés des valeurs numérique, donc BinCounts se plaint que la spécification bin n'est pas « une liste contenant des valeurs réelles, Infinity et -Infini".

Je pense que ce qui suit est un exemple minimal du genre de chose que je suis en train de faire et de ce qui se passe: . Je serais très reconnaissant pour des conseils sur comment résoudre ce problème.

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

Répondre

3

La solution est tout simplement de préciser que la fonction objective est définie seulement en termes d'arguments numériques, comme ceci:

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