在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
答案 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}]
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
给出
编辑:要删除重复项,请将函数{x -> #[[1]], y -> #[[2]]} &
更改为
{x -> Union@#[[1]], y -> Union@#[[2]]} &