2011-04-19 169 views
1

Mathematica的Minimize函數不允許像Mod [x,2] == 0那樣的約束是真的嗎?我正在嘗試用Mathematica解決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

+0

難題不大,是嗎? – 2011-04-19 22:16:54

+0

是的,它非常簡單..但Mathematica扼流圈就可以了。 – 2011-04-20 17:35:10

回答

4

此問題的一個明確的矯枉過正,但有用的表現出一定的技巧。

需要注意的是:

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[{ 
    [email protected], 
    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}} 
+0

這真的很有幫助,因爲我學習了一些關於Mathematica的知識。這就是爲什麼我重新分配接受的答案。 – 2011-04-19 20:53:04

+0

@Karsten好的。投票了馬克的回報報復:) – 2011-04-19 20:57:01

+0

不適用於Mathematica 7,但... – 2011-04-20 17:30:55

5

很明顯,這不需要Mathematica,但在回答你的問題時,似乎Minimize不喜歡mods。你可以建立入forumula,不過,像這樣:

Minimize[{(2 x1 + 2 x2 + 2 x3 + 2 x4)/4, 
    0 < x1 < x2 < x3 < x4}, {x1, x2, x3, x4}, Integers] 
+2

謝謝!解決MinuteMath問題不需要Mathematica,但學習Mathematica需要簡單的可驗證問題,恕我直言... – 2011-04-19 14:50:08

+4

@Karsten你見過[Project Euler](http://projecteuler.net/)嗎? – 2011-04-19 15:45:19