24小时热门版块排行榜    

查看: 2327  |  回复: 50
本帖产生 1 个 数学EPI ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

xjw0413

铜虫 (初入文坛)

[交流] 【讨论】预调件共轭梯度法(PCG)已有4人参与

有限元计算经常碰到大型稀疏矩阵,由于此类线性方程组通常条件数是比较大的,方程组的性态不好,所以最好用迭代方法求解,比方说是预调件共轭梯度法,但此方法在选择预调件矩阵时似乎没有一个同一的标准,大多推荐的是采用incomplete LU decomposition做为预调件矩阵。incomplete LU decomposition的计算方法似乎又有很多种。
1. incomplete LU decomposition 的计算时间应该比 LU decomposition要快速的多吧,不然直接用LU decomposition不就解出来了吗,又何必再来PCG迭代呢?
2. 采用PCG方法的前提应该是系数矩阵对称、正定吧,因为其原理是一个相当于势函数的东西取极小值。那对于非正定的系数矩阵能求解吗,我构造了几个非正定的,有的似乎是能够收敛到正确结果的。

希望各位虫用解答和讨论。
回复此楼
The life I want, there's no short cut.
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

saladin983

铁杆木虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖
引用回帖:
29楼: Originally posted by mastergxm at 2011-11-14 14:10:22:
你讲的的二范数那个标准似乎就是:

上图中k+1与k表示第k+1次迭代和第k次迭代。
除了这个,我看到有书中讲的判断条件还有一个是:
[eimg]30/a3/905677_13 ...

关于二范数的这个,你的理解完全正确。下面这一个,实际上就是同一准则的无穷范数版本。

一般迭代法的程序实现都会设定迭代步数上限,这个是合理的。系数矩阵对称正定的线性方程组,可以证明共轭梯度法只需要最多n步(n是方程未知量个数)就能求得方程的解。既然有这样的理论结果,那么设定一个相应的迭代步数上限时很自然的。

事实上还有这样的情况,Krylov类的迭代法通常因为用于大规模问题的求解,过多的迭代步数是不可接受的,因为每一步的迭代都是巨大的计算量。举个例子,一个简单定义在三维立方体上的热方程(heat equation), 在每个维度上取10个离散点,另外时间轴上也取十个时间点,那么需要求解的线性方程就有一万个未知量,这个离散程度显然是很低的。实际的问题中,几十万几百万的未知量恐怕也只能算入门级,更何况有时候这样的问题是需要反复计算的,代价很大,所以即便理论上你可以用迭代法求解,但是需要的步数过多,运算时间超出可承受的范围,也是被认为是失败的。这个时候设定迭代步数的上限实际上的作用是告诉我们,算法失败了,而非迭代完成。还有些算法,比如GMRES,过多的迭代步数,可能会导致内存不足,这也是必须限制迭代步数的原因之一。

现在你应该可以明白,迭代步数上限并非终止准则,而是被用作观察算法是否有效收敛的一个指标。

PS: 可否告知你的专业背景和CG类方法的大致应用方向?回帖或者站内短消息……

[ Last edited by saladin983 on 2011-11-14 at 16:01 ]
30楼2011-11-14 21:59:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 51 个回答

saladin983

铁杆木虫 (正式写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
lovibond(金币+1): 鼓励交流 2011-06-18 10:34:45
1、还有改良条件数、数值稳定性的考虑
2、系数矩阵非正定的话,迭代过程中应该出现残量上升的情况,能够求解只能算是运气,个人以为实在迭代到负方向之前程序就已经终止。非正定的情况下通常用另一种Krylov子空间迭代法——GMRES求解。
2楼2010-09-06 22:58:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xjw0413

铜虫 (初入文坛)

引用回帖:
Originally posted by saladin983 at 2010-09-06 22:58:01:
1、还有改良条件数、数值稳定性的考虑
2、系数矩阵非正定的话,迭代过程中应该出现残量上升的情况,能够求解只能算是运气,个人以为实在迭代到负方向之前程序就已经终止。非正定的情况下通常用另一种Krylov子空间 ...

“个人以为实在迭代到负方向之前程序就已经终止”,你的意思是说,设定判断标准,如果残量变大就终止程序并报错吗?
我试一试你推荐的那个方法。
谢谢你了!
The life I want, there's no short cut.
3楼2010-09-07 14:04:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

saladin983

铁杆木虫 (正式写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
lovibond(金币+1): 鼓励耐心交流 2011-06-18 10:35:05
引用回帖:
Originally posted by xjw0413 at 2010-09-07 08:04:33:

“个人以为实在迭代到负方向之前程序就已经终止”,你的意思是说,设定判断标准,如果残量变大就终止程序并报错吗?
我试一试你推荐的那个方法。
谢谢你了!

在特定精度下终止程序实际上就是在一定的子空间内取得了解的近似。我的意思是你得到看似正确的解可能是因为这个子空间还没有包含任何系数矩阵的负曲率方向,这种情况下能得到满足精度要求的一个近似解似乎也很自然。一旦侦测到一个负的方向,迭代序列很可能因此发散。具体的表现是什么,还是需要比较严谨的推导。总之这种情况下用CG得到的结果是没有说服力的,这个不是改变终止准则就能修正的。
4楼2010-09-07 16:06:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见