解决R中的欠/超定系统

时间:2014-08-12 13:10:37

标签: r linear-algebra

使用R求解方程组的一般程序是什么(与手动Gauss-Jordan / Gaussian消除相反)?

我必须首先确定系统是否已确定/不足/超定?

如果确定了系统,我只需使用

solve(t(a)%*%a)%*%t(a)%*%b

$x$

中获取$Ax = b$

如果它超定或欠定,我不太清楚该怎么做。我认为以上有时会根据排名给出答案,但解决方案并不总是唯一的。我怎样才能获得所有解决方案?我想如果没有解决方案,R会发错吗?

背景:我打算向我的随机微积分教授推荐我们在即将到来的考试中使用R(而不是繁琐的计算器/副手计算),所以我觉得只有简单的函数可以做(如求解)超过/未确定的系统,而不是lengthy programs/functions

编辑:我尝试使用solve(a,b),但我认为仍然没有给我所有解决方案。

这是一个未确定的例子(由于a不是正方形,R不能给出答案):

a=matrix(c(1,1,1,3,2,1),byrow=T,nrow=2)
a
b=matrix(c(1,2),byrow=T,nrow=2)
b
solve(a,b)

2 个答案:

答案 0 :(得分:4)

我在维基百科有关线性系统的文章中的Matrix solution部分中提供的链接显示了如何获得您想要的内容。
像这样定义矩阵A和向量b

A <- matrix(c(1,1,1,3,2,1),byrow=T,nrow=2)
A
b <- matrix(c(1,2),byrow=T,nrow=2)
b

以下代码将为您提供未确定系统的一般解决方案

library(MASS)

Ag <- ginv(A)
Ag
xb <- Ag %*% b
xb
Aw <- diag(nrow=nrow(Ag)) - Ag %*% A
Aw

您可以使用

检查这是否正确
w <- runif(3)
z <- xb + Aw %*% w
A %*% z - b

其中向量w是任意向量 您可以根据您的要求进一步简化解决方案;我把它留作练习给你。据我所知,你无法自动获得该解决方案,但也许包Ryacas可以做到。

您可以使用包MASS或包pracma获得所需内容。 例如。与MASS

library(MASS)
N <- Null(t(A))

然后解决方案是

xb + N * q

其中q是任意标量。

使用pracma

N <- null(A)  # or nullspace(A)

与解决方案的表达方式相同。

答案 1 :(得分:2)

尝试qr.solve(A,b)。这应该适用于欠定和过度确定的系统。