2009-10-05 16 views
5

Utilizzando Mathematica, è necessario ottimizzare una funzione definita in termini di BinCounts; gli argomenti che voglio massimizzare sopra definiscono i punti di divisione del bin.Ottimizzazione con Mathematica: utilizzare BinCounts nella funzione obiettivo

Credo che il problema è che Mathematica espande la funzione obiettivo in termini di argomenti prima che essi sono stati dati numerici valori, in modo BinCounts lamenta che la specifica bin non è "una lista contenente i valori reali, Infinity, e -Infinito".

Penso che quanto segue sia un esempio minimale del tipo di cosa sono che prova a fare e cosa sta succedendo. Sarei molto grato per un consiglio su su come risolvere questo problema.

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

risposta

3

La soluzione è semplicemente specificare che la funzione obiettivo è definita solo in termini di argomenti numerici, in questo modo:

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