2011-11-16 21 views
28

Supponiamo che io abbia le seguenti equazioni:risoluzione di equazioni simultanee con R

x + 2y + 3z = 20 
2x + 5y + 9z = 100 
5x + 7y + 8z = 200 

Come posso risolvere queste equazioni per x, y e z? Vorrei risolvere queste equazioni, se possibile, usando R o altri strumenti informatici.

+4

suggerimento: '? Solve' ... –

+0

Inoltre, penso che" ternario "potrebbe non essere il termine più descrittivo. Chiamerei questo "un insieme di tre equazioni lineari accoppiate" –

+1

Insieme al commento di Ben, riscrivilo come un'equazione di matrice. –

risposta

27

Questo dovrebbe funzionare

A <- matrix(data=c(1, 2, 3, 2, 5, 9, 5, 7, 8), nrow=3, ncol=3, byrow=TRUE)  
b <- matrix(data=c(20, 100, 200), nrow=3, ncol=1, byrow=FALSE) 
round(solve(A, b), 3) 

    [,1] 
[1,] 320 
[2,] -360 
[3,] 140 
+0

Se si rimettono i valori 120, 0, -20 nelle equazioni, ciò non è corretto. È corretto se 'byrow = TRUE'. – John

+0

@ John: Sì hai ragione. Ho aggiornato la risposta. – MYaseen208

+0

Hai fatto? Ha ancora 'byrow = FALSE' –

5

Per chiarezza, ho modificato il modo in cui le matrici sono stati costruiti nella risposta precedente.

a <- rbind(c(1, 2, 3), 
      c(2, 5, 9), 
      c(5, 7, 8)) 
b <- c(20, 100, 200) 
solve(a, b) 

In caso occorre visualizzare le frazioni:

library(MASS) 
fractions(solve(a, b)) 
0
A <- matrix(data=c(1, 2, 3, 2, 5, 9, 5, 7, 8),nrow=3,ncol=3,byrow=TRUE)  
b <- matrix(data=c(20, 100, 200),nrow=3,ncol=1,byrow=FALSE) 
solve(A)%*% b 

noti che questa è una matrice quadrata!

+0

come questo è sostanzialmente diverso dalle risposte precedentemente pubblicate? (nota che 'solve (A, b)' è equivalente ma più efficiente di 'solve (A)% *% b') –

0

Un altro approccio è quello di modellare le equazioni utilizzando lm come segue:

lm(b ~ . + 0, 
    data = data.frame(x = c(1, 2, 5), 
        y = c(2, 5, 7), 
        z = c(3, 9, 8), 
        b = c(20, 100, 200))) 

che produce

Coefficients: 
    x  y  z 
320 -360 140 

Se si utilizza il pacchetto tibble si può anche rendere più leggere proprio come le equazioni originali:

lm(b ~ . + 0, 
    tibble::tribble(
    ~x, ~y, ~z, ~b, 
     1, 2, 3, 20, 
     2, 5, 9, 100, 
     5, 7, 8, 200)) 

whi ch produce lo stesso risultato.

Problemi correlati