準備
。あなたがこれを行う方法が不明な場合は、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対角要素を満たし、失敗します。さんがあなたの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因数分解が知られています非常に安定した方法です。お使いのシステムがランク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
です。
ガウスの消去
絵を完成させるために、私はガウスの消去法を言及する必要があります。理論であなたがいるかどうかを判断することができますので、これは、最善のアプローチです:ユニークな解決策がある
- 。
- 解決策はありません。
- 溶液
ならびに線形系を解くの無数があります。
小さな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
は、最小二乗フィッティングを行う代わりに、ランク不足に対処する最後の方程式を放棄しました。
'solve'を試しましたか? – Psidom
@Psidomはい、私はそうはっきりとしているとは思わない... –
例題では、係数行列を構成する2行のコードを与え、 'solve'すると正しい結果が得られます:' a = matrix( - 1、ncol = 4、nrow = 4)。 diag(a)< - 1;解く(a、c(10、3、-7、-6)) ' – Psidom