Генерация ограничений из списка переменных для использования в NMaximize - PullRequest
2 голосов
/ 18 сентября 2011

У меня проблема с ограничениями, которые должны генерироваться динамически из списка переменных.

Предположим, у меня есть выражение, которое содержится в переменной 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 ... Однако, если есть способ легко решить эту проблему, я был бы рад услышать о это (иначе я также был бы рад услышать о способе обойти все это).

Заранее спасибо!

1 Ответ

2 голосов
/ 18 сентября 2011

Предположим, это ваше выражение:

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] специально отвечает на ваш вопрос, генерируя ограничения.Вы можете выполнить его отдельно, чтобы увидеть их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...