【问题标题】:How to combine all solutions within one list in Mathematica?如何在 Mathematica 的一个列表中组合所有解决方案?
【发布时间】:2012-01-26 07:10:30
【问题描述】:

使用 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

【问题讨论】:

    标签: list wolfram-mathematica


    【解决方案1】:

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

    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】:

      列表遵循 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,并根据solx的所有替换列表视为规则列表:

      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]
      

      【讨论】:

      • 有一个新的Mathematica 专用站点,您可能会感兴趣。
      【解决方案3】:

      您可以使用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]]} &
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多