Vorbereitung
Wir ersten A * x = b
Ihr lineares System in Matrixform auszudrücken. Falls Sie nicht wissen, wie Sie dies tun können, lesen Sie weiter unter General forms. Für Ihr Beispiel können Sie ausdrücken als:
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))
Versuch solve()
Fast immer, wir denken:
## 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
dann Koeffizientenmatrix A
und RHS Vektor b
definieren über solve
zuerst. Aber solve()
basiert auf LU-Faktorisierung und erfordert eine vollständige Rangkoeffizientenmatrix A
; Wenn A
rangmangelfrei gefunden wird, trifft die LU-Faktorisierung auf ein 0-Diagonalelement und schlägt fehl. Lassen Sie uns versuchen, Ihre A
und 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
sagt Ihnen, Ihre A
nur einen Rang von 5.
Eine stabile Methode hat:
QR-Faktorisierung ist bekannt QR-Faktorisierung eine sehr stabile Methode sein. Wir können dies nutzen .lm.fit()
zu tun:
x <- .lm.fit(A, b)
x$coef
# [1] 4.783333 -5.600000 -21.450000 -18.650000 40.866667 0.000000
x$rank
# [1] 5
Ihr System ist von Rang-5, so kleinsten Quadrate durchgeführt wird. Der 6. Wert ist r_Ven
ist bei 0 eingeschränkt, und keine Ihrer Gleichungen ist genau erfüllt. x$resi
gibt Ihnen Residuen, d. H. b - A %*% x$beta
.
Gaußsche Eliminations
Um das Bild zu vervollständigen, muss ich Gaußsche Eliminations erwähnen. Theoretisch ist dies der beste Ansatz, wie Sie feststellen können, ob:
- gibt es eine einzigartige Lösung;
- gibt es keine Lösung;
- gibt es unendlich viele Lösungen
sowie das lineare System zu lösen.
Es gibt ein kleines R-Paket optR
herum, aber wie ich herausgefunden habe, macht es keinen perfekten Job.
#install.packages("optR")
library(optR)
?optR
gibt ein volles Rang lineares System als ein Beispiel, das sicher gut funktioniert (wo einfach solve(A, b)
mit funktionieren würde, auch!). Aber für Ihr System mit Rang-5, es gibt:
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
Beachten Sie die Warnmeldung, dass Ihr lineares System rangmangelhaft ist. Um zu verstehen, was optR
tut in diesem Fall vergleichen b
mit
A %*% x$beta
# [,1]
#[1,] 8.7
#[2,] 2.7
#[3,] 37.0
#[4,] -29.7
#[5,] 2.7
#[6,] 6.8
Die ersten 5 Gleichungen erfüllt sind, mit Ausnahme des sechsten. Also, optR
gab Ihre letzte Gleichung auf, um Rang-Mangel zu adressieren, anstatt die kleinste quadratische Anpassung zu tun.
Haben Sie versucht "zu lösen"? – Psidom
@Psidom ja, aber ich glaube nicht, dass ich so richtig mache ... –
Für das Beispiel geben Sie zwei Zeilen Code, um die Koeffizientenmatrix zu konstruieren und dann 'lösen' es gibt das richtige Ergebnis:' a = Matrix (- 1, ncol = 4, nrow = 4); diag (a) <-1; löse (a, c (10, 3, -7, -6)) ' – Psidom