寻找具有无限多解的非方形线性系统的所有解法

时间:2017-10-16 08:50:27

标签: r math matrix linear-algebra

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中有什么可以做的吗?

2 个答案:

答案 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