List 在Mathematica中如何将所有解合并到一个列表中?

List 在Mathematica中如何将所有解合并到一个列表中?,list,wolfram-mathematica,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} 有没有简单的方法可以重新

使用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
另一个问题,如何使用解决方案中的值

    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

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

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

In[3]:= sol = Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers]
Out[3]= {{x -> 1, y -> 1}, {x -> 1, y -> 2}}
现在取symbol
x
,并根据被视为规则列表的
sol
列出所有替换的
x

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]

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

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
给予

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

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

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

vars = {x, y};

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

Thread[ vars -> Union /@ (vars /. sols) ]

关于第二个问题,请参见

最方便的是:

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}]

有一个新的唯一的网站,你可能会感兴趣。
gg[2] /@ {1, 2, 3}
{1/2 (-1 + I Sqrt[3]), -1, 1/2 (-3 + Sqrt[5])}