2011-11-16 39 views
28

Giả sử tôi có các phương trình sau:Giải phương trình đồng thời với R

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

Làm thế nào để giải quyết những phương trình cho x, yz? Tôi muốn giải các phương trình này, nếu có thể, bằng cách sử dụng R hoặc bất kỳ công cụ máy tính nào khác.

+4

gợi ý: '? Giải quyết' ... –

+0

cũng vậy, tôi nghĩ" ternary "có thể không phải là cụm từ mô tả nhất. Tôi sẽ gọi đây là "một tập hợp của ba phương trình tuyến tính kết hợp" –

+1

Cùng với nhận xét của Ben, viết lại nó như là một phương trình ma trận. –

Trả lời

27

này nên làm việc

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

Nếu bạn cắm các giá trị 120, 0, -20 trở lại các phương trình, điều này là không chính xác. Nó là chính xác nếu 'byrow = TRUE'. – John

+0

@John: Đúng vậy. Tôi đã cập nhật câu trả lời. – MYaseen208

+0

Bạn có? Nó vẫn có 'byrow = FALSE' –

5

Để rõ ràng, tôi sửa đổi cách các ma trận được xây dựng trong các câu trả lời trước.

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

Trong trường hợp chúng ta cần để hiển thị các phần phân đoạn:

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 

Lưu ý rằng đây là một ma trận vuông!

+0

điều này khác với các câu trả lời được đăng trước đây như thế nào? (lưu ý rằng 'giải (A, b)' tương đương nhưng hiệu quả hơn 'giải (A)% *% b') –

0

Một cách khác là để mô hình hóa các phương trình sử dụng lm như sau:

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

trong đó sản xuất

Coefficients: 
    x  y  z 
320 -360 140 

Nếu bạn sử dụng các gói tibble bạn thậm chí có thể làm cho nó đọc giống như các phương trình ban đầu:

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

whi ch tạo ra cùng một đầu ra.

Các vấn đề liên quan