数学建模社区-数学中国

标题: 线性方程组的Matlab解法 [打印本页]

作者: 建不了的模。    时间: 2014-9-17 13:17
标题: 线性方程组的Matlab解法
众所周知,Matlab的全称是Matrixm laboratory,当然对求解线性方程组,对Matlab来说只是小菜一碟了。但悲哀的是好多人还是不会真正使用Matlab来完成该任务,下面我们就说说吧

考虑下面给定的线性方程
A*x=b      
其中A是m*n的矩阵,也就是说有m个方程n个未知数;b为m*p的矩阵,也就是有p组b
我们做C=[A b]

由线性代数知识我们知道:
(1)rank(A)=rank(C)=r时,方程组有解
若r=n则,方程组有唯一的解
若r<n则,方程组有无穷解,可以构造出线性方程组的n-r个化零向量xi,原方程组对应的齐次方程组的解可以有xi的线性组合来表示
(2)rank(A)≠rank(C)时,则方程组无解
这是只能利用最小二乘求解,得到的解也只能使误差的函数测度|A*x-B|取值最小

好,下面我们就看看,到底如何使用Matlab实现上面的问题吧

一、rank(A)=rank(C)=r时

1.若r=n,此时方程组只有一个解,Matlab的求解命令也相对简单

直接就是如下格式x=inv(A)*b=A\b即可以解决问题


2.若r<n,此时方程有无穷解,方程组解可以用齐次和特解相加组合而成。

齐次解是由原方程组齐次方程组的n-r个化零向量xi线性组合而成,对于化零向量Matlab可以直接使用null()命令来实现,对于特解我们即可以观察,也可以用x0=A\b得到,只不过此时的x0是一个由最小二乘的得来的

我们在线性代数中解决这种问题的方法是,先对矩阵进行按行变换(或者说高斯消去),直到可以看出结果为止。其实MATLAB中也为我们准备好了这个函数,它就是rref()
>> A=magic(3),B=[1 2 3]',C=[A B],c_rref=rref(C)

A =

8 1 6
3 5 7
4 9 2


B =

1
2
3


C =

8 1 6 1
3 5 7 2
4 9 2 3


c_rref =

1.0000 0 0 0.0500
0 1.0000 0 0.3000
0 0 1.0000 0.0500

%此时我们很容易看出方程的根,x1=0.5,,x2=0.3,x3=05,到底是不是呢?我们下面验证下

>> A\B
ans =
    0.0500
    0.3000
    0.0500
复制代码
二、rank(A)≠rank(C)时

由于方程个数多于未知数个数,故此时方程组无解,这时我们一般喜欢使用最小二乘法救出,一个使误差的函数测度|A*x-B|取值最小的解,Matlab的命令也相当简单x=pinv(A)*B
>> A=round(rand(5,3)*10);B=round(rand(5,3)),C=[A B],[rank(A),rank(C)]

B =
1 1 0
0 0 0
0 1 1
1 0 0
1 0 1

C =
9 5 9 1 1 0
3 4 3 0 0 0
2 8 8 0 1 1
3 6 8 1 0 0
6 5 4 1 0 1

ans =
3 5

%说明rank(A)=3≠rank(C)=5,故无解

>> x=pinv(A)*B
x =
0.1070 -0.0101 0.0256
-0.0449 -0.0573 0.2543
0.0556 0.1256 -0.1710
复制代码


作者: 数学中国—罂粟    时间: 2014-9-17 21:45
不错啊,支持分享,希望大家都能像你一样把好资料分享出来
作者: basic_maths    时间: 2014-9-17 23:27
好!!
作者: RocksMathModeli    时间: 2014-9-18 08:46
zan!~~~~~~~~~~
作者: RocksMathModeli    时间: 2014-9-18 08:46
zan!~~~~~~~~~~
作者: fsagfefq    时间: 2014-9-24 17:08
谢谢楼主分享
作者: 建不了的模。    时间: 2014-9-24 17:20
fsagfefq 发表于 2014-9-24 17:08
谢谢楼主分享

不客气




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5