Finding all solutions of a non-square linear system with infinitely many solutions

让人想犯罪 __ 提交于 2021-01-28 09:25:58

问题


In this question was found a solution to find a particular solution to a non-square linear system that has infinitely many solutions. This leads to another question:

How to find all the solutions for a non-square linear system with infinitely many solutions, with R? (see below for a possible description of the infinite set of solutions)


Example: the linear system

x+y+z=1 
x-y-2z=2

is equivalent to A X = B with:

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

We can describe the infinite set of solutions with:

x = 3/2 + (1/2) z
y = -1/2 + (-3/2) z
z in R

Thus, R could describe the set of solutions this way:

> 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

This means that every solution can be created with:

z = 236782 # any value would be ok
solve2(A,B)$P + z * solve2(A,B)$Q     # this gives x and y

About the maths: there always exist such a decomposition, when the linear system has infinitely many solutions, this part is ok. The question is: is there something to do this in R?


回答1:


You can solve equations like thse using the generalized inverse of A.

library(MASS)
ginv(A) %*% B

# 1.2857143
# 0.1428571
#-0.4285714

A %*% ginv(A) %*% B

#    1
#    2

So, with help from @Bhas

gen_soln <- function(vec) {

  G <- ginv(A)
  W <- diag(3) - G %*% A
  (G %*% B + W %*% vec)
}

You can now find many solutions by providing a vector of length 3 to `gen_soln' function. For example,

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



回答2:


The general solution to

A*x = b

is

  x = x0 + z

where x0 is any solution and z is in the kernel of A

As pointed out above you can find a particular solution x0 by using the generalised inverse. You can also use the SVD to find a basis for the kernel of A:

A = U*S*V'

where U and V are orthogonal and S diagonal, with, say, the last k entries on the diagonal 0 (and the others non-zero).

If follows that the last k columns of V form a basis for the kernel of A, and if we call these z1,..zk then the solutions of the original equation are

x = x0 + c1*z1 + .. ck*zk

for any real c1..ck



来源:https://stackoverflow.com/questions/46766343/finding-all-solutions-of-a-non-square-linear-system-with-infinitely-many-solutio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!