huangxuemei513 发表于 2007-5-29 14:52

矩阵病态该如何修改啊?

我把方程差分以后得出的系数矩阵范数是8998,严重病态。导致后来计算出的值为inf。求教各位高手该怎么办啊?

hunter_009 发表于 2007-5-30 13:22

用奇异值分解(SVD)法, matlab中有奇异值分解,利用SVD可编程如下:
function x=SVD_equation(A,b)
%用奇异值分解求解病态线性方程组
%A系数矩阵
%b右端向量
n=length(A);
epsilon=1e-10;
x=zeros(n,1);
=svd(A);
sdiag=diag(S);
for i=1:n
    if sdiag(i)>epsilon
      x=x+U(:,i)'*b/sdiag(i)*V(:,i);
    end
end

pengweicai 发表于 2007-5-31 15:31

或者直接用
x=pinv(A)*b;也可以。

huangxuemei513 发表于 2007-5-31 16:27

function x=SVD_equation(A,b)
这个函数我先把他存在另一个M文件里
然后在程序里
X1=SVD_equation(AA,Y1)直接用了。结果是
??? Capitalized internal function SVD; Caps Lock may be on.

x=pinv(A)*b;我直接用结果也是:
??? Capitalized internal function SVD; Caps Lock may be on.
什么原因啊?
:@Q

pengweicai 发表于 2007-5-31 16:51

大小写 没有注意。

eight 发表于 2007-5-31 20:23

原帖由 huangxuemei513 于 2007-5-31 16:27 发表 http://www.chinavib.com/forum/images/common/back.gif
function x=SVD_equation(A,b)
这个函数我先把他存在另一个M文件里
然后在程序里
X1=SVD_equation(AA,Y1)直接用了。结果是
??? Capitalized internal function SVD; Caps Lock may be on.

x=pinv(A)*b;我 ...

请保证 m 文件名和函数名一致,然后调用时输入的函数名与保存的 m 文件名一致

huangxuemei513 发表于 2007-6-1 11:03

我把函数的大小写来回改了一下,还是没用呢.

然后用最笨的方法,把我的矩阵赋值给A,右边向量赋值给b,直接用下面的函数体计算:
n=length(A);
epsilon=1e-10;
x=zeros(n,1);
=svd(A);
sdiag=diag(S);
for i=1:n
    if sdiag(i)>epsilon
      x=x+U(:,i)'*b/sdiag(i)*V(:,i);
    end
end

出现的情况和以前一样,在原先因为系数矩阵范数过大,导致值为inf出现的位置是一样的.:@(

用 pinv 这个函数也是一样,在原先因为系数矩阵范数过大,导致值为inf出现的位置是一样的.
:'(

[ 本帖最后由 ChaChing 于 2010-4-4 21:02 编辑 ]
页: [1]
查看完整版本: 矩阵病态该如何修改啊?