【问题标题】:reduce system of equations which is under-determined in mathematica减少数学中未确定的方程组
【发布时间】:2011-02-14 22:41:43
【问题描述】:

我得到了以下方程(作为例子):

{2 w11 + 3 w21 == 2 w12, w11 == 4 w12 + 3 w22, w11 + 2 w21 + w22 == 0,
  2 w12 + w21 + 2 w22 == 0}

我想确定 w11、w12、w21、w22。但是,只需执行以下操作:

Solve[{3 w11 + 2 w21 == 5 w11 + 3 w12, w11 + w21 == 5 w21 + 3 w22, 
  3 w12 + 2 w22 == -2 w11 - w12, w12 + w22 == -2 w21 - w22}, {w11, 
  w12, w21, w22}]

因为方程组是欠定的。我有一个想法,即使用矩阵代数。但我需要自动将 w11、w12、w21、w22 前面的这些系数分组到一个矩阵(列表列表)中,然后从那里开始。但我不确定如何轻松地操纵这些方程来生成这样的矩阵。请帮忙,或者如果您有更好的想法,也请分享。

非常感谢。

【问题讨论】:

  • Leonid Shifrin 的回答看起来是正确的。但我有一个先前的问题。你不喜欢 Solve 的结果是什么? (也就是说,为什么你需要对问题提出不同的表述?)
  • @Daniel,我收到了一条错误消息,提示为 Solve::svars: Equations may not give solutions for all "solve" variables.,因为这尚未确定。
  • 是的,这正是因为它没有被确定。然后显示的解决方案实际上将一些变量转换为参数,而其他变量则根据这些变量进行求解。但由于输入未确定,我看不出您还有什么想法来表示解决方案集。

标签: wolfram-mathematica


【解决方案1】:

有一个内置函数CoefficientArrays 用于将线性(或多项式)方程组转换为矩阵形式。

你想要的矩阵是结果的第二部分:

In[7]:= vars = {w11, w12, w21, w22};

In[8]:= CoefficientArrays[{2 w11 + 3 w21 == 2 w12, 
   w11 == 4 w12 + 3 w22, w11 + 2 w21 + w22 == 0, 
   2 w12 + w21 + 2 w22 == 0}, vars] // Normal

Out[8]= {{0, 0, 0, 
  0}, {{2, -2, 3, 0}, {1, -4, 0, -3}, {1, 0, 2, 1}, {0, 2, 1, 2}}}

不均匀部分是结果的第一部分,一个向量:

In[9]:= CoefficientArrays[{3 w11 + 2 w12 == 5 w11 + 3 w21 + a, 
   w11 + w12 == 5 w12 + 3 w22 - c, 
   3 w21 + 2 w22 + b == a - 2 w11 - w21, 
   w21 + w22 == f - 2 w12 - w22}, vars] // Normal

Out[9]= {{-a, 
  c, -a + b, -f}, {{-2, 2, -3, 0}, {1, -4, 0, -3}, {2, 0, 4, 2}, {0, 
   2, 1, 2}}}

【讨论】:

  • +1,这是最好的解决方案。顺便说一句,您不需要变量列表,CoefficientArrays 可以自己确定它们。
  • 太棒了!我只是好奇如何快速找到这些内置函数(也根据我之前的问题)。 :) 就连 Mma 研发的 Daniel Lichtblau 也建议采用 Leonid 的方法。
  • @Qiang Li,找出内置函数的唯一尝试和真正的方法是阅读文档,尤其是教程。此外,请点击帮助文件底部的其他功能链接,通过这些方法,您应该可以找到大约 50-75% 的功能。你会错过一些好东西,但你会得到大部分即时有用的东西。
【解决方案2】:

这是你的方程式和变量:

vars = {w11, w12, w21, w22};
eqs = {2 w11 + 3 w21 == 2 w12, w11 == 4 w12 + 3 w22, 
   w11 + 2 w21 + w22 == 0, 2 w12 + w21 + 2 w22 == 0};

这是矩阵:

In[48]:= matrix =  Transpose[ eqs /. Equal :> Subtract /. 
    Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]]

Out[48]= {{2, -2, 3, 0}, {1, -4, 0, -3}, {1, 0, 2, 1}, {0, 2, 1, 2}}

编辑:

第二组方程也是如此:

