r语言 - 求具有无限多个解的非平方线性系统的所有解



在这个问题中,找到了找到具有无限多个解的非平方线性系统的特定解的解决方案。这就引出了另一个问题:

如何使用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..兜

相关内容

  • 没有找到相关文章

最新更新