在这个问题中,找到了找到具有无限多个解的非平方线性系统的特定解的解决方案。这就引出了另一个问题:
如何使用R找到具有无限多个解的非平方线性系统的所有解?(有关无限解集的可能描述,请参见下文)
示例:线性系统
x+y+z=1
x-y-2z=2
等效于A X = B
:
A=matrix(c(1,1,1,1,-1,-2),2,3,T)
B=matrix(c(1,2),2,1,T)
A
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 -1 -2
B
[,1]
[1,] 1
[2,] 2
我们可以用以下方法描述无限的解决方案集:
x = 3/2 + (1/2) z
y = -1/2 + (-3/2) z
z in R
因此,R 可以这样描述一组解决方案:
> solve2(A,B)
$principal
[1] 1 2 # this means that x and y will be described
$free
[1] 3 # this means that the 3rd variable (i.e. z) is free in the set of real numbers
$P
[1] 1.5 -0.5
$Q
[1] 0.5 -1.5
这意味着可以使用以下方法创建每个解决方案:
z = 236782 # any value would be ok
solve2(A,B)$P + z * solve2(A,B)$Q # this gives x and y
关于数学:总是存在这样的分解,当线性系统有无限多个解时,这部分还可以。问题是:在 R 中有什么可以做的吗?
您可以使用 A 的广义逆求解方程。
library(MASS)
ginv(A) %*% B
# 1.2857143
# 0.1428571
#-0.4285714
A %*% ginv(A) %*% B
# 1
# 2
因此,在@Bhas的帮助下
gen_soln <- function(vec) {
G <- ginv(A)
W <- diag(3) - G %*% A
(G %*% B + W %*% vec)
}
现在,您可以通过提供长度为 3 到 "gen_soln"函数的向量来找到许多解决方案。例如
one_from_inf <- gen_soln(1:3)
one_from_inf
#[1,] 1.35714286
#[2,] -0.07142857
#[3,] -0.2857142
# Test the solution.
A %*% one_from_inf
# [,1]
#[1,] 1
#[2,] 2
# Using random number generator
A %*% gen_soln(rnorm(3))
# [,1]
#[1,] 1
#[2,] 2
的一般解决方案
A*x = b
是
x = x0 + z
其中 x0 是任何解,z 在 A 的核中
如上所述,您可以使用广义逆找到特定的解决方案 x0。您还可以使用 SVD 为 A 的内核找到一个基础:
A = U*S*V'
其中 U 和 V 是正交的,S 是对角线的,比如说,最后 k 个条目在对角线上 0(其他条目不为零)。
如果遵循 V 的最后 k 列构成了 A 核的基础,如果我们称之为 z1,..zk那么原始方程的解是
x = x0 + c1*z1 + .. ck*zk
对于任何真正的 C1..兜