矩阵病态该如何修改啊?
我把方程差分以后得出的系数矩阵范数是8998,严重病态。导致后来计算出的值为inf。求教各位高手该怎么办啊? 用奇异值分解(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 或者直接用
x=pinv(A)*b;也可以。 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 大小写 没有注意。 原帖由 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 文件名一致 我把函数的大小写来回改了一下,还是没用呢.
然后用最笨的方法,把我的矩阵赋值给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]