在本站上一篇文章中探讨了在R中求解一元方程的方法,本文将进一步探讨R中求解线性方程组的方法。
设有n个未知数的m个方程的线性方程组:
可以抽象成下列的形式:
Am×n Xn×1 = bm×1
对于该方程组
有唯一解的充分必要条件是R(A) = R(A, b) = n;
有无限多解的充分必要条件是 R(A) = R(A, b) < n;
无解的充分必要条件是 R(A) < R(A, b)
即:其有解的充分必要条件是R(A) = R(A, b)
当n=m时,方程为恰定方程组,则X = A-1b;
当n
当n>m时,方程数少于未知量个数,为欠定方程组,有无穷多个解。
1、直接使用矩阵相关知识来求解
(1)恰定方程组
如求下面的方程组:
在R中的求解过程如下:
从图中可以看出该方程组的解为:x1=2,x2=3。
(2)超定方程组
如求下面方程组的解:
编写R程序如下:
A<-matrix(c(1,2,2,3,3,4),nr=3,nc=2,byrow=T)
b<-matrix(c(1,2,3),nr=3,nc=1)
x<-solve(t(A)%*%A)%*%(t(A)%*%b)
x
运行结果如下图所示:
如上图所示可知:该方程的解是x1=1,x2=0
(3)欠定方程组求解
对于欠定方程组,即方程个数少于变量个数的方程组,可以使用SVD法求解。关于SVD的介绍,大家可以参照这个网址中的介绍:
https://blog.csdn.net/youngpan1101/article/details/54574130
如求解
可以编写代码如下:
A<-matrix(c(1,2,3,2,3,4),nr=2,nc=3,byrow=T)
b<-matrix(c(1,2),nr=2,nc=1)
#对A进行SVD分解
sol.svd <- svd(A)
#获取U D V各个值
U<-sol.svd$u
D<-sol.svd$d
V<-sol.svd$v
C<-t(U)%*%b
Y<-C/D
X<-V%*%Y
X
求得的结果如下图所示:
上图求得的一个解是:x1=0.83,x2=0.33,x3=-0.17
对于R(A) = R(A, b) < n的方程组都可以使用这个方法进行求解。
再如下面的例子:
求解过程如下图所示:
2、使用solve函数来求解
对于R(A) = R(A,b) = n的方程组,可以使用R中提供的solve函数直接求解。
求解代码如下:
A<-matrix(c(2,-1,3,4,-1,1,1,3,-13),3,3,T)
b<-matrix(c(3,3,-6),3,1)
solve(A,b)
运行结果如下:
内容如有问题,请留言。本站将在今后给出一个通用的函数来解决相关问题。敬请关注。