如何求解同質系統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
的內核(零空間)的(不能做標;對不起)線性變換。
如何求解同質系統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
的內核(零空間)的(不能做標;對不起)線性變換。
無論如何,上述特定矩陣
A
的解決方案對我來說就足夠了。
我們可以看到它,x = (a, a)
,其中a
是一個任意值。
對於一般的解決方案中,假設A
n * p
是。 (對不起,這是我們經常在統計使用的符號。)
你需要通過QR分解首先確定A
等級:
QR <- qr.default(A)
r <- QR$rank
R <- QR$qr
QR分解長方形系統Ax = 0
轉換爲Rx = 0
(下正交轉變)。
n >= p
,然後R
是p * p
上三角矩陣;n < p
,則R
是p * 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)])
並且唯一地解決第一個r
值x
:x[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
的列爲這樣的空間提供了基礎。任何這些列的線性組合都是一種解決方案。還要注意前一個函數的隨機性被刪除。
在線性代數過程中,(減小的)行梯形式用於找到零空間A
。 A
的等級是樞軸的數量。然而,執行高斯消元以達到梯隊形式並不容易在R中編碼,所以使用通過QR因子分解的正交方法。我也相信這在數值上更穩定。
上述方法給予了非正交基。另一種方法是將QR因子分解應用於t(A)
(是,它被轉置A),確定秩並保留正交矩陣的最終空白列。這爲解決方案空間提供了正交基礎。
儘管我們可以很容易地編寫代碼,但函數從pracma
包中執行此操作。
pracma::nullspace(A)
如果它返回NULL
,那麼就意味着該解決方案是獨特的,僅僅是零矢量。如果它返回一個矩陣,那麼它的列給出正交基。
m和n是任意的。不限制他們。無論如何,上述特定矩陣A的解決方案對我來說已經足夠了。 –
A < - 矩陣(c(-0.1,0.1),1,2)或者A <矩陣(c(-0.1,0.1),1)'(不需要't()') – jogo