yingzhangning 发表于 2009-12-15 17:51

请问如何改善病态矩阵条件数(Xb=A)?

现遇到一线性方程组X*b=A!(其中b为8X8型的方阵,X和A 为1X8);
显然X= A *inv(b) or X = A/B; 运行后,matlab总显示
Warning: Matrix is close to singular or badly scaled.
         Results may be
         inaccurate.
         RCOND =
         2.041979e-017

一般的线性方程组都是针对AX = b 即左除X=A\B.如何改良此运算,使得条件数降低,运算结果准确?谢谢!!!

[ 本帖最后由 ChaChing 于 2009-12-17 11:02 编辑 ]

VibrationMaster 发表于 2009-12-15 17:54

彻底改进应该是在形成这个方程前把不独立方程去掉

yingzhangning 发表于 2009-12-15 20:50

回复 沙发 VibrationMaster 的帖子

什么是不独立方程?那啥,事情是这样的。X是一个传递函数X=A *inv(b) ,A和b的每一个元素均为空间频率和时间频率的函数。当时间频率固定,取一个空间频率,解一次X=A *inv(b) 。貌似没有所说的不独立方程。

ChaChing 发表于 2009-12-15 23:26

楼主的版本为何?

yingzhangning 发表于 2009-12-16 09:00

回复 地板 ChaChing 的帖子

更新了的matlab2008版。

VibrationMaster 发表于 2009-12-16 09:04

AX = b ==》X=inv(A)*b
看得有点混乱

yingzhangning 发表于 2009-12-16 09:27

回复 6楼 VibrationMaster 的帖子

问的是Xb=A,X=A *inv(b),如何改善改运算的条件数?:@L

VibrationMaster 发表于 2009-12-16 10:56

回复 7楼 yingzhangning 的帖子

检查b的行列式是否为0或非常接近于0。若是想办法削去不独立的行和相应的未知数

yingzhangning 发表于 2009-12-16 11:21

回复 8楼 VibrationMaster 的帖子

det(b) = 6.2883e-035.,接近0了,所以不能直接求拟啊,所以可以往Xb=A两边同右乘以D,即令b’=bD, A‘=AD,则转换成x =A' *inv(b').若bD的行列式不接近0,则改善算法可以。就是不知道这个D该怎么取。
以前成功处理过bx=A病态条件数的运算,两边同左乘以D,D为b(为方阵)的每一行绝对值最大的元素组成的对角阵。则病态明显改善。
现在这种情况,对同样的方阵b,和行向量A(为前述情况的转置)。取同样的D却不能改善其条件数。
Master说得有道理。所以只要新构造的系数矩阵b‘=bD其行列式不等于或不接近0,则求逆运算合理,条件数应该不会很高,可这种情况下这个D该如何选取呢

敢问怎么消去不独立的行和相应的未知数?可以举个例子吗。多谢

[ 本帖最后由 ChaChing 于 2009-12-17 01:37 编辑 ]

yingzhangning 发表于 2009-12-16 17:40

ok,已经搞定:@) 。还是谢谢各位!

ChaChing 发表于 2009-12-17 01:38

回复 10楼 yingzhangning 的帖子

建议与大家分享你的成果, 做个结束!

zhangjungis 发表于 2010-6-17 11:23

回复 10楼 yingzhangning 的帖子

同LS建议一样,望楼主造福众生啊~~

beyondhxf 发表于 2010-6-17 18:10

回复 10楼 yingzhangning 的帖子

不妨说出你解决的方法。人人为我,我为人人!

chenmanstein 发表于 2010-9-1 18:02

你是怎样解决改善病态矩阵条件数的?
急需!!!!

yingzhangning 发表于 2010-10-28 19:52

回复 chenmanstein 的帖子

不好意思。我的方法是,
对Ax=B,

key = max(abs(A),[],2);Di = sparse(1:2*N,1:2*N,1./key);
A = Di*A; B = Di*B;
X = A\B
页: [1] 2
查看完整版本: 请问如何改善病态矩阵条件数(Xb=A)?