NewError 发表于 2009-9-1 20:38

求解稀疏矩阵问题

对于求本征值,eig命令不能用于稀疏矩阵的求解
eigs的说明是:Find largest eigenvalues and eigenvectors of sparse matrix
就是说只能找出稀疏矩阵最大的几个特征值和特征向量

但是我有个问题,
对于定义的zeros(普通)矩阵,再用eig命令进行求解时,耗时会很长,
对于要进行多次计算,显得不太现实;
不知道大家平常怎么求解大型特征值问题(4000*5000)
可能某些有限元求解软件可以对其求解,但是限于条件...只能运用现有的matlab

我有部分想法:1.放弃inv命令求逆,使用\进行计算。 但是此方法对于300*300的矩阵已经很吃力了
                        2.使用子空间迭代法,这个方法书上介绍过,代码还测试,晚点使用一下
大家能有其他优化的算法吗?

[ 本帖最后由 NewError 于 2009-9-1 21:09 编辑 ]

NewError 发表于 2009-9-2 12:09

暂时还没人回,我自己做了下测试,矩阵的模型不是特别大,50*50;分别用eig命令与子空间迭代法进行计算:
下面是求解第一阶模态,与第一阶频率值的比较,限于数据较多,为节省版面,就贴出一部分
                  (eig命令)               (子空间迭代)
一阶频率:   0.1588                        0.1588
一阶模态:
                     0.23775                     0.23904
                  -0.085611               -0.085295
                     0.21743                     0.21819
                  -0.079673               -0.079371
                     0.18452                     0.18473
                  -0.062821                  -0.062589
                     0.16798                      0.1675
                  -0.034443                   -0.03432
                     0.19806                      0.19668
                     0                                 2.0208e-033
                     0.24                            0.24124
                  -0.078129                   -0.077269
                     0.21919                      0.21991
                  -0.075214                   -0.074344
                     0.18356                     0.18375
                  -0.061628                   -0.060726
                     0.1603                        0.15983
                  -0.05436                     -0.053397
                     0.18779                      0.18649
                  -0.057696                   -0.056716
                     0.24104                     0.24226
                  -0.062437                   -0.061104
                     0.22072                     0.2214

用了不同的方法求解,对于一阶模态的使用,两种方法计算值相同
对于模态的计算,子空间迭代法就存在一定的精度问题了,当时设定的精度也就0.01
在误差范围内,可以认为这两个在计算低阶频率与模态时候能够很好的互换
接下来,晚点我再观测下他们求解大型矩阵的时间关系吧。 希望能有满意的结果

[ 本帖最后由 NewError 于 2009-9-2 23:36 编辑 ]

ChaChing 发表于 2009-9-2 23:00

回复 沙发 NewError 的帖子

可否建议LZ考量将後段以新楼重发!
还有图角会被盖住, 请注意!

NewError 发表于 2009-9-2 23:36

这是晚些做的时间对比:
所用刚度矩阵及质量矩阵均为普通矩阵,求解时间单位为s
http://forum.vibunion.com/UChome/attachment/200909/2/134007_1251895204uh8F.jpg
由于求解问题的需要,研究低阶固有频率就可以了,测试算例中
计算中子空间迭代法有比较明显地方
      1、迭代时间近似于为eig命令的1/10,速度还是可以接受的
      2、低阶频率在精度范围内,可信度非常高,不过模态在上面已经做过计算,有略微差别

但是,子空间迭代法还是无法应对4000以上的矩阵,计算速度每步都超过了1分钟....用eig命令计算大型矩阵真的是令人汗颜..
大家能有好的计算方式吗,对于书上说的基本上比较难实现,由于条件限制,不能使用ansys等软件。
不知道大家有做过相关的吗?

NewError 发表于 2009-9-2 23:38

回复 板凳 ChaChing 的帖子

谢谢ChaChing的提醒,已经更正过来
至于边角图的问题,我本来传的图片不允许外链;所用网络相册库为论坛,边角图为论坛自动添加上去的

feifeifool 发表于 2009-9-3 01:57

建议你看看Lanzos方法。这种方法在现有的商业软件中使用很多。其他更多的方法研究可以查看一些文献。

NewError 发表于 2009-9-3 08:34

回复 6楼 feifeifool 的帖子

昨晚开始看了,现在考虑着如何出代码;书上说的是Lanczos的方法的确很多有限元软件都在使用
但是条件的限制,只能使用matlab,进行计算,困难在代码的编写。
此外我尝试了对矩阵进行稀疏处理,利用子空间可以进行迭代,速度快了10倍左右。
可是昨天还是出现了问题,子空间对于矩阵规模较大的求解,虽然频率可以很好的求出,
但是模态方面就出现问题,随着矩阵规模越大,差异越明显

vehicle 发表于 2010-4-7 16:11

ansys12(不知道以前的版本是否一样)已经不用子空间迭代法。

mxlzhenzhu 发表于 2013-7-14 22:13

NewError 发表于 2009-9-2 23:36 static/image/common/back.gif
这是晚些做的时间对比:
所用刚度矩阵及质量矩阵均为普通矩阵,求解时间单位为s



请楼主回来分享经验啊。

mxlzhenzhu 发表于 2013-7-14 22:14

NewError 发表于 2009-9-3 08:34 static/image/common/back.gif
昨晚开始看了,现在考虑着如何出代码;书上说的是Lanczos的方法的确很多有限元软件都在使用
但是条件的限制 ...

感觉算法很简单;但是我的结构是自由的话,怎么处理刚度矩阵?
页: [1]
查看完整版本: 求解稀疏矩阵问题