2016-08-11 19 views
0

我找不到這個問題的完整答案。我試圖解決類似的系統方程式:如何解決這個線性方程組?

r_Aus <- 8.7 + r_Fra + r_Ser + r_USA 
r_Fra <- 2.7 + r_Aus + r_Chi + r_Ser 
r_USA <- 37 + r_Chi + r_Ven + r_Aus 
r_Chi <- -29.7 + r_USA + r_Fra + r_Ven 
r_Ser <- 2.7 + r_Ven + r_Aus + r_Fra 
r_Ven <- -21.3 + r_Ser + r_USA + r_Chi 

我該如何解決每個國家的變量?

+0

你試過解決嗎? – Psidom

+0

@Psidom是的,但我不相信我正在這麼做...... –

+0

對於你給出的例子,兩行代碼構造係數矩陣,然後「解決」它給出正確的結果:a =矩陣( - 1,ncol = 4,nrow = 4); diag(a)< - 1;解決(a,c(10,3,-7,-6))' – Psidom

回答

4

準備

我們首先表達矩陣形式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對角線元素並失敗。試試你的Ab

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


高斯消元法

要完成的圖片,我不得不提到高斯消元法。 理論上這是最好的方法,因爲你可以判斷:

  1. 有一個獨特的解決方案;
  2. 有沒有解決辦法;
  3. 有解決方案

的無限數量以及求解線性系統。

有一個小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放棄了你的最後一個方程來解決等級不足,而不是做最小二乘擬合。

+0

你能解釋一下爲什麼你把你在矩陣中做的事情做好了嗎? –

+0

或者也許對我的例子做同樣的事情,所以我有一個更好的理解? –

+0

是的,我可以使用一些幫助,請 –