使用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)
答案 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)。这应该适用于欠定和过度确定的系统。