- 在线时间
- 1084 小时
- 最后登录
- 2015-9-10
- 注册时间
- 2014-4-18
- 听众数
- 162
- 收听数
- 1
- 能力
- 10 分
- 体力
- 43976 点
- 威望
- 6 点
- 阅读权限
- 255
- 积分
- 15250
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 3471
- 主题
- 2620
- 精华
- 1
- 分享
- 0
- 好友
- 513
升级   0% TA的每日心情 | 开心 2015-3-12 15:35 |
|---|
签到天数: 207 天 [LV.7]常住居民III
 群组: 第六届国赛赛前冲刺培 群组: 国赛讨论 群组: 2014美赛讨论 群组: 2014研究生数学建模竞 群组: 数学中国试看培训视频 |
众所周知,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
复制代码
|
zan
|