2012-09-29 384 views

回答

6

如果一個獨特的解決方案存在,那麼一個可能最好使用PINV找到它。使用施瓦茨構成的例子...

A = [2 3 4]; 
B = [11 11 11; 12 12 12; 13 13 13]; 
C = A*B; 

Ahat = C*pinv(B) 
Ahat = 
     2.788  3.0415  3.2949 

問題是,B是單數。所以可能有無數的解決方案。

B = magic(3) 
B = 
    8  1  6 
    3  5  7 
    4  9  2 
A = [2 3 4]; 
C = A*B 
C = 
    41 53 41 

Ahat = C*pinv(B) 
Ahat = 
      2   3   4 

Ahat = C/B 
Ahat = 
    2  3  4 

請參閱PINV和斜線都產生相同的解決方案,因爲乙是非奇異,這是很好的空調。

但是如果我們嘗試一些不太適應的東西,那麼該怎麼辦?在下一個例子中,我將使用一個並不那麼糟糕的矩陣。

>> A = [2 3 4]; 
>> B = [1 1 1;1 2 3;2 3 4.00001] 
B = 
    1    1    1 
    1    2    3 
    2    3  4.00001 

好,它有一個相當大的條件數,但這個矩陣是不是我會打電話數值單數。

cond(B) 
ans = 
      2865128.4655819 

C = A*B 
C = 
         13      20     27.00004 

現在嘗試幾種不同的解決方案。

format long g 
Ahat1 = C*pinv(B) 
Ahat1 = 
    2  3  4 

pinv做得很好。

Ahat2 = C/B 
Ahat2 = 
      2.00000000017764   3.00000000017764   3.99999999982236 

Ahat3 = C*inv(B) 
Ahat3 = 
      1.99999999953434   2.99999999953434   4.00000000046566 

斜槓和inv都不壞,雖然在這種情況下顯然更糟糕。對於這個問題,pinv解決方案似乎更穩定一些。

我們也可以在此處拋出QR分解。使用樞軸解決方案以獲得最佳穩定性。請注意,當你的系統幾乎是單數時,我們仍然會遇到問題。

[Q,R,P] = qr(B); 

你可以看到通過檢查R.最後的對角線元素的問題相比,餘數是微小的。這將導致解決方案出現問題,放大噪音。

R 
R = 
     -5.09902735824196   -2.35339392337313   -3.72620671848107 
         0   0.679365175314723   0.339681455393392 
         0       0  -2.88675134520189e-06 

的QR因素有Q * R * P」 = B.所以,我們可以在這裏解決一個屬性爲:

Ahat4 = ((C*P)/R)*Q' 
Ahat4 = 
      2.00000000076851   3.0000000007685   3.9999999992315 

請注意,我已經安排了括號是因爲儘可能高效,因爲MATLAB將使用R的屬性作爲三角矩陣來簡單地執行反求。我們不希望MATLAB將因素考慮在內。

但是,現在讓我們來看看一個由瓦希德提出:

Ahat5 = C*B'*(inv(B*B')) 
Ahat5 = 
       1.9970703125    2.998046875    4.0029296875 

然而,瓦希德提出的解決方案很糟糕。不要使用這最後一種形式。請。人們告訴你不要這樣做,或者他們應該告訴你這一點是有原因的!是的,我知道有一羣人不知道涉及的數學,並且不斷傳播它。你甚至可以在一些不知情的教科書中找到它。

關於pinv的好處是它適用於任何矩陣,單數或不是。如果存在解決方案,它會找到一個解決方案。如果解決方案是獨一無二的,它將起作用。如果解決方案不是唯一的,那麼,你期望什麼?

+0

感謝一位很多人!奇蹟般有效! – schwarz

+0

使用pinv反斜槓運算符有什麼優勢嗎? –

+0

@Andrey - 好吧,pinv在這裏可能會稍微穩定些,正如我在編輯中展示的那樣。我在答案中加入了斜槓和qr解決方案的比較。 pinv的一個優點是它永遠不會抱怨,即使在真正的奇異矩陣中。一個缺點是pinv會在較大的問題上變慢。 – 2012-09-29 18:47:51

2

可以使用反斜線操作:

% if A*C = B 
C = A\B 

我不認爲在非矩形A的情況下,解決方案是獨一無二的,雖然...

+0

我有的例子, 'A = [2 3 4]; B = [11 11 11; 12 12 12; 13 13 13]; C = A * B; %= [110]' 所以你的意思是在這種情況下找不到A. – schwarz

-1

首先通過B'繁衍A*B=C雙方(轉置B的):

A*B*B'=C*B' 

D=B*B'讓(d是方陣):

A*D=C*B' 

現在,通過inv(D)乘以上述等式的兩邊:

A*D*inv(D)=C*B'*inv(D) 

D*inv(D)=I,所以:

A=C*B'*inv(D) 
+0

謝謝Vahid!但是我得到的解決方案並不是第一次,我從A和B獲得C,並且當我反向獲得A時,我得到的A是不同的。對於這種情況,A出現[16 0 8]。 'A = [2 3 4]; B = [11 11 11; 12 12 12; 13 13 13]; C = A * B; %= [110]' – schwarz

+0

好的,我發現問題了!矩陣嚴重縮小或接近單數! – schwarz

+1

不,不,不!如果B不是正方形,則使用僞逆,如pinv。如果沒有解決方案,那麼就沒有解決方案。但是這樣做只會使任何狀況問題變得更糟。 – 2012-09-29 14:28:54

相關問題