声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1878|回复: 6

[综合讨论] 矩阵病态该如何修改啊?

[复制链接]
发表于 2007-5-29 14:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

使用道具 举报

发表于 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);
[U,S,V]=svd(A);
sdiag=diag(S);
for i=1:n
    if sdiag(i)>epsilon
        x=x+U(:,i)'*b/sdiag(i)*V(:,i);
    end
end

评分

1

查看全部评分

发表于 2007-5-31 15:31 | 显示全部楼层
或者直接用
x=pinv(A)*b;  也可以。
 楼主| 发表于 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
发表于 2007-5-31 16:51 | 显示全部楼层
大小写 没有注意。
发表于 2007-5-31 20:23 | 显示全部楼层
原帖由 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;我 ...


请保证 m 文件名和函数名一致,然后调用时输入的函数名与保存的 m 文件名一致
 楼主| 发表于 2007-6-1 11:03 | 显示全部楼层
我把函数的大小写来回改了一下,还是没用呢.

然后用最笨的方法,把我的矩阵赋值给A,右边向量赋值给b,直接用下面的函数体计算:
n=length(A);
epsilon=1e-10;
x=zeros(n,1);
[U,S,V]=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 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-24 07:14 , Processed in 0.083538 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表