如何在Mathematica的一个列表中组合所有解决方案?

时间:2012-01-26 07:10:31

标签: list wolfram-mathematica

在Mathematica中使用Solve函数,我们可能会得到几个解决方案,例如

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

如果有几十个解决方案,上面的列表将会很混乱。 现在我想列出x和y的所有可能值以及像这样的列表

    {x->1, y->1,2}

有没有简单的方法来重新格式化解决方案的输出?

另一个问题,如何使用解决方案中的值?

    In[1]:= Solve[x == 1,{x}]
    Out[1]= {x -> 1}
    In[2]:= x
    Out[2]= x
    In[3]:= Definition[x]
    Out[3]= Null
    In[4]:= ?x
            Global`x

3 个答案:

答案 0 :(得分:4)

列表遵循Mathematica规则的模式,因此列表替换是从这些列表中获取值的最简单方法。

让我们调用解决方案列表sol

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

现在使用符号x,并根据作为规则列表的x列出所有sol替换的列表:

In[4]:= x /. sol
Out[4]= {1, 1}

这会立即让您了解如何从所有解决方案中获取x的所有不同值:

In[5]:= Union[x /. sol]
Out[5]= {1}

y同上,尽管所有解决方案都已有所不同:

In[6]:= Union[y /. sol]
Out[6]= {1, 2}

以上是上述复制和粘贴步骤的完整代码:

sol = Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers]
x /. sol
Union[x /. sol]
Union[y /. sol]
Clear[sol]

答案 1 :(得分:4)

对于您的第一个问题,您可以使用:

vars = {x, y};

sols = Solve[x == 1 && 2 >= y >= 1, vars, Integers];

Thread[ vars -> Union /@ (vars /. sols) ]
{x -> {1}, y -> {1, 2}}

关于第二个问题,请参阅this answer

最轻松:

sols = Solve[x^2 + a x + 1 == 0, x]

MapIndexed[(gg[#2[[1]]][a_] := #) &, x /. sols];

这会对符号gg进行分配 然后,该函数与语法gg[1][17]一起使用,表示第一个解决方案,a == 17

Plot[gg[1][a], {a, 1, 4}]

Mathematica graphics

gg[2] /@ {1, 2, 3}
{1/2 (-1 + I Sqrt[3]), -1, 1/2 (-3 + Sqrt[5])}

答案 2 :(得分:2)

您可以使用Solve或其缩写ReplaceAll/.返回的规则转换为列表,如下所示

Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers] /.  Rule[a_, b_] -> b  

这会生成一个列表列表:{{1, 1}, {1, 2}}。要以您希望的格式获得结果,您可以通过一对{a,b}并返回{x->a,y->b}的函数传递此列表。像

这样的函数
  {x -> #[[1]], y -> #[[2]]} &

确实完成了这种转变。结合这两个步骤

 solutionlist = (Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers] /. 
       Rule[a_, b_] -> b ) // {x -> #[[1]], y -> #[[2]]} &

产生

 {x -> {1, 1}, y -> {1, 2}}

为您的示例案例。

要使用解决方案中的值,您可以使用

{xlist, ylist} = {x, y} /. solutionlist

检查

 ?xlist

给出

output for ?xlist

编辑:要删除重复项,请将函数{x -> #[[1]], y -> #[[2]]} &更改为

 {x -> Union@#[[1]], y -> Union@#[[2]]} &