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 创建
我正在寻找一种通用方法来找到未定线性方程组的确定部分的解(在 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 创建