準備
我們首先表達矩陣形式A * x = b
您的線性系統。如果您不清楚如何操作,請閱讀General forms。對於您來說,您可以將它表示爲:
## x = r_Aus, r_Chi, r_Fra, r_Ser, r_USA, r_Ven
r_Aus - r_Fra - r_Ser - r_USA = 8.7
- r_Aus - r_Chi + r_Fra - r_Ser = 2.7
- r_Aus - r_Chi + r_USA - r_Ven = 37
+ r_Chi - r_Fra - r_USA - r_Ven = -29.7
- r_Aus - r_Fra + r_Ser - r_Ven = 2.7
- r_Chi - r_Ser - r_USA + r_Ven = -21.3
然後定義係數矩陣A
和RHS向量b
:
A <- matrix(c(1, 0, -1, -1, -1, 0,
-1, -1, 1, -1, 0, 0,
-1, -1, 0, 0, 1, -1,
0, 1, -1, 0, -1, -1,
-1, 0, -1, 1, 0, -1,
0, -1, 0, -1, -1, 1),
nrow = 6, ncol = 6, byrow = TRUE)
b <- as.matrix(c(8.7, 2.7, 37, -29.7, 2.7, -21.3))
試圖solve()
幾乎總是,我們認爲首先約solve
。但solve()
基於LU分解,並且需要滿秩係數矩陣A
;當發現A
等級不足時,LU分解符合0對角線元素並失敗。試試你的A
和b
:
solve(A, b)
#Error in solve.default(A, b) :
# Lapack routine dgesv: system is exactly singular: U[6,6] = 0
U[0,0] = 0
告訴你,你的A
只有5.
穩定的方法的排名:QR分解
QR分解是已知的是一個非常穩定的方法。我們可以利用.lm.fit()
做到這一點:
x <- .lm.fit(A, b)
x$coef
# [1] 4.783333 -5.600000 -21.450000 -18.650000 40.866667 0.000000
x$rank
# [1] 5
您的系統是等級5,被執行以最小二乘法擬合。第6個值是r_Ven
約束爲0,並且您的方程都不是完全滿足。 x$resi
會給出殘差,即b - A %*% x$beta
。
高斯消元法
要完成的圖片,我不得不提到高斯消元法。 理論上這是最好的方法,因爲你可以判斷:
- 有一個獨特的解決方案;
- 有沒有解決辦法;
- 有解決方案
的無限數量以及求解線性系統。
有一個小R包optR
左右,但我發現,它並沒有做一個完美的工作。
#install.packages("optR")
library(optR)
給出了一個滿秩線性系統作爲工作的確精緻(這裏簡單地用solve(A, b)
也將工作!)的一個例子。但是,對於您的系統與等級5,它給出:
optR(A, b, method="gauss")
call:
optR.default(x = A, y = b, method = "gauss")
Coefficients:
[,1]
[1,] 9.466667
[2,] -24.333333
[3,] -16.766667
[4,] -4.600000
[5,] 22.133333
[6,] 0.000000
Warning messages:
1: In opt.matrix.reorder(A, tol) : Singular Matrix
2: In opt.matrix.reorder(A, tol) : Singular Matrix
請注意您的線性系統是排名不足的警告消息。要了解optR
確實在這樣的情況下,比較b
與
A %*% x$beta
# [,1]
#[1,] 8.7
#[2,] 2.7
#[3,] 37.0
#[4,] -29.7
#[5,] 2.7
#[6,] 6.8
第5個方程式被滿足,除了第6位。所以,optR
放棄了你的最後一個方程來解決等級不足,而不是做最小二乘擬合。
你試過解決嗎? – Psidom
@Psidom是的,但我不相信我正在這麼做...... –
對於你給出的例子,兩行代碼構造係數矩陣,然後「解決」它給出正確的結果:a =矩陣( - 1,ncol = 4,nrow = 4); diag(a)< - 1;解決(a,c(10,3,-7,-6))' – Psidom