In[49]:= eqs = {3 w11 + 2 w21 == 5 w11 + 3 w12,  w11 + w21 == 5 w21 + 3 w22, 
  3 w12 + 2 w22 == -2 w11 - w12,  w12 + w22 == -2 w21 - w22};   

In[50]:= matrix = Transpose[ eqs /. Equal :> Subtract /. 
    Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]]

Out[50]= {{-2, -3, 2, 0}, {1, 0, -4, -3}, {2, 4, 0, 2}, {0, 1, 2, 2}}

编辑:

根据要求扩展解决方案。首先,它是如何工作的:想法是首先将所有变量带到左边,这是通过将等于运算符替换为减法来实现的:

In[69]:= eqs = {3 w11 + 2 w21 == 5 w11 + 3 w12,  w11 + w21 == 5 w21 + 3 w22, 
     3 w12 + 2 w22 == -2 w11 - w12,  w12 + w22 == -2 w21 - w22};

在[70]:= eqs /。等于 :> 减

输出[70]= {-2 w11 - 3 w12 + 2 w21, w11 - 4 w21 - 3 w22, 2 w11 + 4 w12 + 2 w22, w12 + 2 w21 + 2 w22}

规则的构造使得对于任何一组规则,只有一个变量设置为 1,其余设置为 0:

 In[71]:= Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]

 Out[71]= {{w11 -> 1, w12 -> 0, w21 -> 0, w22 -> 0}, {w11 -> 0, w12 -> 1, w21 -> 0, w22 -> 0}, 
        {w11 -> 0, w12 -> 0, w21 -> 1, w22 -> 0}, {w11 -> 0, w12 -> 0, w21 -> 0, w22 -> 1}}

这允许计算系数:

In[72]:= eqs /. Equal :> Subtract /. Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]

Out[72]= {{-2, 1, 2, 0}, {-3, 0, 4, 1}, {2, -4, 0, 2}, {0, -3, 2, 2}}

在检查规则如何工作时,很容易看出我们需要将Transpose 应用于结果。

现在,您的第二个请求需要更多工作:

In[53]:= eqs = {3 w11 + 2 w12 == 5 w11 + 3 w21 + a, w11 + w12 == 5 w12 + 3 w22 - c, 
   3 w21 + 2 w22 + b == a - 2 w11 - w21, w21 + w22 == f - 2 w12 - w22};

In[55]:= modifiedEqs = With[{alts = Alternatives @@ vars},
   eqs //. {lhs_ == HoldPattern[Plus[left___, x_, right___]] /; !FreeQ[x, alts] :> 
                    lhs - x == left + right,
            HoldPattern[Plus[left___, x_, right___] == rhs_] /; FreeQ[x, alts] :> 
           (left + right == rhs - x)}]

Out[55]= {-2 w11 + 2 w12 - 3 w21 == a, w11 - 4 w12 - 3 w22 == -c,  
     2 w11 + 4 w21 + 2 w22 == a - b,   2 w12 + w21 + 2 w22 == f}

In[68]:= matrix = {Transpose[# /. (lhs_ == rhs_) :> lhs /. 
    Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]], #[[All,2]]} &[modifiedEqs]

Out[68]= {{{-2, 2, -3, 0}, {1, -4, 0, -3}, {2, 0, 4, 2}, {0, 2, 1,  2}}, {a, -c, a - b, f}}

主要区别在于我们需要一个额外的步骤来分离常量并将它们带到r.h.s。您可能会发现自己弄清楚它是如何工作的细节会更有用。

编辑:

是的,我忘了提及:要了解解决方案,您应该知道在嵌套列表中应用规则时会发生什么 - 在这种情况下,较大列表中的每个规则列表都会生成表达式的转换副本,例如示例:

In[73]:= {a, b, c} /. {{a -> 1}, {b -> 1}, {c -> 1}}

Out[73]= {{1, b, c}, {a, 1, c}, {a, b, 1}}

HTH

【讨论】:

  • 这假设方程是齐次的,在 r.h.s. 上没有任何常数
  • 如果我想为像{3 w11 + 2 w12 == 5 w11 + 3 w21 + a, w11 + w12 == 5 w12 + 3 w22 - c, 3 w21 + 2 w22 + b == a - 2 w11 - w21, w21 + w22 == f - 2 w12 - w22} 这样的方程形成系数矩阵和非齐次向量怎么办?能否请您解释一下Transpose[ eqs /. Equal :> Subtract /. Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]] 命令的作用。非常感谢。
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2021-07-30
  • 2022-09-23
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多