除了bicg之外,还可以使用哪些迭代子解算器来解决MATLAB中的牛顿方程?

时间:2012-03-08 15:17:39

标签: matlab mathematical-optimization iteration newtons-method

我试图分析牛顿方程系统的不同迭代子解算器的结果,使用Newton-Fischer重构LCP(线性互补问题)。到目前为止,我已经实现了精确求解器 - Gauss-Siedel和牛顿修正方法,该方法使用 bicg matlab 作为J * h = -p等式的子求解器(其中 J 是jacobian, 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中没有它们的功能,我不介意为它们实现代码。我意识到这更像是一个理论问题。 谢谢。

1 个答案:

答案 0 :(得分:3)

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

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

迭代求解器有时也可以基于所谓的“无矩阵”方法获得额外的效率 - 求解器实际上只需要计算矩阵向量乘积J*p,它不需要全矩阵J。有可能编写一个有效的子例程来计算J*p而不明确地形成J,但这将取决于您特定问题的详细信息。

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

希望这有帮助。