为了熟悉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)。我错了什么?
答案 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[ ;; ]
等)