声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3207|回复: 9

[编程技巧] 求解稀疏矩阵问题

[复制链接]
发表于 2009-9-1 20:38 | 显示全部楼层 |阅读模式

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

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

x
对于求本征值,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 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 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 编辑 ]

评分

1

查看全部评分

发表于 2009-9-2 23:00 | 显示全部楼层

回复 沙发 NewError 的帖子

可否建议LZ考量将後段以新楼重发!
还有图角会被盖住, 请注意!
 楼主| 发表于 2009-9-2 23:36 | 显示全部楼层
这是晚些做的时间对比:
所用刚度矩阵及质量矩阵均为普通矩阵,求解时间单位为s

                               
登录/注册后可看大图

由于求解问题的需要,研究低阶固有频率就可以了,测试算例中
计算中子空间迭代法有比较明显地方
        1、迭代时间近似于为eig命令的1/10,速度还是可以接受的
        2、低阶频率在精度范围内,可信度非常高,不过模态在上面已经做过计算,有略微差别

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

评分

1

查看全部评分

 楼主| 发表于 2009-9-2 23:38 | 显示全部楼层

回复 板凳 ChaChing 的帖子

谢谢ChaChing的提醒,已经更正过来
至于边角图的问题,我本来传的图片不允许外链;所用网络相册库为论坛,边角图为论坛自动添加上去的
发表于 2009-9-3 01:57 | 显示全部楼层
建议你看看Lanzos方法。这种方法在现有的商业软件中使用很多。其他更多的方法研究可以查看一些文献。

评分

1

查看全部评分

 楼主| 发表于 2009-9-3 08:34 | 显示全部楼层

回复 6楼 feifeifool 的帖子

昨晚开始看了,现在考虑着如何出代码;书上说的是Lanczos的方法的确很多有限元软件都在使用
但是条件的限制,只能使用matlab,进行计算,困难在代码的编写。
此外我尝试了对矩阵进行稀疏处理,利用子空间可以进行迭代,速度快了10倍左右。
可是昨天还是出现了问题,子空间对于矩阵规模较大的求解,虽然频率可以很好的求出,
但是模态方面就出现问题,随着矩阵规模越大,差异越明显
发表于 2010-4-7 16:11 | 显示全部楼层
ansys12(不知道以前的版本是否一样)已经不用子空间迭代法。

评分

1

查看全部评分

发表于 2013-7-14 22:13 | 显示全部楼层
NewError 发表于 2009-9-2 23:36
这是晚些做的时间对比:
所用刚度矩阵及质量矩阵均为普通矩阵,求解时间单位为s

请楼主回来分享经验啊。
发表于 2013-7-14 22:14 | 显示全部楼层
NewError 发表于 2009-9-3 08:34
昨晚开始看了,现在考虑着如何出代码;书上说的是Lanczos的方法的确很多有限元软件都在使用
但是条件的限制 ...

感觉算法很简单;但是我的结构是自由的话,怎么处理刚度矩阵?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-24 06:58 , Processed in 0.211598 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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