数学建模社区-数学中国
标题:
线性方程组的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