2011-11-16 34 views
28

Supongamos que tengo las siguientes ecuaciones:resolución de ecuaciones simultáneas con R

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

¿Cómo resolver estas ecuaciones para x, y y z? Me gustaría resolver estas ecuaciones, si es posible, usando R o cualquier otra herramienta informática.

+4

pista: '? Resolver' ... –

+0

también, creo que" ternario "puede no ser el término más descriptivo. Yo llamaría a esto "un conjunto de tres ecuaciones lineales acopladas" –

+1

Junto con el comentario de Ben, vuelva a escribirlo como una ecuación matricial. –

Respuesta

27

Esto debería funcionar

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

Si conecta los valores 120, 0, -20 a las ecuaciones, esto es incorrecto. Es correcto si 'byrow = TRUE'. – John

+0

@John: sí, tienes razón. He actualizado la respuesta. – MYaseen208

+0

¿Lo hiciste? Todavía tiene 'byrow = FALSE' –

5

Para mayor claridad, he modificado la forma en que las matrices se construyeron en la respuesta anterior.

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

En caso de que necesitemos mostrar fracciones:

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 

Tenga en cuenta que esta es una matriz cuadrada!

+0

¿cómo es esto sustancialmente diferente de las respuestas publicadas anteriormente? (tenga en cuenta que 'solve (A, b)' es equivalente pero más eficiente que 'solve (A)% *% b') –

0

Otro enfoque es modelar las ecuaciones usando lm de la siguiente manera:

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

que produce

Coefficients: 
    x  y  z 
320 -360 140 

Si utiliza el paquete tibble que incluso puede hacer que lee al igual que las ecuaciones originales:

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

whi ch produce la misma salida.