对于R中的任何m * n矩阵A,求解同质系统Ax = 0(找到A的零空间基础)

时间:2017-04-05 06:36:56

标签: r matrix linear-algebra equations linear-equation

occurrences是R中的任何Ax = 0矩阵(不一定是正方形)时,如何解决同质系统A

m * n

这个问题似乎等同于找到# A=[-0.1 0.1]= 1x2 matrix; x=2x1 to be found; 0: 1x1 zero matrix A <- t(matrix(c(-0.1,0.1))) (不能做上标;抱歉)线性转换的内核(空格)。

1 个答案:

答案 0 :(得分:4)

  

无论如何,上述特定矩阵A的解决方案对我来说就足够了。

我们可以发现它x = (a, a),其中a是一个任意值。

经典/教科书解决方案

以下函数NullSpace使用上述理论查找A的空格。在情况1中,零空间平均为零;而在情况2到4中,返回一个矩阵,其列跨越零空间。

NullSpace <- function (A) {
  m <- dim(A)[1]; n <- dim(A)[2]
  ## QR factorization and rank detection
  QR <- base::qr.default(A)
  r <- QR$rank
  ## cases 2 to 4
  if ((r < min(m, n)) || (m < n)) {
    R <- QR$qr[1:r, , drop = FALSE]
    P <- QR$pivot
    F <- R[, (r + 1):n, drop = FALSE]
    I <- base::diag(1, n - r)
    B <- -1.0 * base::backsolve(R, F, r)
    Y <- base::rbind(B, I)
    X <- Y[base::order(P), , drop = FALSE]
    return(X)
    }
  ## case 1
  return(base::matrix(0, n, 1))
  }

使用您的示例矩阵,它会正确返回空格。

A1 <- matrix(c(-0.1, 0.1), 1, 2)
NullSpace(A1)
#     [,1]
#[1,]    1
#[2,]    1

我们也可以尝试一个随机的例子。

set.seed(0)
A2 <- matrix(runif(10), 2, 5)
#          [,1]      [,2]      [,3]      [,4]      [,5]
#[1,] 0.8966972 0.3721239 0.9082078 0.8983897 0.6607978
#[2,] 0.2655087 0.5728534 0.2016819 0.9446753 0.6291140

X <- NullSpace(A2)
#           [,1]      [,2]       [,3]
#[1,] -1.0731435 -0.393154 -0.3481344
#[2,]  0.1453199 -1.466849 -0.9368564
#[3,]  1.0000000  0.000000  0.0000000
#[4,]  0.0000000  1.000000  0.0000000
#[5,]  0.0000000  0.000000  1.0000000

## X indeed solves A2 %*% X = 0
A2 %*% X
#             [,1]          [,2]          [,3]
#[1,] 2.220446e-16 -1.110223e-16 -2.220446e-16
#[2,] 5.551115e-17 -1.110223e-16 -1.110223e-16

寻找正交基础

我的函数NullSpace返回零空间的非正交基础。另一种方法是将QR分解应用于t(A)转置A ),获得等级r,并保留{{1}的最终(n - r)列矩阵。这为null空间提供了标准正交基础

Q包中的nullspace函数是一个现有的实现。我们将上面的矩阵pracma用于演示。

A2

附录:Markdown(需要MathJax支持)的图片

library(pracma)
X2 <- nullspace(A2)
#            [,1]        [,2]       [,3]
#[1,] -0.67453687 -0.24622524 -0.2182437
#[2,]  0.27206765 -0.69479881 -0.4260258
#[3,]  0.67857488  0.07429112  0.0200459
#[4,] -0.07098962  0.62990141 -0.2457700
#[5,] -0.07399872 -0.23309397  0.8426547

## it indeed solves A2 %*% X = 0
A2 %*% X2
#             [,1]          [,2]          [,3]
#[1,] 2.567391e-16  1.942890e-16  0.000000e+00
#[2,] 6.938894e-17 -5.551115e-17 -1.110223e-16

## it has orthonormal columns
round(crossprod(X2), 15)
#     [,1] [,2] [,3]
#[1,]    1    0    0
#[2,]    0    1    0
#[3,]    0    0    1