2011-09-18 45 views
2

我有一個應該從變量列表中動態生成的約束問題。從NMaximize中使用的變量列表生成約束條件

假設我有一個表達式,它包含在變量R中,變量本身具有不同數量的變量,如x[1]*5+x[3]*x[2]。如果我知道前面的數字,我只需要使用NMaximize[{R, 1 > x[1] > -1 && 1 > x[2] > -1 && 1 > x[3] > -1}, f],其中f是由f = Array[x,n],n構成的變量x的列表,其爲我使用的變量的數量。

由於其他人似乎沒有類似的問題,我認爲這不是在數學中通常解決這些問題的方式...但是,如果有辦法容易地解決這個問題,我會很高興聽到關於它(否則我也會很高興聽到有關繞過整個事物的方法)。

在此先感謝!

+0

Re:''''''''''''''''我認爲這不是數學中通常解決這些問題的方法。不,這是非常標準的,你是在好路徑 –

+0

響應和事先評論是針對目標。我只是補充一點,你也可以使用弱不平等,例如LessEqual,因爲無論如何,嚴格的不平等會被弱對手所取代。 –

回答

2

想這是你的表達:

In[1]:= r = x[1]*5+x[3]*x[2]; 

這是比較容易,如果你知道他們的基本符號提取的變量列表:

In[5]:= vars = [email protected][r,x[_],Infinity] 
Out[5]= {x[1],x[2],x[3]} 

現在,您可以撥打NMaximize動態生成的限制:

In[7]:= NMaximize[{r,[email protected]@Map[Greater[1,#,-1]&,vars]},vars] 
Out[7]= {6.,{x[1]->1.,x[2]->-1.,x[3]->-1.}} 

該代碼[email protected]@Map[Greater[1,#,-1]&,vars]專門回答你的問題,產生約束。您可以單獨執行以查看它們。