在Mathematica中使用Solve

时间:2011-04-06 11:42:03

标签: wolfram-mathematica puzzle

为了熟悉Mathematica的求解功能,我尝试找出MinuteMath problem的解决方案:

  

有七个数字列表。前四个数字的平均值是5,而且   最后四个数字的平均值是8.如果所有七个数字的平均值是46/7,那么   两组四个数字共有的数字是多少?

当然,这是一个可以在没有计算机的情况下解决的练习,但我如何使用Mathematica解决这个问题?我的第一个方法

X = Table[Subscript[x, i], {i, 1, 7}];
cond = {
  Mean[Part[X, 1 ;; 4]] == 5,  
  Mean[Part[X, 4 ;; 7]] == 8, 
  Mean[X] == 46/7
};
Solve[cond, Subscript[x, 4]]

没有解决方案。我的第二种方法

X = Table[Subscript[x, i], {i, 1, 7}];
rules = {Mean[Part[X, 1 ;; 4]] -> 5,  
   Mean[Part[X, 4 ;; 7]] -> 8, 
   Mean[X] -> 46/7
};
Solve[
  Mean[X] == Mean[Part[X, 1 ;; 4]] 
    + Mean[Part[X, 4 ;; 7]] 
    - Subscript[x, 4] /. rules, 
  Subscript[x, 4]
]

给出了错误的解决方案(45/7而不是6)。我错了什么?

2 个答案:

答案 0 :(得分:6)

你提供的第一段代码很好。唯一的问题是没有单独的x_4解决方案。如果用Solve[cond]替换最后一行,那么Mathmatica会自动选择自由变量,你就会得到解决方案。


我认为一个简单/简单的例子可以解决这个类型问题:

In[1]:= Solve[x==1&&y==2,x]
        Solve[x==1&&y==2,{x,y}]
Out[1]= {}
Out[2]= {{x->1,y->2}}

也可以使用Solve[x==1&&y==2]获得最终输出,其中Mma猜测自由变量。 此行为与Mathematica 7的行为不同。在Mathematica 8中,引入了Solve(和相关函数)MaxExtraCondtions的新选项。这允许Solve提供使用新ConditionalExpression的解决方案,旨在使解决行为更加一致和可预测。 以下是它在这个简单示例中的工作原理:

In[3]:= Solve[x==1&&y==2, x, MaxExtraConditions->1]
Out[3]= {{x -> ConditionalExpression[1, y==2]}}

请参阅上面链接到文档的更多示例,以说明此Option有用的原因。 (虽然可能默认为Automatic而不是0,但对于新选项来说,这将是一个更实用的设计选择......)


最后,这是你的第一个解决方案重写了一点:

In[1]:= X=Array[Symbol["x"<>ToString[#]]&,{7}]
Out[1]= {x1,x2,x3,x4,x5,x6,x7}

In[2]:= cond=Mean[X[[1;;4]]]==5&&Mean[X[[4;;7]]]==8&&Mean[X]==46/7;

In[3]:= Solve[cond]
         x4/.%
Out[3]= {{x1->14-x2-x3,x4->6,x5->26-x6-x7}}
Out[4]= {6}

答案 1 :(得分:4)

也许更紧凑:

Reduce[Mean@Array[f, 4] == 5 && 
       Mean@Array[f, 4, 4] == 8 && 
       Mean@Array[f, 7] == 46/7]
(*
-> f[5] == 26 - f[6] - f[7] && 
   f[4] == 6 && 
   f[1] == 14 - f[2] - f[3]
*)  

虽然为了清楚起见,我可能更喜欢:

Reduce[Sum[f@i, {i, 4}] == 20 && 
       Sum[f@i, {i, 4, 7}] == 32 && 
       Sum[f@i, {i, 7}] == 46]

修改

请注意,我使用函数upvalues作为vars而不是list元素。我更喜欢这种方式,因为:

  • 您无需初始化列表 (Table[Subscript ...在你的 example`)
  • 结果表达式通常是 不那么混乱(没有Part[ ;; ]等)