2016-08-11 19 views
0

Ich kann keine vollständige Antwort auf diese Frage finden. Ich versuche, ein ähnliches System von Gleichungen zu lösen:Wie kann ich dieses lineare Gleichungssystem lösen?

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 

Wie könnte ich für jedes Land Variable lösen?

+0

Haben Sie versucht "zu lösen"? – Psidom

+0

@Psidom ja, aber ich glaube nicht, dass ich so richtig mache ... –

+0

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

Antwort

4

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:

  1. gibt es eine einzigartige Lösung;
  2. gibt es keine Lösung;
  3. 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.

+0

Können Sie erklären, warum Sie setzen, was Sie in der Matrix bitte getan haben? –

+0

Oder vielleicht das Gleiche mit meinem Beispiel, damit ich ein besseres Verständnis habe? –

+0

Ja, ich könnte helfen, bitte –

Verwandte Themen