2017-04-05 63 views
2

如何求解同質系統Ax = 0,當A是R中任何m * n矩陣(不一定是正方形)求解同構系統Ax = 0對於R中的任意m * n矩陣A(找到A的零空間基)

# A=[-0.1 0.1]= 1x2 matrix; x=2x1 to be found; 0: 1x1 zero matrix 
A <- t(matrix(c(-0.1,0.1))) 

這個問題似乎是相當於找到一個Rn -> Rm的內核(零空間)的(不能做標;對不起)線性變換。

+0

m和n是任意的。不限制他們。無論如何,上述特定矩陣A的解決方案對我來說已經足夠了。 –

+0

A < - 矩陣(c(-0.1,0.1),1,2)或者A <矩陣(c(-0.1,0.1),1)'(不需要't()') – jogo

回答

2

無論如何,上述特定矩陣A的解決方案對我來說就足夠了。

我們可以看到它,x = (a, a),其中a是一個任意值。


一個一般治療

對於一般的解決方案中,假設An * p是。 (對不起,這是我們經常在統計使用的符號。)

你需要通過QR分解首先確定A等級:

QR <- qr.default(A) 
r <- QR$rank 
R <- QR$qr 

QR分解長方形系統Ax = 0轉換爲Rx = 0(下正交轉變)。

  • 如果n >= p,然後Rp * p上三角矩陣;
  • 如果n < p,則Rp * n梯形矩陣,其中左邊的p * p塊是上三角形。

現在矩陣的秩r會在

如果n >= p

  • 如果r = p,你有一個完整的軍銜制度,所以解決x是獨一無二的:只是一個載體的零。
  • 如果r < p,在NULL空間中有(p - r)自由變量(ker(A))。您需要將x中的最後一個(p - r)值設置爲某些任意值,然後更新RHS b <- -(R[1:r, -(1:r)] %*% x[-(1:r)])並且唯一地解決第一個rxx[1:r] <- backsolve(R, b, r)

如果n < p

這個系統總是在x自由變量,無論什麼r是。我們應用與上面r < p案例中相同的計算。

這是一個實現:

f <- function (A) { 
    n <- dim(A)[1] 
    p <- dim(A)[2] 
    QR <- qr.default(A) 
    R <- QR$qr 
    r <- QR$rank 
    x <- numeric(p) 
    if ((r < min(n, p)) || (n < p)) { 
    x[-(1:r)] <- runif(p - r) 
    b <- -(R[1:r, -(1:r), drop = FALSE] %*% x[-(1:r)]) 
    x[1:r] <- backsolve(R, b, r) 
    } 
    x 
    } 

需要注意的是,除非你得到零向量,解決的辦法是隨機的。您可以通過A %*% f(A)驗證正確性,但會受到四捨五入錯誤的影響。


增強

上述f功能僅給出了一個解決方案。但對於那些熟悉線性代數的人來說,空間空間A是一個向量空間,我們真的想要這樣的空間的基礎。所以這裏是一個增強。

f <- function (A) { 
    n <- dim(A)[1] 
    p <- dim(A)[2] 
    QR <- qr.default(A) 
    R <- QR$qr 
    r <- QR$rank 
    x <- numeric(p) 
    if ((r < min(n, p)) || (n < p)) { 
    x <- matrix(0, p, p - r) 
    x[-(1:r), ] <- diag(p - r) 
    b <- -(R[1:r, -(1:r), drop = FALSE]) 
    x[1:r, ] <- backsolve(R, b, r) 
    } 
    x 
    } 

現在,除非您得到一個零向量,否則解決方案不是唯一的,並且存在解決方案空間。在那種情況下,x的列爲這樣的空間提供了基礎。任何這些列的線性組合都是一種解決方案。還要注意前一個函數的隨機性被刪除。


爲什麼QR分解?

在線性代數過程中,(減小的)行梯形式用於找到零空間AA的等級是樞軸的數量。然而,執行高斯消元以達到梯隊形式並不容易在R中編碼,所以使用通過QR因子分解的正交方法。我也相信這在數值上更穩定。


如果你想要的正交基

上述方法給予了非正交基。另一種方法是將QR因子分解應用於t(A)是,它被轉置A),確定秩並保留正交矩陣的最終空白列。這爲解決方案空間提供了正交基礎

儘管我們可以很容易地編寫代碼,但函數從pracma包中執行此操作。

pracma::nullspace(A) 

如果它返回NULL,那麼就意味着該解決方案是獨特的,僅僅是零矢量。如果它返回一個矩陣,那麼它的列給出正交基。

相關問題