Функция сворачивания Mathematica - PullRequest
1 голос
/ 19 апреля 2011

Правда ли, что функция Minimize в Mathematica не допускает ограничений, подобных Mod [x, 2] == 0? Я пытаюсь решить головоломку MinuteMath с Mathematica:

Какое наименьшее возможное среднее из четырех различных положительных четных целых чисел?

Мое "решение" выглядит так:

vars = Subscript[x, #] & /@ Range[4];
cond = Apply[And, Mod[#, 2] == 0 & /@ vars] && 
   (0 < Subscript[x, 1]) &&
   Apply[And, Table[Subscript[x, i] < Subscript[x, i + 1], {i, 1, 3}]];
Minimize[{Mean[vars], cond}, vars, Integers] 

но Minimize возвращает без оценки. Дополнительный вопрос: Могу ли я использовать EvenQ для определения ограничений? Проблема в том, что EvenQ[x] возвращает False для неопределенных выражений x.

Ответы [ 2 ]

5 голосов
/ 19 апреля 2011

Очевидно, что для этого не требуется Mathematica, но, в ответ на ваш вопрос, кажется, что Minimize не нравится моды. Вы можете встроить его в форум, например, так:

Minimize[{(2 x1 + 2 x2 + 2 x3 + 2 x4)/4,
  0 < x1 < x2 < x3 < x4}, {x1, x2, x3, x4}, Integers]
4 голосов
/ 19 апреля 2011

Ясно излишнее решение этой проблемы, но полезно показать некоторые хитрости.

Обратите внимание, что:

 Exists[x, Element[x, Integers] && n x == y]

может использоваться как альтернатива

  Mod[y,n] == 0

Итак:

Minimize[{(x1 + x2 + x3 + x4)/4, 0 < x1 < x2 < x3 < x4 && 
   Exists[x, Element[x, Integers] && 2 x == x1] &&
   Exists[x, Element[x, Integers] && 2 x == x2] &&
   Exists[x, Element[x, Integers] && 2 x == x3] &&
   Exists[x, Element[x, Integers] && 2 x == x4]
  },
 {x1, x2, x3, x4}, Integers]  

-> {5, {x1 -> 2, x2 -> 4, x3 -> 6, x4 -> 8}}  

Или, может быть, более элегантно:

s = Array[x, 4];  
Minimize[{  
  Total@s,  
  Less @@ ({0} \[Union] s) &&  
   And @@ (Exists[y, Element[y, Integers] && 2 y == #] & /@ s)},
s, Integers]

--> {20, {x[1] -> 2, x[2] -> 4, x[3] -> 6, x[4] -> 8}}
...