R - 仅求解欠定线性方程组的可解部分

R - solving only solvable part of under-determined linear equation system

我正在寻找一种通用方法来找到未定线性方程组的确定部分的解(在 R 中),如下所示

# Let there be an A * x = b equation system
# with three coefficients A,B,C
# where only the coefficient A has a unique solution (A=2)
A <- rbind(c(0,1,1), c(1,0,0), c(0,0,0))
colnames(A) <- LETTERS[1:3]
b <- c(1,2,0)

cbind(A,b)
#      A B C b   
# [1,] 0 1 1 1 
# [2,] 1 0 0 2
# [3,] 0 0 0 0

我想求解已确定的参数 (A) 并且未收到任何未确定的部分,在这种情况下应该是

A = 2

重要的是,我正在寻找一种通用方法来确定不特定于上述示例的唯一解决方案。

我试过 QR 分解 qr.coef(qr(A),b),它只告诉我 C 没有解,但缺少 B 有 [=29= 的信息].

我也玩过单值分解svd(A),但后者结果中的分解d只是表明三个参数之一有解。

我确定我在这里遗漏了一些明显的东西——非常感谢您的帮助!

这里的问题Finding all solutions of a non-square linear system with infinitely many solutions is similar, but your problem is a little easier. You could use the SVD approach given in ,但是这个QR方法可能更好:

使用 decomp <- qr(A) 找到 A 的 QR 分解。特别看看 qr.R(decomp)。因为我们知道

qr.R(decomp) %*% x = t(qr.Q(decomp)) %*% b

由原始系统的解决方案解决,我们需要查看 qr.R(decomp) 的哪些行恰好有一个非零条目:这些将由上述等式唯一确定。但是一旦确定了这些条目,您就可以通过删除相应的列来确定其他条目(即一旦知道第一个条目,也许它可以用来解决第二个条目)。我认为这段代码可以满足您的所有需求:

A <- rbind(c(0,1,1), c(1,0,0), c(0,0,0))
colnames(A) <- LETTERS[1:3]
b <- c(1,2,0)

decomp <- qr(A)
R <- qr.R(decomp)
R
#>       A B C
#> [1,] -1 0 0
#> [2,]  0 1 1
#> [3,]  0 0 0

# Identify the rows with solutions:
unsolved <- seq_len(ncol(A))
repeat {
  solved <- unsolved[apply(R[, unsolved, drop = FALSE] != 0, 1,
                           function(row) if (sum(row) == 1) which(row) else NA)]
  if (all(is.na(solved))) break
  unsolved <- setdiff(unsolved, solved)
}
solved <- setdiff(seq_len(ncol(A)), unsolved)
colnames(A)[solved]
#> [1] "A"

# Find the solutions:
Q <- qr.Q(decomp)
Qtb <- t(Q) %*% b

solve(R[solved, solved, drop = FALSE], Qtb[solved])
#> A 
#> 2

reprex package (v0.3.0)

于 2020-11-19 创建