我该如何解决这个线性方程组?

a.p*_*ell 0 r

我找不到这个问题的完整答案.我试图解决类似的方程系统:

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
Run Code Online (Sandbox Code Playgroud)

我怎么能解决每个国家的变量?

李哲源*_*李哲源 5

制备

我们首先以矩阵形式表达您的线性系统A * x = b.如果您不清楚如何执行此操作,请阅读常规表单.对于您的示例,您可以将其表达为:

## 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
Run Code Online (Sandbox Code Playgroud)

然后定义系数矩阵A和RHS向量b:

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))
Run Code Online (Sandbox Code Playgroud)

solve()

几乎总是,我们solve首先考虑.但是solve()基于LU分解,并且需要满秩系数矩阵A; 当A发现秩不足时,LU分解符合0对角元素并且失败.试试你的Ab:

solve(A, b)
#Error in solve.default(A, b) : 
#  Lapack routine dgesv: system is exactly singular: U[6,6] = 0
Run Code Online (Sandbox Code Playgroud)

U[0,0] = 0告诉你,你A的排名只有5.


一种稳定的方法:QR分解

已知QR分解是非常稳定的方法.我们可以利用.lm.fit()这个来做:

x <- .lm.fit(A, b)
x$coef
# [1]   4.783333  -5.600000 -21.450000 -18.650000  40.866667   0.000000
x$rank
# [1] 5
Run Code Online (Sandbox Code Playgroud)

您的系统的等级为5,因此执行最小二乘拟合.第6个值被r_Ven约束为0,并且没有一个方程式完全满足.x$resi给你残差,即b - A %*% x$beta.


高斯消除

为了完成图片,我不得不提到高斯消除.从理论上讲,这是最好的方法,因为您可以确定:

  1. 有一个独特的解决方案;
  2. 没有解决方案;
  3. 有无数的解决方案

以及解决线性系统.

optR周围有一个小R包,但正如我发现的那样,它并没有做得很完美.

#install.packages("optR")
library(optR)
Run Code Online (Sandbox Code Playgroud)

?optR给出一个完整的线性系统作为一个例子,当然工作得很好(简单地使用solve(A, b)也会起作用!).但是对于排名为5的系统,它给出了:

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
Run Code Online (Sandbox Code Playgroud)

请注意线性系统缺乏排名的警告消息.要了解optR在这种情况下呢,比较b

A %*% x$beta
#      [,1]
#[1,]   8.7
#[2,]   2.7
#[3,]  37.0
#[4,] -29.7
#[5,]   2.7
#[6,]   6.8
Run Code Online (Sandbox Code Playgroud)

除了第6个以外,满足前5个方程.因此,optR放弃了你的最后一个等式来解决秩缺陷,而不是做最小二乘拟合.