我有一个关于约束的问题,这些约束应该从变量列表中动态生成。
假设我有一个包含在变量R
中的表达式,它本身具有不同数量的变量,如x[1]*5+x[3]*x[2]
。如果我事先知道这个数字,我会使用NMaximize[{R, 1 > x[1] > -1 && 1 > x[2] > -1 && 1 > x[3] > -1}, f]
f
是由x
构建的变量f = Array[x,n]
的列表,n
是变量的数量我用。
由于其他人似乎没有类似的问题,我认为这不是通常在mathematica中解决这些问题的方式......但是,如果有办法轻松解决这个问题,我会很高兴听到它(否则我也很高兴听到绕过整个事情的方法)。
提前致谢!
答案 0 :(得分:2)
假设这是你的表达:
In[1]:= r = x[1]*5+x[3]*x[2];
如果你知道它们的基本符号,那么提取变量列表相对容易:
In[5]:= vars = Union@Cases[r,x[_],Infinity]
Out[5]= {x[1],x[2],x[3]}
现在,您可以使用动态生成的约束来调用NMaximize
:
In[7]:= NMaximize[{r,And@@Map[Greater[1,#,-1]&,vars]},vars]
Out[7]= {6.,{x[1]->1.,x[2]->-1.,x[3]->-1.}}
代码And@@Map[Greater[1,#,-1]&,vars]
专门回答您的问题,生成约束。你可以独立执行它来查看它们。