2011-02-14 50 views
2

我获得的folloiwng方程欠定(作为一个例子):降低方程系统,其在数学

{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前面的这些系数分组成一个矩阵(列表清单),然后从那里开始。但我不确定如何轻松操纵这些方程来生成这样的矩阵。请帮忙,或者如果你有更好的想法,请分享。

非常感谢。

+0

列昂尼德·希夫林的反应看起来是正确的估计的正好。但我有一个先前的问题。关于Solve的结果,你不喜欢什么? (也就是说,你为什么需要去解决这个问题?) – 2011-02-14 23:17:47

+0

@丹尼尔,我得到一个错误,说'解决:: svars:方程式可能不会给所有解决方案“解决”变量。“因为这是下确定的。 – 2011-02-14 23:39:50

+0

是的,那恰恰是因为它是欠定的。然后显示的解决方案有一些有效的变量作为参数,其他的解决方案就是这些变量。但是由于输入是不确定的,我没有看到你可能想要表达解决方案集。 – 2011-02-14 23:45:03

回答

5

这是你的方程式和变量:

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]:=方程/。等于:>减去

输出[70] = { - 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}} 

在检查规则如何工作时,很容易看到我们需要d将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

8

有用于将线性(或多项式)方程组的成矩阵形式的内置函数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}}}