使用R解决同步方程问题

38

假设我有以下方程:

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

如何解这些方程,求出 xyz 的值?如果有可能,我想使用 R 或其他计算机工具来解决这些方程。


同时,我认为“三元的”可能不是最能描述的术语。我会称其为“一组三个耦合线性方程”。 - Ben Bolker
1
随着本的评论,将其重写为矩阵方程。 - Brian Diggs
4个回答

33

这应该可以工作

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

如果你将值120、0、-20插入方程式中,这是不正确的。如果byrow = TRUE,则是正确的。 - John
你这样做了吗?它仍然没有 byrow = FALSE - Marcin
@MYaseen208 如果我的方程系统是超越的呢? - Plinth
解决方案是做这件事情最有效的方式吗?如果矩阵非常大怎么办?或者条件很低怎么办? - wolfsatthedoor

13

为了更加清晰明了,我修改了之前回答中矩阵构建的方式。


为清晰起见,我修改了先前答案中矩阵的构建方式。
a <- rbind(c(1, 2, 3), 
           c(2, 5, 9), 
           c(5, 7, 8))
b <- c(20, 100, 200)
solve(a, b)

如果我们需要显示分数:

library(MASS)
fractions(solve(a, b))

5

另一种方法是使用lm对方程进行建模,如下所示:

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

产生哪些内容。
Coefficients:
   x     y     z  
 320  -360   140

如果您使用tibble软件包,甚至可以让它看起来与原始等式完全相同。
lm(b ~ . + 0, 
   tibble::tribble(
     ~x, ~y, ~z,  ~b,
      1,  2,  3,  20,
      2,  5,  9, 100,
      5,  7,  8, 200))

这将产生相同的输出。


这种方法有什么好处吗?精度?计算速度? - Gimelist
我没有进行任何基准测试,但如果我要猜测的话,直接使用矩阵可能是最快的方法。然而,如果使用lm方法有助于解释我的代码目的,我会选择这种方法。这显然是一个模糊的标准;在我的情况下,如果xyz是我的分析中的变量或因子,则我可能会使用lm - banbh

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

请注意,这是一个方阵!

2
这与先前发布的答案有实质性的不同吗?(注意,solve(A,b)等效于但比solve(A) %*% b更有效率) - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接