2011-02-14 49 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}}}