2016-08-11 4 views
0

私はこの質問に対する完全な答えを見つけることができません。私はこれと同様の系の方程式を解こうとしています。この連立1次方程式を解くにはどうすればよいですか?

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 

どのように各国の変数について解くことができますか?私たちは、最初のマトリックス状A * x = bであなたの線形システムを表現

+0

'solve'を試しましたか? – Psidom

+0

@Psidomはい、私はそうはっきりとしているとは思わない... –

+0

例題では、係数行列を構成する2行のコードを与え、 'solve'すると正しい結果が得られます:' a = matrix( - 1、ncol = 4、nrow = 4)。 diag(a)< - 1;解く(a、c(10、3、-7、-6)) ' – Psidom

答えて

4

準備

。あなたがこれを行う方法が不明な場合は、General formsをお読みください。その後、係数行列AとRHSのベクトルb定義

## 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 

:あなたたとえば、あなたのようにそれを表現することができますほとんど常にsolve()

をしようと

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()は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因数分解が知られています非常に安定した方法です。お使いのシステムがランク5であるので、最小二乗フィッティングが行われ

x <- .lm.fit(A, b) 
x$coef 
# [1] 4.783333 -5.600000 -21.450000 -18.650000 40.866667 0.000000 
x$rank 
# [1] 5 

:私たちは、これを行うには.lm.fit()を利用することができます。第6番目の値は0に制限されたr_Venであり、方程式のどれも完全に満たされていません。 x$resiは残差を返します。つまり、b - A %*% x$betaです。


ガウスの消去

絵を完成させるために、私はガウスの消去法を言及する必要があります。理論あなたがいるかどうかを判断することができますので、これは、最善のアプローチです:ユニークな解決策がある

  1. 解決策はありません。
  2. 溶液

ならびに線形系を解くの無数があります。

小さな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は、このような場合に何をするかを理解するために、6日を除いて、最初の5式が成立している

A %*% x$beta 
#  [,1] 
#[1,] 8.7 
#[2,] 2.7 
#[3,] 37.0 
#[4,] -29.7 
#[5,] 2.7 
#[6,] 6.8 

bを比較します。したがって、optRは、最小二乗フィッティングを行う代わりに、ランク不足に対処する最後の方程式を放棄しました。

+0

あなたはあなたがマトリックスでしたことをなぜ置いたのか説明できますか? –

+0

私の例でも同じことをしているので、より理解していますか? –

+0

はい私はそれにいくつかの助けを使用することができます –

関連する問題