【问题标题】:preconditioner for block conjugate gradient in matlabmatlab中块共轭梯度的预处理器
【发布时间】:2016-06-22 12:18:13
【问题描述】:

我想求解一个线性方程组,AX = B,其中 A 是相对较大的稀疏正定 JxJ 矩阵。 B 是矩阵而不是维度为 JxS 的列向量。

一种方法是“调整”这个问题,以便标准 pcg 例程可以工作,例如:

design=kron(speye(S),A)
X=pcg(design,B(:));

但是,以上对我来说是不可能的,因为矩阵design 太大而无法存储,即使在利用其稀疏性之后也是如此。因此更好的解决方案是运行 pcg 而不存储矩阵design,即

afun=@(x)  reshape(A*reshape(x,J,[]),[],1);
X=pcg(afun,B(:));
X=reshape(X,J,S);

现在我的问题是:有没有办法允许对上面编写的代码使用预处理器(例如,来自 ichol 不存储任何额外的矩阵?

我这样说是因为X=pcg(afun,B(:)); 需要永远收敛,希望预处理器可以在这种情况下提供帮助。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    虽然您应该知道 pcg 确实已经使用了预调节器,但无论您是否明确给出它,如果您真的想使用 ichol 调节器,没有比明确描述的更好的选择an example in the documentation...

    使用只有一个输入参数的 ichol 来构造一个不完整的 零填充的 Cholesky 分解。

    L = ichol(A);

    [x1,fl1,rr1,it1,rv1] = pcg(A,b,1e-8,100,L,L');

    根据您的矩阵design,它在您的代码中无处可见,所以我想这解决了存储它的需要。

    【讨论】:

    • 您好安德,感谢您的回复。我可能还不够清楚。我的问题是我是否可以像最初描述的那样传递一个块对角 pcg 框架而不存储任何矩阵 L。我已经修改了我的原始帖子,希望现在它很清楚......
    • @kb87 如果系统中有另一个矩阵,您必须存储它。但是,您可以将该函数称为 pcg(A,b,1e-8,100,ichol(A),ichol(A)') ,但它会在内部存储。
    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2018-11-24
    • 2015-07-06
    相关资源
    最近更新 更多