在this question中找到了一种解决方案,可以找到具有无限多解的非方形线性系统的特定解。这引出了另一个问题:
如何为具有无限多个解的非方形线性系统找到所有解,其中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中有什么可以做的吗?
答案 0 :(得分:1)
你可以使用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的矢量来找到许多解决方案。功能。例如,
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
答案 1 :(得分:1)
的一般解决方案
A*x = b
是
x = x0 + z
其中x0是任何解,而z在A的内核中
如上所述,您可以通过使用广义逆来找到特定解x0。您还可以使用SVD查找A:
内核的基础A = U*S*V'
其中U和V是正交的和S对角线,例如,对角线0上的最后k个条目(以及其他非零)。
如果遵循,V的最后k列构成A的核的基础,并且如果我们称这些z1,... zk那么原始方程的解 是
x = x0 + c1*z1 + .. ck*zk
任何真正的c1..ck