建不了的模。 发表于 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=

由线性代数知识我们知道:
(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即可以解决问题

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

齐次解是由原方程组齐次方程组的n-r个化零向量xi线性组合而成,对于化零向量Matlab可以直接使用null()命令来实现,对于特解我们即可以观察,也可以用x0=A\b得到,只不过此时的x0是一个由最小二乘的得来的
**** Hidden Message *****
我们在线性代数中解决这种问题的方法是,先对矩阵进行按行变换(或者说高斯消去),直到可以看出结果为止。其实MATLAB中也为我们准备好了这个函数,它就是rref()
>> A=magic(3),B=',C=,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=,

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 static/image/common/back.gif
谢谢楼主分享

不客气
页: [1]
查看完整版本: 线性方程组的Matlab解法