1

我正在尝试使用 LCP(线性互补问题)的 Newton-Fischer 重新表述来分析牛顿方程系统的不同迭代子求解器的结果。到目前为止,我已经实现了精确的求解器 - Gauss-Siedel,以及使用bicg matlab作为 J*h = -p 方程的子求解器的牛顿修正方法(其中J是雅可比,p是 Fischer 的值函数和h是我的实现步骤)。

我实现 bicg 子求解器和精确求解器的部分代码:

if itt
    % use iterative solver for newton eq
    while ~all(fischer(x, A*x+b) == 0) & its < max_it
        % compute the Jacobian
        J = eval_jacobian(A, b, x);
        % compute the value of the Fischer function
        p = fischer(x, A*x + b);
        % the natural merit function for convergence measure
        residual(its) = .5*(p'*p);
        % the newton eq, solve J*h = -p
        h = bicg(J, -p, eps, s_its);
        % update the solution vector 
        x = x + h;
        % increment the iteration counter
        its = its + 1;
    end
else
    % the exact solver for newton equation
    while ~all(fischer(x, A*x+b) == 0) & its < max_it
        % compute the Jacobian
        J = eval_jacobian(A, b, x);
        % compute the value of the Fischer function
        p = fischer(x, A*x + b);
        % the natural merit function for convergence measure
        residual(its) = .5*(p'*p);
        % the newton eq, solve J*h = -p
        h = - J/p;
        % update the solution vector 
        x = x + h;
        % increment the iteration counter
        its = its + 1;
    end

那么,我的问题是您会使用哪些其他迭代子求解器?如果 matlab 中没有它们的功能,我不介意为它们实现代码。我意识到这更像是一个理论问题。谢谢你。

4

1 回答 1

3

除了bicg对于一般非对称系统,还有许多其他迭代求解器有时可以提供更好的收敛性,例如bicgstabgmres。这两种方法在精神上与 相似bicg,但在 krylov 子空间内涉及不同的更新策略。MATLAB 对这两种方法都有实现,因此您可以针对您的问题对其进行测试。

通常,在使用 krylov 迭代求解器时,您通常可以通过合并预处理来获得更好的性能。这是一个相当复杂的主题——如果你还不熟悉,这里是一个很好的起点。我建议从一个简单的 jacobi 预处理器开始,diag(J)然后从那里开始。

迭代求解器有时也可以基于所谓的“无矩阵”方法获得额外的效率——求解器实际上只需要计算矩阵向量积J*p,它不需要完整的矩阵J。可以编写一个高效的子程序来计算J*p而不J显式地形成,但这将取决于您的特定问题的细节。

最后一个考虑因素是编程语言本身——MATLAB 为其直接求解器使用高度优化的库代码J\p,而 krylov 方法是作为 m 代码实现的,这通常会导致性能损失。

希望这可以帮助。

于 2012-03-08T23:16:22.490 回答